[Piglit] [PATCH 3/4] glsl-1.50: Emmit more vertices than allowed in gs.

Fabian Bieler fabianbieler at fastmail.fm
Tue Mar 11 17:31:48 PDT 2014


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 <fabianbieler at fastmail.fm>
> ---
>   .../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
>


More information about the Piglit mailing list