summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2015-06-27 14:57:19 +0300
committerFrancisco Jerez <currojerez@riseup.net>2015-07-22 12:57:23 +0300
commit2478d354d0af91e3289cfaf6301fa555a52fbbc4 (patch)
treed6e14cbdb9a267ea07041af67f2769098df3a707
parent5b5f21fc90f9490ac50f030eedff662e689c618f (diff)
arb_gpu_shader5: Fix rounding instability in UBO and sampler indexing vs-nonuniform-control-flow tests.
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@intel.com> Tested-by: Mark Janes <mark.a.janes@intel.com>
-rw-r--r--tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-nonuniform-control-flow.shader_test53
-rw-r--r--tests/spec/arb_gpu_shader5/execution/ubo_array_indexing/vs-nonuniform-control-flow.shader_test53
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 1c8118630..394598768 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 a9d126bf7..153875c00 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)