[Piglit] [PATCH] gs: Test that input arrays can be accessed dynamically.
Chad Versace
chad.versace at linux.intel.com
Tue Sep 10 16:28:49 PDT 2013
On 09/04/2013 02:22 PM, Paul Berry wrote:
> Most geometry shaders access their input arrays using a constant index
> (or an index that is constant after loop unrolling). This test checks
> that we get the right results if we access a geometry shader input
> array using a non-constant index.
> ---
> .../geometry/dynamic_input_array_index.shader_test | 67 ++++++++++++++++++++++
> 1 file changed, 67 insertions(+)
> create mode 100644 tests/spec/glsl-1.50/execution/geometry/dynamic_input_array_index.shader_test
>
> diff --git a/tests/spec/glsl-1.50/execution/geometry/dynamic_input_array_index.shader_test b/tests/spec/glsl-1.50/execution/geometry/dynamic_input_array_index.shader_test
> new file mode 100644
> index 0000000..685a66a
> --- /dev/null
> +++ b/tests/spec/glsl-1.50/execution/geometry/dynamic_input_array_index.shader_test
> @@ -0,0 +1,67 @@
> +# Verify that a geometry shader can access an input array using a
> +# dynamic index rather than a constant index.
> +
> +[require]
> +GL >= 3.2
> +GLSL >= 1.50
> +
> +[vertex shader]
> +#version 150
> +
> +in vec4 vertex;
> +in vec4 color;
> +in int index;
> +out vec4 vertex_to_gs;
> +out vec4 color_to_gs;
> +out int index_to_gs;
> +
> +void main()
> +{
> + vertex_to_gs = vertex;
> + color_to_gs = color;
> + index_to_gs = index;
> +}
> +
> +[geometry shader]
> +#version 150
> +
> +layout(triangles) in;
> +layout(triangle_strip, max_vertices = 3) out;
> +
> +in vec4 vertex_to_gs[3];
> +in vec4 color_to_gs[3];
> +in int index_to_gs[3];
> +out vec4 color_to_fs;
> +
> +void main()
> +{
> + for (int i = 0; i < 3; i++) {
> + gl_Position = vertex_to_gs[i];
> + color_to_fs = color_to_gs[index_to_gs[i]];
> + EmitVertex();
> + }
> +}
> +
> +[fragment shader]
> +#version 150
> +
> +in vec4 color_to_fs;
> +out vec4 color;
> +
> +void main()
> +{
> + color = color_to_fs;
> +}
> +
> +[vertex data]
> +vertex/float/2 color/float/4 index/int/1
> +-1.0 -1.0 1.0 0.0 0.0 1.0 1
> + 1.0 -1.0 0.0 1.0 0.0 1.0 1
> + 1.0 1.0 0.0 0.0 1.0 1.0 1
> +-1.0 -1.0 1.0 0.0 0.0 1.0 2
> + 1.0 1.0 0.0 0.0 1.0 1.0 2
> +-1.0 1.0 0.0 1.0 0.0 1.0 2
> +
> +[test]
> +draw arrays GL_TRIANGLES 0 6
> +probe all rgba 0.0 1.0 0.0 1.0
>
Seeing that the index attribute has the same value for all vertices
that belong to the same primitive, I can imagine some simple code generation
bugs under which this test would produce a false positive.
I'd like to see each index attribute have a unique value, and guarantee
that the test fails if a single wrong index value is chosen.
Here's a partial example that I think accomplishes that:
[geometry shader]
#version 150
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
in vec4 vertex_to_gs[3];
in ivec4 color_to_gs[3];
in ivec4 modulus_to_gs[3];
int index_to_gs[3];
out vec4 color_to_fs;
void main()
{
for (int i = 0; i < 3; i++) {
gl_Position = vertex_to_gs[i];
color_to_fs = vec4(mod(color_to_gs[i], modulus_to_gs[index_to_gs[i]]));
EmitVertex();
}
}
[vertex data]
vertex/float/2 color/int/4 modulus/int/4 index/int/1
-1.0 -1.0 5 7 9 10 4 7 5 2 2
1.0 -1.0 2 3 4 3 2 2 2 2 1
1.0 1.0 8 15 15 15 5 6 9 9 0
-1.0 -1.0 ...
1.0 1.0 ...
-1.0 1.0 ...
More information about the Piglit
mailing list