[Piglit] [PATCH] Test a geometry shader that does an item-by-item copy of gl_ClipDistance.

Paul Berry stereotype441 at gmail.com
Fri Nov 22 13:11:49 PST 2013


This is similar to the existing test "clip-distance-bulk-copy", except
that it copies the elements of gl_ClipDistance one at a time instead
of as a bulk assignment.

This test is known to crash with Mesa as of commit ec79c05.
---
 .../clip-distance-itemized-copy.shader_test        | 98 ++++++++++++++++++++++
 1 file changed, 98 insertions(+)
 create mode 100644 tests/spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy.shader_test

diff --git a/tests/spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy.shader_test b/tests/spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy.shader_test
new file mode 100644
index 0000000..3494110
--- /dev/null
+++ b/tests/spec/glsl-1.50/execution/geometry/clip-distance-itemized-copy.shader_test
@@ -0,0 +1,98 @@
+# This test checks that the geometry shader can perform an
+# item-by-item copy of the entire gl_ClipDistance array from input to
+# output.
+
+[require]
+GL >= 2.0
+GLSL >= 1.50
+
+[vertex shader]
+#version 150
+
+in vec4 vertex;
+in float offset;
+out float offset_to_gs;
+out gl_PerVertex {
+  vec4 gl_Position;
+  float gl_ClipDistance[8];
+};
+
+void main()
+{
+  gl_Position = vertex;
+  offset_to_gs = offset;
+  for (int i = 0; i < 8; i++) {
+    gl_ClipDistance[i] = offset + float(i);
+  }
+}
+
+[geometry shader]
+#version 150
+
+layout(triangles) in;
+layout(triangle_strip, max_vertices = 3) out;
+
+in float offset_to_gs[3];
+in gl_PerVertex {
+  vec4 gl_Position;
+  float gl_ClipDistance[8];
+} gl_in[];
+out float offset_to_fs;
+out gl_PerVertex {
+  vec4 gl_Position;
+  float gl_ClipDistance[8];
+};
+
+void main()
+{
+  bool ok = true;
+  for (int i = 0; i < 3; i++) {
+    gl_Position = gl_in[i].gl_Position;
+    for (int j = 0; j < 8; j++)
+      gl_ClipDistance[j] = gl_in[i].gl_ClipDistance[j];
+    offset_to_fs = offset_to_gs[i];
+    EmitVertex();
+  }
+}
+
+[fragment shader]
+#version 150
+
+in float gl_ClipDistance[8];
+in float offset_to_fs;
+
+void main()
+{
+  bool ok = true;
+  for (int i = 0; i < 8; i++) {
+    if (distance(gl_ClipDistance[i], offset_to_fs + float(i)) > 1e-6)
+      ok = false;
+  }
+  if (ok)
+    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
+  else
+    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[vertex data]
+vertex/float/2  offset/float/1
+-1.0 -1.0       1.0
+ 1.0 -1.0       2.0
+ 1.0  1.0       3.0
+-1.0  1.0       4.0
+
+[test]
+# Since the fragment shader's gl_ClipDistance array is only defined
+# for elements that have clipping enabled, we need to enable all 8
+# clip planes.  Fortunately the values we use for gl_ClipDistance are
+# always positive, so no pixels are actually clipped.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+enable GL_CLIP_PLANE6
+enable GL_CLIP_PLANE7
+draw arrays GL_TRIANGLE_FAN 0 4
+probe all rgba 0.0 1.0 0.0 1.0
-- 
1.8.4.2



More information about the Piglit mailing list