This is: Reviewed-by: Andres Gomez <ago...@igalia.com>
On Tue, 2019-03-19 at 14:29 +1100, Timothy Arceri wrote: > This test for a crash in Mesa seen in an Assasins Creed Odyssey shader. > --- > ...riable-iteration-limit-unroll4.shader_test | 88 +++++++++++++++++++ > 1 file changed, 88 insertions(+) > create mode 100644 > tests/spec/glsl-1.10/execution/vs-loop-variable-iteration-limit-unroll4.shader_test > > diff --git > a/tests/spec/glsl-1.10/execution/vs-loop-variable-iteration-limit-unroll4.shader_test > > b/tests/spec/glsl-1.10/execution/vs-loop-variable-iteration-limit-unroll4.shader_test > new file mode 100644 > index 000000000..38fdda4ca > --- /dev/null > +++ > b/tests/spec/glsl-1.10/execution/vs-loop-variable-iteration-limit-unroll4.shader_test > @@ -0,0 +1,88 @@ > +# This tests unrolling of a loop with a single exit point but where the > +# exact trip count is unknown, only the max iteration count (4) is known. > +# > +# Here we test all possible outcomes for the loop and also add some > +# unreachable code to make sure it is not accessible after unrolling. > +[require] > +GLSL >= 1.10 > + > +[vertex shader] > +uniform int loop_count; > +uniform int loop_count2; > + > +void main() > +{ > + gl_Position = gl_Vertex; > + > + vec4 colour = vec4(1.0, 1.0, 1.0, 1.0); > + > + int i = 0; > + int j = 0; > + int x = 0; > + > + /* Here we add a second && and put the known limit i < 4 in parentheses in > + * order to trigger a Mesa bug seen in a Assasins Creed Odyssey shader > + */ > + while (x < loop_count && (i < 4 && j < loop_count2)) { > + if (x == 0 && i == 0) > + colour = vec4(0.0, 0.25, 0.0, 1.0); > + > + if (x == 2 && i == 1 && j == 4) > + colour = vec4(0.0, 0.5, 0.0, 1.0); > + > + if (x == 4 && i == 2 && j == 8) > + colour = vec4(0.0, 0.75, 0.0, 1.0); > + > + if (x == 6 && i == 3 && j == 12) > + colour = vec4(0.0, 1.0, 0.0, 1.0); > + > + /* This should be unreachable */ > + if (x >= 8 || i >= 4) > + colour = vec4(1.0, 0.0, 0.0, 1.0); > + > + i++; > + x+=2; > + j+=4; > + } > + > + gl_FrontColor = colour; > +} > + > +[fragment shader] > +void main() > +{ > + gl_FragColor = gl_Color; > +} > + > +[test] > +clear color 0.5 0.5 0.5 0.5 > + > +uniform int loop_count 0 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 1.0 1.0 1.0 1.0 > + > +uniform int loop_count 2 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 0.0 0.25 0.0 1.0 > + > +uniform int loop_count 4 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 0.0 0.5 0.0 1.0 > + > +uniform int loop_count 6 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 0.0 0.75 0.0 1.0 > + > +uniform int loop_count 8 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 0.0 1.0 0.0 1.0 > + > +uniform int loop_count 10 > +uniform int loop_count2 16 > +draw rect -1 -1 2 2 > +probe all rgba 0.0 1.0 0.0 1.0 -- Br, Andres _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit