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

Steve Miller dervishx at gmail.com
Thu Sep 19 11:36:09 PDT 2013


 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

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



More information about the Piglit mailing list