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.