[Piglit] [PATCH] Reproduce a constant propagation bug in Mesa (indexing into vectors).
Jose Fonseca
jfonseca at vmware.com
Mon May 21 11:47:21 PDT 2012
Yep. I still couldn't find a way of using signature/templates effectively for these tags, so end up avoid typing them, but here it is:
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
Jose
----- Original Message -----
> On 19 May 2012 13:05, Jose Fonseca < jfonseca at vmware.com > wrote:
> > Good find and nice test IMO.
>
> > Jose
>
> Thanks, Jose. Can I consider that a "reviewed-by"?
> > ----- Original Message -----
>
> > > As of 5/19/12, Mesa's constant propagation optimization pass
> > > fails
> > > to
>
> > > properly account for the behaviour of array indexing applied to
>
> > > vectors. If v is a vector and i is an integer, it assumes that
>
> > >
>
> > > v[i] = ...;
>
> > >
>
> > > kills the x component of v. This is not necessarily the case--it
>
> > > might kill any component of v, depending on the value of i.
>
> > > ---
>
> > > ...-vector-indexing-kills-all-channels.shader_test | 39
>
> > > +++++++++++++++++++
>
> > > ...-vector-indexing-kills-all-channels.shader_test | 41
>
> > > ++++++++++++++++++++
>
> > > 2 files changed, 80 insertions(+), 0 deletions(-)
>
> > > create mode 100644
>
> > > tests/spec/glsl-1.10/execution/fs-vector-indexing-kills-all-channels.shader_test
>
> > > create mode 100644
>
> > > tests/spec/glsl-1.10/execution/vs-vector-indexing-kills-all-channels.shader_test
>
> > >
>
> > > diff --git
>
> > > a/tests/spec/glsl-1.10/execution/fs-vector-indexing-kills-all-channels.shader_test
>
> > > b/tests/spec/glsl-1.10/execution/fs-vector-indexing-kills-all-channels.shader_test
>
> > > new file mode 100644
>
> > > index 0000000..b22405a
>
> > > --- /dev/null
>
> > > +++
>
> > > b/tests/spec/glsl-1.10/execution/fs-vector-indexing-kills-all-channels.shader_test
>
> > > @@ -0,0 +1,39 @@
>
> > > +# This test exercises a bug in mesa as of 5/19.12: constant
>
> > > +# propagation fails to detect that array indexing into a vector
>
> > > might
>
> > > +# kill any component of the vector.
>
> > > +
>
> > > +[vertex shader]
>
> > > +void main()
>
> > > +{
>
> > > + gl_Position = gl_Vertex;
>
> > > +}
>
> > > +
>
> > > +[fragment shader]
>
> > > +#define RED vec4(1.0, 0.0, 0.0, 0.0)
>
> > > +#define GREEN vec4(0.0, 1.0, 0.0, 0.0)
>
> > > +
>
> > > +uniform int three;
>
> > > +uniform float five;
>
> > > +
>
> > > +void main()
>
> > > +{
>
> > > + vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
>
> > > +
>
> > > + // If the bug is present, constant propagation will see a
> > > scalar
>
> > > on
>
> > > + // the RHS, and incorrectly conclude that therefore only v.x is
>
> > > + // killed.
>
> > > + v[three] = five;
>
> > > +
>
> > > + vec4 color = v.a == 5.0 ? GREEN : RED;
>
> > > +
>
> > > + // If the bug is present, then index and new_value will be
>
> > > optimized
>
> > > + // away, making shader_runner fail to assign uniforms. To avoid
>
> > > + // that, multiply color by (five - three - 1.0).
>
> > > + gl_FragColor = color * (five - float(three) - 1.0);
>
> > > +}
>
> > > +
>
> > > +[test]
>
> > > +uniform int three 3
>
> > > +uniform float five 5.0
>
> > > +draw rect -1 -1 2 2
>
> > > +probe all rgba 0.0 1.0 0.0 0.0
>
> > > diff --git
>
> > > a/tests/spec/glsl-1.10/execution/vs-vector-indexing-kills-all-channels.shader_test
>
> > > b/tests/spec/glsl-1.10/execution/vs-vector-indexing-kills-all-channels.shader_test
>
> > > new file mode 100644
>
> > > index 0000000..6838f78
>
> > > --- /dev/null
>
> > > +++
>
> > > b/tests/spec/glsl-1.10/execution/vs-vector-indexing-kills-all-channels.shader_test
>
> > > @@ -0,0 +1,41 @@
>
> > > +# This test exercises a bug in mesa as of 5/19/12: constant
>
> > > +# propagation fails to detect that array indexing into a vector
>
> > > might
>
> > > +# kill any component of the vector.
>
> > > +
>
> > > +[vertex shader]
>
> > > +#define RED vec4(1.0, 0.0, 0.0, 0.0)
>
> > > +#define GREEN vec4(0.0, 1.0, 0.0, 0.0)
>
> > > +
>
> > > +uniform int three;
>
> > > +uniform float five;
>
> > > +
>
> > > +void main()
>
> > > +{
>
> > > + gl_Position = gl_Vertex;
>
> > > +
>
> > > + vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
>
> > > +
>
> > > + // If the bug is present, constant propagation will see a
> > > scalar
>
> > > on
>
> > > + // the RHS, and incorrectly conclude that therefore only v.x is
>
> > > + // killed.
>
> > > + v[three] = five;
>
> > > +
>
> > > + vec4 color = v.a == 5.0 ? GREEN : RED;
>
> > > +
>
> > > + // If the bug is present, then index and new_value will be
>
> > > optimized
>
> > > + // away, making shader_runner fail to assign uniforms. To avoid
>
> > > + // that, multiply color by (five - three - 1.0).
>
> > > + gl_FrontColor = color * (five - float(three) - 1.0);
>
> > > +}
>
> > > +
>
> > > +[fragment shader]
>
> > > +void main()
>
> > > +{
>
> > > + gl_FragColor = gl_Color;
>
> > > +}
>
> > > +
>
> > > +[test]
>
> > > +uniform int three 3
>
> > > +uniform float five 5.0
>
> > > +draw rect -1 -1 2 2
>
> > > +probe all rgba 0.0 1.0 0.0 0.0
>
> > > --
>
> > > 1.7.7.6
>
> > >
>
> > > _______________________________________________
>
> > > 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/20120521/f8feb0b2/attachment.htm>
More information about the Piglit
mailing list