Tested-by: Mark Janes <[email protected]> Francisco Jerez <[email protected]> writes:
> 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 <[email protected]> > --- > .../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 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
