On 2014-03-03 09:38, Fabian Bieler wrote:
Test a geometry shader that emits more vertices than allowed per
max_vertices layout.

 From the OpenGL 3.2 (Core Profile) spec (section 2.12.4, page 86):
"If a single invocation of a geometry shader emits more vertices than
  this [max_vertices] value, the emitted vertices may have no effect."

This test assumes that "the emitted vertices" only refers to the
supernumerous vertices.
In any case, the shader should execute without error.

Test this with a geometry shader that tries to emit 14 but is only allowed to
emit 8 and one that tries to emit 510 but is only allowed to emit 256
vertices.

Signed-off-by: Fabian Bieler <[email protected]>
---
  .../geometry/output-overrun-14verts.shader_test    | 72 ++++++++++++++++++++++
  .../geometry/output-overrun-510verts.shader_test   | 72 ++++++++++++++++++++++
  2 files changed, 144 insertions(+)
  create mode 100644 
tests/spec/glsl-1.50/execution/geometry/output-overrun-14verts.shader_test
  create mode 100644 
tests/spec/glsl-1.50/execution/geometry/output-overrun-510verts.shader_test

diff --git 
a/tests/spec/glsl-1.50/execution/geometry/output-overrun-14verts.shader_test 
b/tests/spec/glsl-1.50/execution/geometry/output-overrun-14verts.shader_test
new file mode 100644
index 0000000..939ef70
--- /dev/null
+++ b/tests/spec/glsl-1.50/execution/geometry/output-overrun-14verts.shader_test
@@ -0,0 +1,72 @@
+# Emit more vertices than allowed.
+#
+# From the OpenGL 3.2 (Core Profile) spec (section 2.12.4, page 86):
+# "If a single invocation of a geometry shader emits more vertices than
+#  this [max_vertices] value, the emitted vertices may have no effect."
+#
+# This test assumes that "the emitted vertices" only refers to the
+# supernumerous vertices.
I'd really appreciate some feedback whether this assumption is valid.
The ARB_geometry_shader4 spec is clearer on the issue:
"If a geometry shader, in one invocation, emits more vertices than the value GEOMETRY_VERTICES_OUT_ARB, these emits may have no effect." But given that arb and core geometry shaders differ quite a bit I'm not sure if this is relevant.
+# In any case, the shader should execute without error.
+#
+# The geometry shader emits a triangle strip with 14 vertices (12 triangles)
+# that cover the entire screen in a single row of isosceles triangles. Only
+# allow the geomtry shader to emit a total of 8 vertices (6 triangles) via
+# the max_vertices layout. Invoke the geometry shader twice. The first time
+# it draws the strip left to right, the second time vice versa. Thus,
+# regardless whether the supernumerous vertices are drawn or ignored the
+# entire screen should be filled.
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+in vec4 vertex;
+
+void main()
+{
+       gl_Position = vertex;
+}
+
+[geometry shader]
+layout(lines_adjacency) in;
+layout(triangle_strip, max_vertices = 8) out;
+
+/* Should always be even and >= 4. */
+uniform int count;
+
+void main()
+{
+       for (int i = 0; i < count / 2; ++i) {
+               float p = float(i) / float(count / 2 - 1);
+               gl_Position = gl_in[0].gl_Position + p *
+                       (gl_in[2].gl_Position - gl_in[0].gl_Position);
+               EmitVertex();
+               gl_Position = gl_in[1].gl_Position + p *
+                       (gl_in[3].gl_Position - gl_in[1].gl_Position);
+               EmitVertex();
+       }
+}
+
+[fragment shader]
+
+void main()
+{
+       gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+vertex/float/2
+-1.0  1.0
+-1.0 -1.0
+ 1.0  1.0
+ 1.0 -1.0
+ 1.0 -1.0
+ 1.0  1.0
+-1.0 -1.0
+-1.0  1.0
+
+[test]
+uniform int count 14
+clear color 1.0 0.0 0.0 0.0
+clear
+draw arrays GL_LINES_ADJACENCY 0 8
+probe all rgb 0.0 1.0 0.0
diff --git 
a/tests/spec/glsl-1.50/execution/geometry/output-overrun-510verts.shader_test 
b/tests/spec/glsl-1.50/execution/geometry/output-overrun-510verts.shader_test
new file mode 100644
index 0000000..48ca276
--- /dev/null
+++ 
b/tests/spec/glsl-1.50/execution/geometry/output-overrun-510verts.shader_test
@@ -0,0 +1,72 @@
+# Emit more vertices than allowed.
+#
+# From the OpenGL 3.2 (Core Profile) spec (section 2.12.4, page 86):
+# "If a single invocation of a geometry shader emits more vertices than
+#  this [max_vertices] value, the emitted vertices may have no effect."
+#
+# This test assumes that "the emitted vertices" only refers to the
+# supernumerous vertices.
+# In any case, the shader should execute without error.
+#
+# The geometry shader emits a triangle strip with 510 vertices (508 triangles)
+# that cover the entire screen in a single row of isosceles triangles. Only
+# allow the geomtry shader to emit a total of 256 vertices (254 triangles) via
+# the max_vertices layout. Invoke the geometry shader twice. The first time
+# it draws the strip left to right, the second time vice versa. Thus,
+# regardless whether the supernumerous vertices are drawn or ignored the
+# entire screen should be filled.
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+in vec4 vertex;
+
+void main()
+{
+       gl_Position = vertex;
+}
+
+[geometry shader]
+layout(lines_adjacency) in;
+layout(triangle_strip, max_vertices = 256) out;
+
+/* Should always be even and >= 4. */
+uniform int count;
+
+void main()
+{
+       for (int i = 0; i < count / 2; ++i) {
+               float p = float(i) / float(count / 2 - 1);
+               gl_Position = gl_in[0].gl_Position + p *
+                       (gl_in[2].gl_Position - gl_in[0].gl_Position);
+               EmitVertex();
+               gl_Position = gl_in[1].gl_Position + p *
+                       (gl_in[3].gl_Position - gl_in[1].gl_Position);
+               EmitVertex();
+       }
+}
+
+[fragment shader]
+
+void main()
+{
+       gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+vertex/float/2
+-1.0  1.0
+-1.0 -1.0
+ 1.0  1.0
+ 1.0 -1.0
+ 1.0 -1.0
+ 1.0  1.0
+-1.0 -1.0
+-1.0  1.0
+
+[test]
+uniform int count 510
+clear color 1.0 0.0 0.0 0.0
+clear
+draw arrays GL_LINES_ADJACENCY 0 8
+probe all rgb 0.0 1.0 0.0

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to