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. +# 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 -- 1.8.3.2 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
