[go: up one dir, main page]

tests: Fix ShadingRateEXTTest.FragmentShadingRatePrimitive

The test ShadingRateEXTTest.FragmentShadingRatePrimitive has several
errors:

1. The uniform 'u_color' is not set to any value.
2. The test incorrectly assumes GL_SHADING_RATE_1X1_PIXELS_EXT results
   in the GLSL built-in 'gl_ShadingRateEXT' having a non-zero value.
3. The test attempts to validate the GL_SHADING_RATE_2X2_PIXELS_EXT
   behavior, but never calls glShadingRateEXT() with this value.
4. kSimplePrimitiveShadingRateGS needs to set gl_PrimitiveShadingRateEXT
   each iteration of the loop, rather than just once, due to the
   EmitVertex() call which resets all output variables to undefined
   values.

Once these issues are fixed, the test passes.

Bug: b/450024489
Bug: angleproject:444980424
Test: ShadingRateEXTTest.FragmentShadingRatePrimitive
Change-Id: If3b9379d4aac97bb106cc0b04550068cd0783a94
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7027991
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Tim Van Patten <timvp@google.com>
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt
index c0cc02d..1e95a59 100644
--- a/src/tests/angle_end2end_tests_expectations.txt
+++ b/src/tests/angle_end2end_tests_expectations.txt
@@ -147,7 +147,6 @@
 410591534 WIN INTEL OPENGL : TextureCubeTestES3.IncompatibleCubeFacesThenSingleFaceCompatibleUploadAndIncompatibleAgain*/* = SKIP
 411157348 WIN D3D11 : ImageTestES31.UseSourceTextureAsStorageImage/* = SKIP
 409821658 WIN INTEL OPENGL : SRGBTextureTestES3.SRGBSkipEncodeAndDecodeInGenerateMipmap/ES3_OpenGL* = SKIP
-444980424 NVIDIA VULKAN : ShadingRateEXTTest.FragmentShadingRatePrimitive/* = SKIP
 447556589 WIN INTEL OPENGL : GeometryShaderTest.ImplicitSizedArrayMatchesExplicitSizedArray/* = SKIP
 447556589 WIN INTEL OPENGL : GeometryShaderTest.ImplicitSizedArrayMatchesExplicitSizedArray2/* = SKIP
 
@@ -1687,7 +1686,6 @@
 410630704 SAMSUNG GALAXYS24EXYNOS : PixelLocalStorageValidationTest.ModifyTextureDuringPLS/* = SKIP
 410630704 SAMSUNG GALAXYS24EXYNOS : PixelLocalStorageValidationTest.PLSActive_bans_blend_equation_advanced/* = SKIP
 410630704 SAMSUNG GALAXYS24EXYNOS : PixelLocalStorageValidationTest.PLSActive_bans_blend_func_extended/* = SKIP
-410630704 SAMSUNG GALAXYS24EXYNOS VULKAN : ShadingRateEXTTest.FragmentShadingRatePrimitive/* = SKIP
 
 
 // Snapdragon 8 Gen3 Mobile Reference Device
diff --git a/src/tests/gl_tests/ShadingRateEXTTest.cpp b/src/tests/gl_tests/ShadingRateEXTTest.cpp
index 604793b..fa035b6 100644
--- a/src/tests/gl_tests/ShadingRateEXTTest.cpp
+++ b/src/tests/gl_tests/ShadingRateEXTTest.cpp
@@ -54,9 +54,9 @@
 layout (triangle_strip, max_vertices = 3) out;
 void main()
 {
-    gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
     for (int i = 0; i < 3; i++)
     {
+        gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
         gl_Position = gl_in[i].gl_Position;
         EmitVertex();
     }
@@ -73,10 +73,12 @@
     // Emit red color if ShadingRateEXT == gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT
     if (gl_ShadingRateEXT == 5) {
         fragColor = vec4(1.0, 0.0, 0.0, 1.0); // red
-    } else if (gl_ShadingRateEXT == 0) {
+    }
+    // ShadingRateEXT == 0 indicates 1x1 shading rate
+    else if (gl_ShadingRateEXT == 0) {
         fragColor = u_color;
-    }else {
-        fragColor = vec4(0.0, 1.0, 0.0, 1.0);
+    } else {
+        fragColor = vec4(0.0, 1.0, 0.0, 1.0); // green
     }
 })";
 
@@ -184,11 +186,16 @@
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_fragment_shading_rate_primitive"));
     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
 
-    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+    // Yellow
+    glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
     glClear(GL_COLOR_BUFFER_BIT);
 
     ANGLE_GL_PROGRAM(drawShadingRateProgram, kSimpleShadingRateVS, kSimpleShadingRateFS);
     glUseProgram(drawShadingRateProgram);
+    GLint colorLoc = glGetUniformLocation(drawShadingRateProgram, "u_color");
+    ASSERT_NE(colorLoc, -1);
+    glUniform4f(colorLoc, 0, 0, 1, 1);  // blue
+
     // Set 1x1 shading rate and KEEP combinerOps.
     glShadingRateEXT(GL_SHADING_RATE_1X1_PIXELS_EXT);
     glShadingRateCombinerOpsEXT(GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT,
@@ -196,13 +203,19 @@
     // Verify draw call with 1x1 shading rate.
     drawQuad(drawShadingRateProgram, essl1_shaders::PositionAttrib(), 0.5f);
     ASSERT_GL_NO_ERROR();
-    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+    // GL_SHADING_RATE_1X1_PIXELS_EXT -> gl_ShadingRateEXT = 0
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
 
     // Compile PrimitiveShadingRateVS + FS and use this program
     ANGLE_GL_PROGRAM(primitiveShadingRateVSProgram, kSimplePrimitiveShadingRateVS,
                      kSimpleShadingRateFS);
     glUseProgram(primitiveShadingRateVSProgram);
-    // Set REPLACE combinerOp0.
+    colorLoc = glGetUniformLocation(primitiveShadingRateVSProgram, "u_color");
+    ASSERT_NE(colorLoc, -1);
+    glUniform4f(colorLoc, 0, 0, 1, 1);  // blue
+
+    // Set 2x2 shading rate and REPLACE combinerOps.
+    glShadingRateEXT(GL_SHADING_RATE_2X2_PIXELS_EXT);
     glShadingRateCombinerOpsEXT(GL_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_EXT,
                                 GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT);
     // Verify draw call with 2x2 primitive shading rate.
@@ -215,6 +228,9 @@
     ANGLE_GL_PROGRAM_WITH_GS(primitiveShadingRateGSProgram, kSimpleShadingRateVS,
                              kSimplePrimitiveShadingRateGS, kSimpleShadingRateFS);
     glUseProgram(primitiveShadingRateGSProgram);
+    colorLoc = glGetUniformLocation(primitiveShadingRateGSProgram, "u_color");
+    ASSERT_NE(colorLoc, -1);
+    glUniform4f(colorLoc, 0, 0, 1, 1);  // blue
 
     // Verify draw call with 2x2 primitive shading rate with GS.
     drawQuad(primitiveShadingRateGSProgram, essl1_shaders::PositionAttrib(), 0.5f);
@@ -227,7 +243,7 @@
                                 GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT);
     drawQuad(drawShadingRateProgram, essl1_shaders::PositionAttrib(), 0.5f);
     ASSERT_GL_NO_ERROR();
-    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
 }
 
 // The negative test of EXT_fragment_shading_rate