Add pixels checks to bandingTest on Android +toggle GL_DITHER

Bug: b/284462263
Change-Id: I69122d1d53d03a2e75d498e77a669099a568ab3c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4628974
Commit-Queue: Roman Lavrov <romanl@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/tests/gl_tests/SixteenBppTextureTest.cpp b/src/tests/gl_tests/SixteenBppTextureTest.cpp
index 70231c5..abe29a9 100644
--- a/src/tests/gl_tests/SixteenBppTextureTest.cpp
+++ b/src/tests/gl_tests/SixteenBppTextureTest.cpp
@@ -574,10 +574,13 @@
         }
     }
 
-    void bandingTest(GLenum format, Gradient gradient);
+    void bandingTest(GLenum format, Gradient gradient, bool ditheringExpected);
+    void bandingTestWithSwitch(GLenum format, Gradient gradient);
 };
 
-void SixteenBppTextureDitheringTestES3::bandingTest(GLenum format, Gradient gradient)
+void SixteenBppTextureDitheringTestES3::bandingTest(GLenum format,
+                                                    Gradient gradient,
+                                                    bool ditheringExpected)
 {
     int w = getWindowWidth();
     int h = getWindowHeight();
@@ -636,24 +639,69 @@
     EXPECT_PIXEL_COLOR_NEAR(0, h - 1, topColor, maxError);
     EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, topRightColor, maxError);
     ASSERT_GL_NO_ERROR();
+
+    // Stricter pixel check on Android where dithering is supported by the driver or emulated.
+    if (getEGLWindow()->isFeatureEnabled(Feature::EmulateDithering) ||
+        getEGLWindow()->isFeatureEnabled(Feature::SupportsLegacyDithering))
+    {
+        uint32_t pixelCount = w * h;
+        std::vector<uint32_t> pixelData(pixelCount);
+        glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
+
+        int samePixelCount = 0;
+        for (EGLint y = 0; y < h; ++y)
+        {
+            for (EGLint x = 0; x < w; ++x)
+            {
+                EGLint srcPixel = x + y * w;
+                if (x < w - 1 && pixelData[srcPixel] == pixelData[srcPixel + 1])
+                {
+                    samePixelCount++;
+                }
+            }
+        }
+
+        double samePixelCountRatio = (1.0 * samePixelCount) / (w * h);
+        // ~0.3 (dithering) vs 0.8+ (no dithering)
+        if (ditheringExpected)
+        {
+            EXPECT_LT(samePixelCountRatio, 0.7);
+        }
+        else
+        {
+            EXPECT_GT(samePixelCountRatio, 0.7);
+        }
+    }
+}
+
+void SixteenBppTextureDitheringTestES3::bandingTestWithSwitch(GLenum format, Gradient gradient)
+{
+    // GL_DITHER defaults to enabled
+    bandingTest(GL_RGB565, Gradient::GreenBlue, true);
+
+    glDisable(GL_DITHER);
+    bandingTest(GL_RGB565, Gradient::GreenBlue, false);
+
+    glEnable(GL_DITHER);
+    bandingTest(GL_RGB565, Gradient::GreenBlue, true);
 }
 
 // Test dithering applied to RGBA4.
 TEST_P(SixteenBppTextureDitheringTestES3, RGBA4)
 {
-    bandingTest(GL_RGBA4, Gradient::RedGreen);
+    bandingTestWithSwitch(GL_RGBA4, Gradient::RedGreen);
 }
 
 // Test dithering applied to RGBA5551.
 TEST_P(SixteenBppTextureDitheringTestES3, RGBA5551)
 {
-    bandingTest(GL_RGB5_A1, Gradient::RedBlue);
+    bandingTestWithSwitch(GL_RGB5_A1, Gradient::RedBlue);
 }
 
 // Test dithering applied to RGB565.
 TEST_P(SixteenBppTextureDitheringTestES3, RGB565)
 {
-    bandingTest(GL_RGB565, Gradient::GreenBlue);
+    bandingTestWithSwitch(GL_RGB565, Gradient::GreenBlue);
 }
 
 ANGLE_INSTANTIATE_TEST_ES2(SixteenBppTextureTest);