Capture/Replay: Initialize MEC alpha test state
Fixes Street Fighter IV CE rendering issues when capturing.
Test: angle_trace_tests --gtest_filter="*street_figher_iv_ce*"
Bug: b/278606770
Change-Id: Ifb44c45b19514e4cabed1e81be99bce5706ac4d3
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4475732
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Mark Łobodziński <mark@lunarg.com>
diff --git a/src/libANGLE/Context_gles_1_0.cpp b/src/libANGLE/Context_gles_1_0.cpp
index 7ac3abb..07cb469 100644
--- a/src/libANGLE/Context_gles_1_0.cpp
+++ b/src/libANGLE/Context_gles_1_0.cpp
@@ -38,12 +38,12 @@
void Context::alphaFunc(AlphaTestFunc func, GLfloat ref)
{
- mState.gles1().setAlphaFunc(func, ref);
+ mState.gles1().setAlphaTestParameters(func, ref);
}
void Context::alphaFuncx(AlphaTestFunc func, GLfixed ref)
{
- mState.gles1().setAlphaFunc(func, ConvertFixedToFloat(ref));
+ mState.gles1().setAlphaTestParameters(func, ConvertFixedToFloat(ref));
}
void Context::clearColorx(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
diff --git a/src/libANGLE/GLES1Renderer.cpp b/src/libANGLE/GLES1Renderer.cpp
index 7c01664..3f193dd 100644
--- a/src/libANGLE/GLES1Renderer.cpp
+++ b/src/libANGLE/GLES1Renderer.cpp
@@ -228,7 +228,7 @@
lightEnables[i] = light.enabled;
}
- mShaderState.alphaTestFunc = gles1State.mAlphaTestFunc;
+ mShaderState.alphaTestFunc = gles1State.mAlphaTestParameters.func;
mShaderState.fogMode = gles1State.fogParameters().mode;
const bool hasLogicOpANGLE = context->getExtensions().logicOpANGLE;
@@ -397,7 +397,8 @@
// Alpha test
if (gles1State.isDirty(GLES1State::DIRTY_GLES1_ALPHA_TEST))
{
- setUniform1f(programObject, programState.alphaTestRefLoc, gles1State.mAlphaTestRef);
+ setUniform1f(programObject, programState.alphaTestRefLoc,
+ gles1State.mAlphaTestParameters.ref);
}
// Shading, materials, and lighting
diff --git a/src/libANGLE/GLES1State.cpp b/src/libANGLE/GLES1State.cpp
index 17ad0de..6391323 100644
--- a/src/libANGLE/GLES1State.cpp
+++ b/src/libANGLE/GLES1State.cpp
@@ -34,6 +34,13 @@
FogParameters::FogParameters() = default;
+AlphaTestParameters::AlphaTestParameters() = default;
+
+bool AlphaTestParameters::operator!=(const AlphaTestParameters &other) const
+{
+ return func != other.func || ref != other.ref;
+}
+
TextureEnvironmentParameters::TextureEnvironmentParameters() = default;
TextureEnvironmentParameters::TextureEnvironmentParameters(
@@ -75,8 +82,6 @@
mClientActiveTexture(0),
mMatrixMode(MatrixType::Modelview),
mShadeModel(ShadingModel::Smooth),
- mAlphaTestFunc(AlphaTestFunc::AlwaysPass),
- mAlphaTestRef(0.0f),
mLogicOp(LogicalOperation::Copy),
mLineSmoothHint(HintSetting::DontCare),
mPointSmoothHint(HintSetting::DontCare),
@@ -159,8 +164,8 @@
mShadeModel = ShadingModel::Smooth;
- mAlphaTestFunc = AlphaTestFunc::AlwaysPass;
- mAlphaTestRef = 0.0f;
+ mAlphaTestParameters.func = AlphaTestFunc::AlwaysPass;
+ mAlphaTestParameters.ref = 0.0f;
mLogicOp = LogicalOperation::Copy;
@@ -179,11 +184,11 @@
mDirtyBits.set();
}
-void GLES1State::setAlphaFunc(AlphaTestFunc func, GLfloat ref)
+void GLES1State::setAlphaTestParameters(AlphaTestFunc func, GLfloat ref)
{
setDirty(DIRTY_GLES1_ALPHA_TEST);
- mAlphaTestFunc = func;
- mAlphaTestRef = ref;
+ mAlphaTestParameters.func = func;
+ mAlphaTestParameters.ref = ref;
}
void GLES1State::setClientTextureUnit(unsigned int unit)
@@ -534,6 +539,11 @@
return mPointParameters;
}
+const AlphaTestParameters &GLES1State::getAlphaTestParameters() const
+{
+ return mAlphaTestParameters;
+}
+
AttributesMask GLES1State::getVertexArraysAttributeMask() const
{
AttributesMask attribsMask;
diff --git a/src/libANGLE/GLES1State.h b/src/libANGLE/GLES1State.h
index e9c108b..e5e8362 100644
--- a/src/libANGLE/GLES1State.h
+++ b/src/libANGLE/GLES1State.h
@@ -84,6 +84,15 @@
ColorF color;
};
+struct AlphaTestParameters
+{
+ AlphaTestParameters();
+ bool operator!=(const AlphaTestParameters &other) const;
+
+ AlphaTestFunc func = AlphaTestFunc::AlwaysPass;
+ GLfloat ref = 0.0f;
+};
+
struct TextureEnvironmentParameters
{
TextureEnvironmentParameters();
@@ -163,7 +172,9 @@
void initialize(const Context *context, const State *state);
- void setAlphaFunc(AlphaTestFunc func, GLfloat ref);
+ void setAlphaTestParameters(AlphaTestFunc func, GLfloat ref);
+ const AlphaTestParameters &getAlphaTestParameters() const;
+
void setClientTextureUnit(unsigned int unit);
unsigned int getClientTextureUnit() const;
@@ -332,8 +343,7 @@
PointParameters mPointParameters;
// Table 6.16
- AlphaTestFunc mAlphaTestFunc;
- GLfloat mAlphaTestRef;
+ AlphaTestParameters mAlphaTestParameters;
LogicalOperation mLogicOp;
// Table 6.7
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 19ce708..396d83b 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -2638,7 +2638,7 @@
params[0] = static_cast<GLfloat>(mCoverageModulation);
break;
case GL_ALPHA_TEST_REF:
- *params = mGLES1State.mAlphaTestRef;
+ *params = mGLES1State.mAlphaTestParameters.ref;
break;
case GL_CURRENT_COLOR:
{
@@ -3118,7 +3118,7 @@
*params = mBoundBuffers[BufferBinding::DispatchIndirect].id().value;
break;
case GL_ALPHA_TEST_FUNC:
- *params = ToGLenum(mGLES1State.mAlphaTestFunc);
+ *params = ToGLenum(mGLES1State.mAlphaTestParameters.func);
break;
case GL_CLIENT_ACTIVE_TEXTURE:
*params = mGLES1State.mClientActiveTexture + GL_TEXTURE0;
diff --git a/src/libANGLE/capture/FrameCapture.cpp b/src/libANGLE/capture/FrameCapture.cpp
index 7ce27d2..eb357b0 100644
--- a/src/libANGLE/capture/FrameCapture.cpp
+++ b/src/libANGLE/capture/FrameCapture.cpp
@@ -5028,6 +5028,26 @@
{
cap(CaptureMatrixMode(replayState, true, currentMatrixMode));
}
+
+ // Alpha Test state
+ const bool currentAlphaTestState = apiState.getEnableFeature(GL_ALPHA_TEST);
+ const bool defaultAlphaTestState = replayState.getEnableFeature(GL_ALPHA_TEST);
+
+ if (currentAlphaTestState != defaultAlphaTestState)
+ {
+ capCap(GL_ALPHA_TEST, currentAlphaTestState);
+ }
+
+ const gl::AlphaTestParameters currentAlphaTestParameters =
+ apiState.gles1().getAlphaTestParameters();
+ const gl::AlphaTestParameters defaultAlphaTestParameters =
+ replayState.gles1().getAlphaTestParameters();
+
+ if (currentAlphaTestParameters != defaultAlphaTestParameters)
+ {
+ cap(CaptureAlphaFunc(replayState, true, currentAlphaTestParameters.func,
+ currentAlphaTestParameters.ref));
+ }
}
// Rasterizer state. Missing ES 3.x features.