[Piglit] [PATCH 06/14] Test that the built-in gl_PerVertex interface block can be redeclared.

Paul Berry stereotype441 at gmail.com
Wed Oct 2 16:45:34 PDT 2013


---
 .../redeclare-pervertex-out-subset-gs.shader_test  |  77 ++++++++++++++
 ...redeclare-pervertex-subset-vs-to-gs.shader_test | 113 +++++++++++++++++++++
 .../redeclare-pervertex-subset-vs.shader_test      |  73 +++++++++++++
 3 files changed, 263 insertions(+)
 create mode 100644 tests/spec/glsl-1.50/execution/redeclare-pervertex-out-subset-gs.shader_test
 create mode 100644 tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.shader_test
 create mode 100644 tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs.shader_test

diff --git a/tests/spec/glsl-1.50/execution/redeclare-pervertex-out-subset-gs.shader_test b/tests/spec/glsl-1.50/execution/redeclare-pervertex-out-subset-gs.shader_test
new file mode 100644
index 0000000..baaa0f1
--- /dev/null
+++ b/tests/spec/glsl-1.50/execution/redeclare-pervertex-out-subset-gs.shader_test
@@ -0,0 +1,77 @@
+# From section 7.1 (Built-In Language Variables) of the GLSL 4.10
+# spec:
+#
+#   The gl_PerVertex block can be redeclared in a shader to explicitly
+#   indicate what subset of the fixed pipeline interface will be
+#   used. This is necessary to establish the interface between multiple
+#   programs.  For example:
+#
+#   out gl_PerVertex {
+#       vec4 gl_Position;    // will use gl_Position
+#       float gl_PointSize;  // will use gl_PointSize
+#       vec4 t;              // error, only gl_PerVertex members allowed
+#   };  // no other members of gl_PerVertex will be used
+#
+#   This establishes the output interface the shader will use with the
+#   subsequent pipeline stage. It must be a subset of the built-in members
+#   of gl_PerVertex.
+#
+# This appears to be a clarification to the behaviour established for
+# gl_PerVertex by GLSL 1.50, therefore we test it using GLSL version
+# 1.50.
+#
+# This test verifies that the geometry shader can redeclare gl_PerVertex
+# specifying a subset of the built-in values (gl_Position and
+# gl_PointSize), and the subset works.
+#
+# This test draws a small point in the left half of the window and a
+# large point in the right half.  Then it probes the region around
+# each point to ensure that the point on the right is larger.
+#
+# NOTE: since gl_PointSize is expressed in pixels, but gl_Position is
+# expressed relative to the window size, this test is dependent upon
+# the window size.  It assumes a window size of 250x250, which is the
+# shader_runner default.
+
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+void main()
+{
+}
+
+[geometry shader]
+layout(points) in;
+layout(points, max_vertices = 2) out;
+
+out gl_PerVertex {
+    vec4 gl_Position;
+    float gl_PointSize;
+};
+
+void main()
+{
+  gl_Position = vec4(-0.5, 0.0, 0.0, 1.0);
+  gl_PointSize = 1.0;
+  EmitVertex();
+  gl_Position = vec4(0.5, 0.0, 0.0, 1.0);
+  gl_PointSize = 13.0;
+  EmitVertex();
+}
+
+[fragment shader]
+void main()
+{
+  gl_FragColor = vec4(1.0);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+enable GL_PROGRAM_POINT_SIZE
+draw arrays GL_POINTS 0 1
+relative probe rgba (0.24, 0.5) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.26, 0.5) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.74, 0.5) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.76, 0.5) (1.0, 1.0, 1.0, 1.0)
diff --git a/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.shader_test b/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.shader_test
new file mode 100644
index 0000000..7472762
--- /dev/null
+++ b/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.shader_test
@@ -0,0 +1,113 @@
+# From section 7.1 (Built-In Language Variables) of the GLSL 4.10
+# spec:
+#
+#   The gl_PerVertex block can be redeclared in a shader to explicitly
+#   indicate what subset of the fixed pipeline interface will be
+#   used. This is necessary to establish the interface between multiple
+#   programs.  For example:
+#
+#   out gl_PerVertex {
+#       vec4 gl_Position;    // will use gl_Position
+#       float gl_PointSize;  // will use gl_PointSize
+#       vec4 t;              // error, only gl_PerVertex members allowed
+#   };  // no other members of gl_PerVertex will be used
+#
+#   This establishes the output interface the shader will use with the
+#   subsequent pipeline stage. It must be a subset of the built-in members
+#   of gl_PerVertex.
+#
+# Furthermore, section 7.1.1 (Compatibility Profile Built-In Language
+# Variables) says:
+#
+#   In the tessellation control, evaluation, and geometry shaders, the
+#   outputs of the previous stage described above are also available
+#   in the input gl_PerVertex block in these languages.
+#
+#   ...
+#
+#   These can be redeclared to establish an explicit pipeline
+#   interface, the same way as described above for the output block
+#   gl_PerVertex, and the input redeclaration must match the output
+#   redeclaration of the previous stage. However, when a built-in
+#   interface block with an instance name is redeclared (e.g., gl_in),
+#   the instance name must be included in the redeclaration. It is an
+#   error to not include the built-in instance name or to change its
+#   name. For example,
+#
+#   in gl_PerVertex {
+#       vec4  gl_ClipVertex;
+#       vec4  gl_FrontColor;
+#   } gl_in[];  // must be present and must be "gl_in[]"
+#
+# This appears to be a clarification to the behaviour established for
+# gl_PerVertex by GLSL 1.50, therefore we test it using GLSL version
+# 1.50.
+#
+# This test verifies that the vertex shader can redeclare the
+# gl_PerVertex out block specifying a subset of the built-in values
+# (gl_Position and gl_PointSize), and the geometry shader can
+# redeclare the same subset for its gl_PerVertex in block, and the
+# subset works.
+
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+out gl_PerVertex {
+    vec4 gl_Position;
+    float gl_PointSize;
+};
+
+void main()
+{
+    gl_Position = 100.0 * gl_VertexID + vec4(0.0, 1.0, 2.0, 3.0);
+    gl_PointSize = 100.0 * gl_VertexID + 4.0;
+}
+
+[geometry shader]
+layout(triangles) in;
+layout(triangle_strip, max_vertices = 4) out;
+
+in gl_PerVertex {
+    vec4 gl_Position;
+    float gl_PointSize;
+} gl_in[];
+out vec4 color;
+
+void main()
+{
+  const vec4 vertices[4] = vec4[4](
+    vec4(-1.0, -1.0, 0.0, 1.0),
+    vec4(-1.0,  1.0, 0.0, 1.0),
+    vec4( 1.0, -1.0, 0.0, 1.0),
+    vec4( 1.0,  1.0, 0.0, 1.0)
+  );
+
+  bool pass = true;
+  for (int i = 0; i < 3; i++) {
+    if (gl_in[i].gl_Position != 100.0 * i + vec4(0.0, 1.0, 2.0, 3.0))
+      pass = false;
+    if (gl_in[i].gl_PointSize != 100.0 * i + 4.0)
+      pass = false;
+  }
+
+  for (int i = 0; i < 4; i++) {
+    gl_Position = vertices[i];
+    color = pass ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+    EmitVertex();
+  }
+}
+
+[fragment shader]
+in vec4 color;
+
+void main()
+{
+  gl_FragColor = color;
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+draw arrays GL_TRIANGLES 0 3
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs.shader_test b/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs.shader_test
new file mode 100644
index 0000000..6f677bb
--- /dev/null
+++ b/tests/spec/glsl-1.50/execution/redeclare-pervertex-subset-vs.shader_test
@@ -0,0 +1,73 @@
+# From section 7.1 (Built-In Language Variables) of the GLSL 4.10
+# spec:
+#
+#   The gl_PerVertex block can be redeclared in a shader to explicitly
+#   indicate what subset of the fixed pipeline interface will be
+#   used. This is necessary to establish the interface between multiple
+#   programs.  For example:
+#
+#   out gl_PerVertex {
+#       vec4 gl_Position;    // will use gl_Position
+#       float gl_PointSize;  // will use gl_PointSize
+#       vec4 t;              // error, only gl_PerVertex members allowed
+#   };  // no other members of gl_PerVertex will be used
+#
+#   This establishes the output interface the shader will use with the
+#   subsequent pipeline stage. It must be a subset of the built-in members
+#   of gl_PerVertex.
+#
+# This appears to be a clarification to the behaviour established for
+# gl_PerVertex by GLSL 1.50, therefore we test it using GLSL version
+# 1.50.
+#
+# This test verifies that the vertex shader can redeclare gl_PerVertex
+# specifying a subset of the built-in values (gl_Position and
+# gl_PointSize), and the subset works.
+#
+# This test draws a small point in the left half of the window and a
+# large point in the right half.  Then it probes the region around
+# each point to ensure that the point on the right is larger.
+#
+# NOTE: since gl_PointSize is expressed in pixels, but gl_Position is
+# expressed relative to the window size, this test is dependent upon
+# the window size.  It assumes a window size of 250x250, which is the
+# shader_runner default.
+
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+in vec4 pos;
+in float point_size;
+
+out gl_PerVertex {
+    vec4 gl_Position;
+    float gl_PointSize;
+};
+
+void main()
+{
+  gl_Position = pos;
+  gl_PointSize = point_size;
+}
+
+[fragment shader]
+void main()
+{
+  gl_FragColor = vec4(1.0);
+}
+
+[vertex data]
+pos/float/4       point_size/float/1
+-0.5 0.0 0.0 1.0   1.0
+ 0.5 0.0 0.0 1.0  13.0
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+enable GL_PROGRAM_POINT_SIZE
+draw arrays GL_POINTS 0 2
+relative probe rgba (0.24, 0.5) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.26, 0.5) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.74, 0.5) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.76, 0.5) (1.0, 1.0, 1.0, 1.0)
-- 
1.8.4



More information about the Piglit mailing list