[Piglit] [PATCH 1/2] Test that "continue" works properly inside a do-while loop.
Paul Berry
stereotype441 at gmail.com
Sat Feb 1 07:40:26 PST 2014
On 1 February 2014 01:24, Pohjolainen, Topi <topi.pohjolainen at intel.com>wrote:
> On Fri, Jan 31, 2014 at 01:12:09PM -0800, Paul Berry wrote:
> > ---
> > .../glsl-fs-continue-inside-do-while.shader_test | 51
> +++++++++++++++++++++
> > .../glsl-vs-continue-inside-do-while.shader_test | 52
> ++++++++++++++++++++++
> > 2 files changed, 103 insertions(+)
> > create mode 100644
> tests/shaders/glsl-fs-continue-inside-do-while.shader_test
> > create mode 100644
> tests/shaders/glsl-vs-continue-inside-do-while.shader_test
> >
> > diff --git a/tests/shaders/glsl-fs-continue-inside-do-while.shader_test
> b/tests/shaders/glsl-fs-continue-inside-do-while.shader_test
> > new file mode 100644
> > index 0000000..9f5e491
> > --- /dev/null
> > +++ b/tests/shaders/glsl-fs-continue-inside-do-while.shader_test
> > @@ -0,0 +1,51 @@
> > +# From the GLSL 4.40 spec, section 6.4 (Jumps):
> > +#
> > +# The continue jump is used only in loops. It skips the remainder
> > +# of the body of the inner most loop of which it is inside. For
> > +# while and do-while loops, this jump is to the next evaluation of
> > +# the loop condition-expression from which the loop continues as
> > +# previously defined.
> > +#
> > +# As of 1/31/2014 (commit db8b6fb), Mesa handles "continue" inside a
> > +# do-while loop incorrectly; instead of jumping to the loop
> > +# condition-expression, it jumps to the top of the loop. This is
> > +# particularly problematic because it can lead to infinite loops.
> > +#
> > +# This test verifies correct behaviour of "continue" inside do-while
> > +# loops without risking an infinite loop.
> > +
> > +[require]
> > +GLSL >= 1.10
> > +
> > +[vertex shader]
> > +void main()
> > +{
> > + gl_Position = gl_Vertex;
> > +}
> > +
> > +[fragment shader]
> > +void main()
> > +{
> > + int x = 0;
> > + int y = 0;
> > + do { // 1st iteration 2nd iteration 3rd iteration
> > + ++x; // x <- 1 x <- 2 x <- 3
> > + if (x >= 4) // false false false
> > + break;
>
> This guarding is for the infinite looping case of the broken mesa to
> terminate
> after finite amount of iterations, right? Without this extra check the
> following
> continue would always jump to the top of the loop (as you explained)
> causing the
> final guarding "while (x < 3)" to be infinitely skipped.
> If this is the case, would it make sense to add a small comment for the
> future
> when the problem in mesa not present anymore and somebody might wonder why
> the
> extra guarding is needed?
>
I already have a comment hinting at this ("This test verifies correct
behaviour of 'continue' inside do-while loops without risking an infinite
loop"). I'll expand the comment so that it's clearer.
>
> Still need to add that this is one the best documented tests that I've
> seen.
> Thanks Paul, makes really nice reading!
>
Thanks! Can I consider that a "Reviewed-by"?
>
> > + if (x >= 2) // false true true
> > + continue;
> > + ++y; // y=1 skipped skipped
> > + } while (x < 3); // true true false
> > +
> > + // The "continue" should skip ++y on all iterations but the first,
> > + // so y should now be 1. The "continue" should not skip (x < 3)
> > + // ever, so the loop should terminate when x == 3 (not 4).
> > + if (x == 3 && y == 1)
> > + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
> > + else
> > + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> > +}
> > +
> > +[test]
> > +draw rect -1 -1 2 2
> > +probe all rgba 0.0 1.0 0.0 1.0
> > diff --git a/tests/shaders/glsl-vs-continue-inside-do-while.shader_test
> b/tests/shaders/glsl-vs-continue-inside-do-while.shader_test
> > new file mode 100644
> > index 0000000..aa6d3e6
> > --- /dev/null
> > +++ b/tests/shaders/glsl-vs-continue-inside-do-while.shader_test
> > @@ -0,0 +1,52 @@
> > +# From the GLSL 4.40 spec, section 6.4 (Jumps):
> > +#
> > +# The continue jump is used only in loops. It skips the remainder
> > +# of the body of the inner most loop of which it is inside. For
> > +# while and do-while loops, this jump is to the next evaluation of
> > +# the loop condition-expression from which the loop continues as
> > +# previously defined.
> > +#
> > +# As of 1/31/2014 (commit db8b6fb), Mesa handles "continue" inside a
> > +# do-while loop incorrectly; instead of jumping to the loop
> > +# condition-expression, it jumps to the top of the loop. This is
> > +# particularly problematic because it can lead to infinite loops.
> > +#
> > +# This test verifies correct behaviour of "continue" inside do-while
> > +# loops without risking an infinite loop.
> > +
> > +[require]
> > +GLSL >= 1.10
> > +
> > +[vertex shader]
> > +void main()
> > +{
> > + gl_Position = gl_Vertex;
> > + int x = 0;
> > + int y = 0;
> > + do { // 1st iteration 2nd iteration 3rd iteration
> > + ++x; // x <- 1 x <- 2 x <- 3
> > + if (x >= 4) // false false false
> > + break;
> > + if (x >= 2) // false true true
> > + continue;
> > + ++y; // y=1 skipped skipped
> > + } while (x < 3); // true true false
> > +
> > + // The "continue" should skip ++y on all iterations but the first,
> > + // so y should now be 1. The "continue" should not skip (x < 3)
> > + // ever, so the loop should terminate when x == 3 (not 4).
> > + if (x == 3 && y == 1)
> > + gl_FrontColor = vec4(0.0, 1.0, 0.0, 1.0);
> > + else
> > + gl_FrontColor = vec4(1.0, 0.0, 0.0, 1.0);
> > +}
> > +
> > +[fragment shader]
> > +void main()
> > +{
> > + gl_FragColor = gl_Color;
> > +}
> > +
> > +[test]
> > +draw rect -1 -1 2 2
> > +probe all rgba 0.0 1.0 0.0 1.0
> > --
> > 1.8.5.3
> >
> > _______________________________________________
> > Piglit mailing list
> > Piglit at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/piglit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20140201/6b8ccacd/attachment-0001.html>
More information about the Piglit
mailing list