diff options
author | Francisco Jerez <currojerez@riseup.net> | 2015-06-27 14:57:19 +0300 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2015-07-22 12:57:23 +0300 |
commit | 2478d354d0af91e3289cfaf6301fa555a52fbbc4 (patch) | |
tree | d6e14cbdb9a267ea07041af67f2769098df3a707 | |
parent | 5b5f21fc90f9490ac50f030eedff662e689c618f (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>
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) |