[Piglit] [PATCH] Test that invariant qualifier is available to all shaders

Paul Berry stereotype441 at gmail.com
Mon Oct 7 23:56:12 CEST 2013


On 19 September 2013 11:36, Steve Miller <dervishx at gmail.com> wrote:

>  GLSL 1.50 section 4.6.1 (The Invariant Qualifier) says:
>    To ensure that a particular output variable is invariant, it is
> necessary
>    to use the invariant qualifier. It can either be used to qualify a
>    previously declared variable as being invariant
>        invariant gl_Position; // make existing gl_Position be invariant
>        out vec3 Color; // make existing Color be invariant
>        invariant Color;
>    or as part of a declaration when a variable is declared
>        invariant centroid out vec3 Color;
>    The invariant qualifier must appear before any interpolation qualifiers
> or
>    storage qualifiers when combined with a declaration. Only variables
> output
>    from a shader (including those that are then input to a subsequent
> shader)
>    can be candidates for invariance. This includes user-defined output
> variables
>    and the built-in output variables. For variables leaving one shader and
> coming
>    into another shader, the invariant keyword has to be used in both
> shaders,
>    or a link error will result.
> ---
>  .../invariant-qualifier-everywhere.shader_test     | 83
> +++++++++++++++++++++
>  ...fier-everywhere-gs-fs-inconsistency.shader_test | 83
> +++++++++++++++++++++
>  ...fier-everywhere-vs-gs-inconsistency.shader_test | 84
> ++++++++++++++++++++++
>  3 files changed, 250 insertions(+)
>  create mode 100644
> tests/spec/glsl-1.50/execution/invariant-qualifier-everywhere.shader_test
>  create mode 100644
> tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-gs-fs-inconsistency.shader_test
>  create mode 100644
> tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-vs-gs-inconsistency.shader_test
>

Thanks, Steve.  I've made a minor correction and pushed this patch to
piglit master.


>
> diff --git
> a/tests/spec/glsl-1.50/execution/invariant-qualifier-everywhere.shader_test
> b/tests/spec/glsl-1.50/execution/invariant-qualifier-everywhere.shader_test
> new file mode 100644
> index 0000000..3cee960
> --- /dev/null
> +++
> b/tests/spec/glsl-1.50/execution/invariant-qualifier-everywhere.shader_test
> @@ -0,0 +1,83 @@
> +# Test that invariant qualifier is available to all shaders
> +#
> +# GLSL 1.50 section 4.6.1 (The Invariant Qualifier) says:
> +#   To ensure that a particular output variable is invariant, it is
> necessary
> +#   to use the invariant qualifier. It can either be used to qualify a
> +#   previously declared variable as being invariant
> +#       invariant gl_Position; // make existing gl_Position be invariant
> +#       out vec3 Color; // make existing Color be invariant
> +#       invariant Color;
> +#   or as part of a declaration when a variable is declared
> +#       invariant centroid out vec3 Color;
> +#   The invariant qualifier must appear before any interpolation
> qualifiers or
> +#   storage qualifiers when combined with a declaration. Only variables
> output
> +#   from a shader (including those that are then input to a subsequent
> shader)
> +#   can be candidates for invariance. This includes user-defined output
> variables
> +#   and the built-in output variables. For variables leaving one shader
> and coming
> +#   into another shader, the invariant keyword has to be used in both
> shaders,
> +#   or a link error will result.
> +#
> +# Test is expected to pass.
> +
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +
> +[vertex shader]
> +#version 150
> +
> +in vec4 vertex;
> +invariant out vec4 pos;
> +invariant gl_Position;
> +invariant out vec4 extra01;
> +
> +void main()
> +{
> +    gl_Position = vertex;
> +    pos = vertex;
> +}
> +
> +[geometry shader]
> +#version 150
> +
> +layout(triangles) in;
> +layout(triangles, max_vertices=3) out;
> +
> +invariant in vec4 pos[];
> +invariant in vec4 extra01[];
> +invariant out vec4 extra02;
> +
> +
> +void main()
> +{
> +    for(int i = 0; i < 3; i++) {
> +        gl_Position = pos[i] * 0.5;
> +        extra02 = extra01[i] * 0.5;
> +        EmitVertex();
> +    }
> +
> +}
> +
> +
> +[fragment shader]
> +#version 150
> +
> +in vec4 extra02;
> +invariant extra02; //should be legal according to example
> +out vec4 FragColor;
> +
> +void main()
> +{
> +    FragColor = vec4(extra02);
> +}
> +
> +[vertex data]
> +vertex/float/2
> +-1.0 -1.0
> + 1.0 -1.0
> + 1.0  1.0
> +-1.0  1.0
> +
> +[test]
> +draw arrays GL_TRIANGLE_FAN 0 4
> +probe all rgba 0.5 0.5 0.5 0.5
> diff --git
> a/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-gs-fs-inconsistency.shader_test
> b/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-gs-fs-inconsistency.shader_test
> new file mode 100644
> index 0000000..6454283
> --- /dev/null
> +++
> b/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-gs-fs-inconsistency.shader_test
> @@ -0,0 +1,83 @@
> +# Test that invariant qualifier is available to all shaders
> +#
> +# GLSL 1.50 section 4.6.1 (The Invariant Qualifier) says:
> +#   To ensure that a particular output variable is invariant, it is
> necessary
> +#   to use the invariant qualifier. It can either be used to qualify a
> +#   previously declared variable as being invariant
> +#       invariant gl_Position; // make existing gl_Position be invariant
> +#       out vec3 Color; // make existing Color be invariant
> +#       invariant Color;
> +#   or as part of a declaration when a variable is declared
> +#       invariant centroid out vec3 Color;
> +#   The invariant qualifier must appear before any interpolation
> qualifiers or
> +#   storage qualifiers when combined with a declaration. Only variables
> output
> +#   from a shader (including those that are then input to a subsequent
> shader)
> +#   can be candidates for invariance. This includes user-defined output
> variables
> +#   and the built-in output variables. For variables leaving one shader
> and coming
> +#   into another shader, the invariant keyword has to be used in both
> shaders,
> +#   or a link error will result.
> +#
> +# Test leaves out the required invariant qualifier from the fragment
> shader,
> +# and produce corresponding link error.
> +
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +
> +[vertex shader]
> +#version 150
> +
> +in vec4 vertex;
> +invariant out vec4 pos;
> +invariant gl_Position;
> +invariant out vec4 extra01;
> +
> +void main()
> +{
> +    gl_Position = vertex;
> +    pos = vertex;
> +}
> +
> +[geometry shader]
> +#version 150
> +
> +layout(triangles) in;
> +layout(triangles, max_vertices=3) out;
> +
> +invariant in vec4 pos[];
> +invariant in vec4 extra01[];
> +invariant out vec4 extra02;
> +
> +
> +void main()
> +{
> +    for(int i = 0; i < 3; i++) {
> +        gl_Position = pos[i] * 0.5;
> +        extra02 = extra01[i] * 0.5;
> +        EmitVertex();
> +    }
> +
> +}
> +
> +
> +[fragment shader]
> +#version 150
> +
> +in vec4 extra02;
> +//invariant extra02; //redeclaration left out
> +out vec4 FragColor;
> +
> +void main()
> +{
> +    FragColor = vec4(extra02);
> +}
> +
> +[vertex data]
> +vertex/float/2
> +-1.0 -1.0
> + 1.0 -1.0
> + 1.0  1.0
> +-1.0  1.0
> +
> +[test]
> +link error
> diff --git
> a/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-vs-gs-inconsistency.shader_test
> b/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-vs-gs-inconsistency.shader_test
> new file mode 100644
> index 0000000..56af4f8
> --- /dev/null
> +++
> b/tests/spec/glsl-1.50/linker/invariant-qualifier-everywhere-vs-gs-inconsistency.shader_test
> @@ -0,0 +1,84 @@
> +# Test that invariant qualifier is available to all shaders
> +#
> +# GLSL 1.50 section 4.6.1 (The Invariant Qualifier) says:
> +#   To ensure that a particular output variable is invariant, it is
> necessary
> +#   to use the invariant qualifier. It can either be used to qualify a
> +#   previously declared variable as being invariant
> +#       invariant gl_Position; // make existing gl_Position be invariant
> +#       out vec3 Color; // make existing Color be invariant
> +#       invariant Color;
> +#   or as part of a declaration when a variable is declared
> +#       invariant centroid out vec3 Color;
> +#   The invariant qualifier must appear before any interpolation
> qualifiers or
> +#   storage qualifiers when combined with a declaration. Only variables
> output
> +#   from a shader (including those that are then input to a subsequent
> shader)
> +#   can be candidates for invariance. This includes user-defined output
> variables
> +#   and the built-in output variables. For variables leaving one shader
> and coming
> +#   into another shader, the invariant keyword has to be used in both
> shaders,
> +#   or a link error will result.
> +#
> +# Test leaves out the required invariant qualifier from the geometry
> shader,
> +# and produce corresponding link error.
> +
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +
> +[vertex shader]
> +#version 150
> +
> +in vec4 vertex;
> +invariant out vec4 pos;
> +invariant gl_Position;
> +invariant out vec4 extra01;
> +
> +void main()
> +{
> +    gl_Position = vertex;
> +    pos = vertex;
> +}
> +
> +[geometry shader]
> +#version 150
> +
> +layout(triangles) in;
> +layout(triangles, max_vertices=3) out;
> +
> +//invariant
> +in vec4 pos[];
> +invariant in vec4 extra01[];
> +invariant out vec4 extra02;
> +
> +
> +void main()
> +{
> +    for(int i = 0; i < 3; i++) {
> +        gl_Position = pos[i] * 0.5;
> +        extra02 = extra01[i] * 0.5;
> +        EmitVertex();
> +    }
> +
> +}
> +
> +
> +[fragment shader]
> +#version 150
> +
> +in vec4 extra02;
> +invariant extra02; //should be legal according to example
> +out vec4 FragColor;
> +
> +void main()
> +{
> +    FragColor = vec4(extra02);
> +}
> +
> +[vertex data]
> +vertex/float/2
> +-1.0 -1.0
> + 1.0 -1.0
> + 1.0  1.0
> +-1.0  1.0
> +
> +[test]
> +link error
> --
> 1.8.3.1
>
> _______________________________________________
> 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/20131007/5a19b672/attachment-0001.html>


More information about the Piglit mailing list