[Piglit] [PATCH] draw-vertices-2101010: Accept either SNORM conversion formula.

Kenneth Graunke kenneth at whitecape.org
Tue Dec 26 06:55:24 UTC 2017


OpenGL defines two equations for converting from signed-normalized
to floating point data.  These are:

    f = (2c + 1)/(2^b - 1)                (equation 2.2)
    f = max{c/2^(b-1) - 1), -1.0}         (equation 2.3)

ARB_vertex_type_2_10_10_10_rev specifies equation 2.2 is to be used.

However, OpenGL 4.2 switched to use equation 2.3 in all scenarios.
This matched an earlier OpenGL ES 3.0 decision to only have one formula,
as well as a DirectX decision to change to equation 2.3.  Some hardware
also only supports equation 2.3.  So, basically no one can rely on
equation 2.2 happening, and some people do rely on 2.3.

This patch continues to require equation 2.3 for GL 4.2+, but relaxes
the test to allow either behavior for earlier GL versions.

See the following discussion for more details:
https://lists.freedesktop.org/archives/mesa-dev/2013-August/042680.html

This makes this test pass on i965 with Haswell and later.
---
 .../draw-vertices-2101010.c                        | 48 ++++++++++++++--------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/tests/spec/arb_vertex_type_2_10_10_10_rev/draw-vertices-2101010.c b/tests/spec/arb_vertex_type_2_10_10_10_rev/draw-vertices-2101010.c
index 661fa9ca2..5ce4c0655 100644
--- a/tests/spec/arb_vertex_type_2_10_10_10_rev/draw-vertices-2101010.c
+++ b/tests/spec/arb_vertex_type_2_10_10_10_rev/draw-vertices-2101010.c
@@ -187,20 +187,28 @@ static void test_int_vertices_abi(float x1, float y1, float x2, float y2, int in
 struct test {
     void (*test)(float x1, float y1, float x2, float y2, int index);
     int index;
-    float expected_color[4];
+    float expected_color_equation_22[4];
+    float expected_color_equation_23[4];
     const char *name;
 };
 
 struct test tests[] = {
-    {test_packed_int_vertices, 0, {1, 1, 1, 1}, "Int vertices - 2/10/10/10"},
-    {test_packed_int_vertices, 1, {1, 1, 1, 1}, "Unsigned Int vertices - 2/10/10/10"},
-    {test_packed_int_color_vertices, 0, {1, 0, 0, 0.333}, "Int Color - 2/10/10/10"},
-    {test_packed_int_color_vertices, 1, {1, 0, 0, 0}, "Unsigned Int Color - 2/10/10/10"},
-    {test_packed_int_color_vertices, 2, {0, 0, 1, 0.333}, "Int BGRA Color - 2/10/10/10"},
-    {test_packed_int_color_vertices, 3, {0, 0, 1, 0}, "Unsigned Int BGRA Color - 2/10/10/10"},
-
-    {test_int_vertices_abi, 0, {1, 0, 0, 1}, "Int 2/10/10/10 - test ABI" },
-    {test_int_vertices_abi, 1, {1, 0, 0, 1}, "Unsigned 2/10/10/10 - test ABI" },
+    {test_packed_int_vertices, 0, {1, 1, 1, 1}, {1, 1, 1, 1},
+     "Int vertices - 2/10/10/10"},
+    {test_packed_int_vertices, 1, {1, 1, 1, 1}, {1, 1, 1, 1},
+     "Unsigned Int vertices - 2/10/10/10"},
+    {test_packed_int_color_vertices, 0, {1, 0, 0, 0.333}, {1, 0, 0, 0},
+     "Int Color - 2/10/10/10"},
+    {test_packed_int_color_vertices, 1, {1, 0, 0, 0}, {1, 0, 0, 0},
+     "Unsigned Int Color - 2/10/10/10"},
+    {test_packed_int_color_vertices, 2, {0, 0, 1, 0.333}, {0, 0, 1, 0},
+     "Int BGRA Color - 2/10/10/10"},
+    {test_packed_int_color_vertices, 3, {0, 0, 1, 0}, {0, 0, 1, 0},
+     "Unsigned Int BGRA Color - 2/10/10/10"},
+    {test_int_vertices_abi, 0, {1, 0, 0, 1}, {1, 0, 0, 1},
+     "Int 2/10/10/10 - test ABI" },
+    {test_int_vertices_abi, 1, {1, 0, 0, 1}, {1, 0, 0, 1},
+     "Unsigned 2/10/10/10 - test ABI" },
     {0}
 };
 
@@ -213,7 +221,7 @@ piglit_display(void)
     /* To know what this is all about, see:
      * http://lists.freedesktop.org/archives/mesa-dev/2013-August/042680.html
      */
-    GLboolean snorm_equation_23 = piglit_get_gl_version() >= 42;
+    bool require_snorm_equation_23 = piglit_get_gl_version() >= 42;
 
     glClear(GL_COLOR_BUFFER_BIT);
     glEnableClientState(GL_VERTEX_ARRAY);
@@ -222,14 +230,22 @@ piglit_display(void)
     for (i = 0; tests[i].test; i++) {
         glBindBuffer(GL_ARRAY_BUFFER, 0);
 
-	if (snorm_equation_23 && fabs(tests[i].expected_color[3] - 0.333) < 0.0001)
-	    tests[i].expected_color[3] = 0;
-
-        printf("%s\n", tests[i].name);
         tests[i].test(x, y, x+20, y+20, tests[i].index);
         if (!piglit_check_gl_error(GL_NO_ERROR))
 		piglit_report_result(PIGLIT_FAIL);
-        pass = piglit_probe_pixel_rgba(x+5, y+5, tests[i].expected_color) && pass;
+
+        printf("%s\n", tests[i].name);
+
+        if (require_snorm_equation_23) {
+            pass = piglit_probe_pixel_rgba(x+5, y+5, tests[i].expected_color_equation_23) && pass;
+        } else {
+            bool equation_22_pass = piglit_probe_pixel_rgba(x+5, y+5, tests[i].expected_color_equation_22);
+            bool equation_23_pass = piglit_probe_pixel_rgba(x+5, y+5, tests[i].expected_color_equation_23);
+            if (!equation_22_pass && equation_23_pass) {
+                printf("warning: driver uses GL 4.2+ rules for signed normalized to float conversions\n");
+            }
+            pass = (equation_22_pass || equation_23_pass) && pass;
+        }
 
         x += 20;
         if (x > 300) {
-- 
2.15.1



More information about the Piglit mailing list