[Piglit] [PATCH 2/2] arb_gpu_shader5: Fix rounding instability in UBO and sampler indexing vs-nonuniform-control-flow tests.

Francisco Jerez currojerez at riseup.net
Mon Jun 29 02:52:50 PDT 2015


Fixes a rounding instability that would cause shader_runner to probe
pixels offset by one for some points close to the right edge of the
window on systems using x87 floating point arithmetic with certain
compiler versions (the test seemed to work fine when built with GCC
v5.1.0, but failed on some systems with GCC v4.9.2).

The reason for the instability was that the default window height and
width of 250 pixels was evenly divisible by all fractions used as
point coordinates, what would cause the coordinates passed to relative
rgba probes to lie precisely on the boundary between four pixels,
giving unpredictable results in presence of the slightest rounding
error.

Instead use a coprime of 10 as window size to guarantee that there's
always one fragment closer than the other three.  The 1/250 half-pixel
offset previously used in the vertex shader now becomes unnecessary
because the different fragment locations are sufficient to guarantee
consistent rasterization results.

This gets rid of the points which had one of the coordinates equal to
0 and replaces them with points close to the top and right edges
because they would have necessarily been at a half-integer distance
from the closest fragments regardless of the window size.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90993
Reported-by: Mark Janes <mark.a.janes at intel.com>
---
 .../vs-nonuniform-control-flow.shader_test         | 53 ++++++++++++----------
 .../vs-nonuniform-control-flow.shader_test         | 53 ++++++++++++----------
 2 files changed, 58 insertions(+), 48 deletions(-)

diff --git a/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test
index 1c81186..3945987 100644
--- a/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test
+++ b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test
@@ -17,6 +17,13 @@
 GLSL >= 1.50
 GL_ARB_gpu_shader5
 
+# Take a coprime of 10 as window size to guarantee that the decimal
+# fractions used below as point coordinates don't evenly divide the
+# framebuffer size, what would result in points ending up precisely
+# halfway from the centers of two fragments causing rounding
+# instability during rasterization and pixel probes.
+SIZE 251 251
+
 [vertex shader]
 #version 150
 #extension GL_ARB_gpu_shader5: require
@@ -37,9 +44,7 @@ void main()
                        v[i] = texture(s[(n + i) % 4u], vec2(0.5, 0.5)).x;
         }
 
-        gl_Position = vec4(-1 + 1.0 / 250.0 + vertex.x * 2,
-                           -1 + 1.0 / 250.0 + vertex.y * 2,
-                           0, 1);
+        gl_Position = vec4(-1 + vertex.x * 2, -1 + vertex.y * 2, 0, 1);
         color = v;
 }
 
@@ -56,54 +61,54 @@ void main()
 
 [vertex data]
 vertex/float/3
-0.0 0.0 0.0
-0.0 0.1 0.0
-0.0 0.2 0.0
-0.0 0.3 0.0
-0.0 0.4 0.0
-0.0 0.5 0.0
-0.1 0.0 0.0
 0.1 0.1 0.0
 0.1 0.2 0.0
 0.1 0.3 0.0
 0.1 0.4 0.0
 0.1 0.5 0.0
-0.2 0.0 0.0
+0.1 0.6 0.0
 0.2 0.1 0.0
 0.2 0.2 0.0
 0.2 0.3 0.0
 0.2 0.4 0.0
 0.2 0.5 0.0
-0.3 0.0 0.0
+0.2 0.6 0.0
 0.3 0.1 0.0
 0.3 0.2 0.0
 0.3 0.3 0.0
 0.3 0.4 0.0
 0.3 0.5 0.0
-0.4 0.0 0.0
+0.3 0.6 0.0
 0.4 0.1 0.0
 0.4 0.2 0.0
 0.4 0.3 0.0
 0.4 0.4 0.0
 0.4 0.5 0.0
-0.5 0.0 0.0
+0.4 0.6 0.0
 0.5 0.1 0.0
 0.5 0.2 0.0
 0.5 0.3 0.0
 0.5 0.4 0.0
 0.5 0.5 0.0
-0.6 0.0 0.0
+0.5 0.6 0.0
 0.6 0.1 0.0
 0.6 0.2 0.0
 0.6 0.3 0.0
 0.6 0.4 0.0
 0.6 0.5 0.0
-0.7 0.0 0.0
+0.6 0.6 0.0
 0.7 0.1 0.0
 0.7 0.2 0.0
 0.7 0.3 0.0
 0.7 0.4 0.0
 0.7 0.5 0.0
+0.7 0.6 0.0
+0.8 0.1 0.0
+0.8 0.2 0.0
+0.8 0.3 0.0
+0.8 0.4 0.0
+0.8 0.5 0.0
+0.8 0.6 0.0
 
 [test]
 clear color 0.2 0.2 0.2 0.2
@@ -137,35 +142,35 @@ draw arrays GL_POINTS 0 48
 # the implementation doesn't take this possibility into account.
 # Probe a bunch of pixels for good measure.
 #
-relative probe rgba (0.0, 0.1) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.2) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.4) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.1, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.1, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.3, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.3, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.5, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.5, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.7, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.7, 0.6) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.1) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.2) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.4) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.5) (0.4, 0.6, 0.8, 0.2)
diff --git a/tests/spec/arb_gpu_shader5/execution/ubo_array_indexing/vs-nonuniform-control-flow.shader_test b/tests/spec/arb_gpu_shader5/execution/ubo_array_indexing/vs-nonuniform-control-flow.shader_test
index a9d126b..153875c 100644
--- a/tests/spec/arb_gpu_shader5/execution/ubo_array_indexing/vs-nonuniform-control-flow.shader_test
+++ b/tests/spec/arb_gpu_shader5/execution/ubo_array_indexing/vs-nonuniform-control-flow.shader_test
@@ -16,6 +16,13 @@
 GLSL >= 1.50
 GL_ARB_gpu_shader5
 
+# Take a coprime of 10 as window size to guarantee that the decimal
+# fractions used below as point coordinates don't evenly divide the
+# framebuffer size, what would result in points ending up precisely
+# halfway from the centers of two fragments causing rounding
+# instability during rasterization and pixel probes.
+SIZE 251 251
+
 [vertex shader]
 #version 150
 #extension GL_ARB_gpu_shader5: require
@@ -38,9 +45,7 @@ void main()
                         v[i] = arr[(n + i) % 4u].color.x;
         }
 
-        gl_Position = vec4(-1 + 1.0 / 250.0 + vertex.x * 2,
-                           -1 + 1.0 / 250.0 + vertex.y * 2,
-                           0, 1);
+        gl_Position = vec4(-1 + vertex.x * 2, -1 + vertex.y * 2, 0, 1);
         color = v;
 }
 
@@ -57,54 +62,54 @@ void main()
 
 [vertex data]
 vertex/float/3
-0.0 0.0 0.0
-0.0 0.1 0.0
-0.0 0.2 0.0
-0.0 0.3 0.0
-0.0 0.4 0.0
-0.0 0.5 0.0
-0.1 0.0 0.0
 0.1 0.1 0.0
 0.1 0.2 0.0
 0.1 0.3 0.0
 0.1 0.4 0.0
 0.1 0.5 0.0
-0.2 0.0 0.0
+0.1 0.6 0.0
 0.2 0.1 0.0
 0.2 0.2 0.0
 0.2 0.3 0.0
 0.2 0.4 0.0
 0.2 0.5 0.0
-0.3 0.0 0.0
+0.2 0.6 0.0
 0.3 0.1 0.0
 0.3 0.2 0.0
 0.3 0.3 0.0
 0.3 0.4 0.0
 0.3 0.5 0.0
-0.4 0.0 0.0
+0.3 0.6 0.0
 0.4 0.1 0.0
 0.4 0.2 0.0
 0.4 0.3 0.0
 0.4 0.4 0.0
 0.4 0.5 0.0
-0.5 0.0 0.0
+0.4 0.6 0.0
 0.5 0.1 0.0
 0.5 0.2 0.0
 0.5 0.3 0.0
 0.5 0.4 0.0
 0.5 0.5 0.0
-0.6 0.0 0.0
+0.5 0.6 0.0
 0.6 0.1 0.0
 0.6 0.2 0.0
 0.6 0.3 0.0
 0.6 0.4 0.0
 0.6 0.5 0.0
-0.7 0.0 0.0
+0.6 0.6 0.0
 0.7 0.1 0.0
 0.7 0.2 0.0
 0.7 0.3 0.0
 0.7 0.4 0.0
 0.7 0.5 0.0
+0.7 0.6 0.0
+0.8 0.1 0.0
+0.8 0.2 0.0
+0.8 0.3 0.0
+0.8 0.4 0.0
+0.8 0.5 0.0
+0.8 0.6 0.0
 
 [test]
 clear color 0.2 0.2 0.2 0.2
@@ -126,35 +131,35 @@ draw arrays GL_POINTS 0 48
 # the implementation doesn't take this possibility into account.
 # Probe a bunch of pixels for good measure.
 #
-relative probe rgba (0.0, 0.1) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.2) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.4) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.0, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.1, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.1, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.1, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.2, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.3, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.3, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.3, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.4, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.5, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.5, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.5, 0.6) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.1) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.4) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.6, 0.5) (0.4, 0.6, 0.8, 0.2)
-relative probe rgba (0.7, 0.0) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.2) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.3) (0.4, 0.6, 0.8, 0.2)
 relative probe rgba (0.7, 0.5) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.7, 0.6) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.1) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.2) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.4) (0.4, 0.6, 0.8, 0.2)
+relative probe rgba (0.8, 0.5) (0.4, 0.6, 0.8, 0.2)
-- 
2.4.3



More information about the Piglit mailing list