[Piglit] [PATCH] arb_gpu_shader5: adding an const-nonconst struct-sampler indexing

Timothy Arceri t_arceri at yahoo.com.au
Fri Sep 4 16:41:51 PDT 2015


On Fri, 2015-09-04 at 19:48 +0200, Alejandro PiƱeiro wrote:
> Right now there are tests for the following indexing combination:
>   a) No struct - non const sampler indexing
>   b) Non const struct indexing - single sampler
>   c) Non const struct indexing - const sampler indexing
>   d) Non const struct indexing - non const sampler indexing
> 
> This commit adds the following combination:
>   e) Const struct indexing - non const sampler indexing

I've also sent some structs with multiple samplers tests here [1] that are
still awaiting review.

[1] http://lists.freedesktop.org/archives/piglit/2015-August/016878.html

> ---
> 
> To provide some context, right now:
> 
> a) and b) pass on i965,
> c) fails on i965
> d) fails on i965 with the IR path, but crashes with the NIR path.

Does it crash when not a debug build? I'm pretty sure the nir patch only hits
an assert that was added because arrays of arrays support is missing. Although
I didn't actually check this.

The problem is you can already get a type of AoA by having a struct array that
contains an array member.

Anyway I've sent Mesa patches to add the missing indirect support here:

http://lists.freedesktop.org/archives/mesa-dev/2015-September/093247.html




> 
> I have been taking a look to why there is a different behaviour
> IR vs NIR on d), at least to check if there was a easy solution
> to avoid the crash. On that use case the nir tree resulting
> includes two sampler offset on the same texture operation, so it
> raises and assertion on nir_validate. I concluded that it would
> not be trivial to get the NIR path not crashing, as it is likely
> it is needed to someone jumps in to solve c) and d), that seems
> to be a corner case that was not contemplated on current
> implementation of arb_gpu_shader5.
> 
> In any case, while investigating this, I tried out the outcome
> of a const struct indexing and a non const sampler indexing (so
> e)) and it works fine on i965. So just for the sake of 
> completeness Im submitting this combination. 
> 
>  .../fs-struct-const-sampler-nonconst.shader_test   | 72 +++++++++++++++++
>  .../gs-struct-const-sampler-nonconst.shader_test   | 91
> ++++++++++++++++++++++
>  .../vs-struct-const-sampler-nonconst.shader_test   | 84
> ++++++++++++++++++++
>  3 files changed, 247 insertions(+)
>  create mode 100644
> tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/fs-struct-const
> -sampler-nonconst.shader_test
>  create mode 100644
> tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/gs-struct-const
> -sampler-nonconst.shader_test
>  create mode 100644
> tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-struct-const
> -sampler-nonconst.shader_test
> 
> diff --git a/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/fs
> -struct-const-sampler-nonconst.shader_test
> b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/fs-struct
> -const-sampler-nonconst.shader_test
> new file mode 100644
> index 0000000..80069ea
> --- /dev/null
> +++ b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/fs-struct
> -const-sampler-nonconst.shader_test
> @@ -0,0 +1,72 @@
> +# This test verifies that dynamically uniform indexing of sampler arrays
> +# in the fragment shader behaves correctly.
> +
> +[require]
> +GLSL >= 1.50
> +GL_ARB_gpu_shader5
> +
> +[vertex shader passthrough]
> +
> +[fragment shader]
> +#version 150
> +#extension GL_ARB_gpu_shader5: require
> +
> +struct S {
> +   sampler2D tex[4];
> +};
> +
> +uniform S s[2];
> +
> +uniform int n;
> +
> +out vec4 color;
> +
> +void main()
> +{
> +	color = texture(s[1].tex[n], vec2(0.75, 0.25));
> +}
> +
> +[test]
> +clear color 0.2 0.2 0.2 0.2
> +clear
> +
> +uniform int s[1].tex[0] 0
> +uniform int s[1].tex[1] 1
> +uniform int s[1].tex[2] 2
> +uniform int s[1].tex[3] 3
> +
> +texture checkerboard 0 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 0.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 1 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 1.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 2 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 0.0, 1.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 3 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 1.0, 1.0, 1.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +uniform int n 0
> +draw rect -1 -1 1 1
> +
> +relative probe rect rgb (0.0, 0.0, 0.5, 0.5) (1.0, 0.0, 0.0)
> +
> +uniform int n 1
> +draw rect 0 -1 1 1
> +
> +relative probe rect rgb (0.5, 0.0, 0.5, 0.5) (0.0, 1.0, 0.0)
> +
> +uniform int n 2
> +draw rect -1 0 1 1
> +
> +relative probe rect rgb (0.0, 0.5, 0.5, 0.5) (0.0, 0.0, 1.0)
> +
> +uniform int n 3
> +draw rect 0 0 1 1
> +
> +relative probe rect rgb (0.5, 0.5, 0.5, 0.5) (1.0, 1.0, 1.0)
> diff --git a/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/gs
> -struct-const-sampler-nonconst.shader_test
> b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/gs-struct
> -const-sampler-nonconst.shader_test
> new file mode 100644
> index 0000000..cf6795c
> --- /dev/null
> +++ b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/gs-struct
> -const-sampler-nonconst.shader_test
> @@ -0,0 +1,91 @@
> +# This test verifies that dynamically uniform indexing of sampler arrays
> +# in the geometry shader behaves correctly.
> +
> +[require]
> +GLSL >= 1.50
> +GL_ARB_gpu_shader5
> +
> +[vertex shader passthrough]
> +
> +[geometry shader]
> +#version 150
> +#extension GL_ARB_gpu_shader5: require
> +
> +struct S {
> +   sampler2D tex[4];
> +};
> +
> +uniform S s[2];
> +
> +uniform int n;
> +
> +layout(triangles) in;
> +layout(triangle_strip, max_vertices=3) out;
> +out vec4 color;
> +
> +void main()
> +{
> +	for (int i = 0; i < 3; i++) {
> +		gl_Position = gl_in[i].gl_Position;
> +		color = texture(s[1].tex[n], vec2(0.75, 0.25));
> +		EmitVertex();
> +	}
> +	EndPrimitive();
> +}
> +
> +[fragment shader]
> +#version 150
> +#extension GL_ARB_gpu_shader5: require
> +
> +in vec4 color;
> +out vec4 out_color;
> +
> +void main()
> +{
> +	out_color = color;
> +}
> +
> +[test]
> +clear color 0.2 0.2 0.2 0.2
> +clear
> +
> +uniform int s[1].tex[0] 0
> +uniform int s[1].tex[1] 1
> +uniform int s[1].tex[2] 2
> +uniform int s[1].tex[3] 3
> +
> +texture checkerboard 0 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 0.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 1 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 1.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 2 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 0.0, 1.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 3 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 1.0, 1.0, 1.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +uniform int n 0
> +draw rect -1 -1 1 1
> +
> +relative probe rect rgb (0.0, 0.0, 0.5, 0.5) (1.0, 0.0, 0.0)
> +
> +uniform int n 1
> +draw rect 0 -1 1 1
> +
> +relative probe rect rgb (0.5, 0.0, 0.5, 0.5) (0.0, 1.0, 0.0)
> +
> +uniform int n 2
> +draw rect -1 0 1 1
> +
> +relative probe rect rgb (0.0, 0.5, 0.5, 0.5) (0.0, 0.0, 1.0)
> +
> +uniform int n 3
> +draw rect 0 0 1 1
> +
> +relative probe rect rgb (0.5, 0.5, 0.5, 0.5) (1.0, 1.0, 1.0)
> diff --git a/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs
> -struct-const-sampler-nonconst.shader_test
> b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-struct
> -const-sampler-nonconst.shader_test
> new file mode 100644
> index 0000000..9388675
> --- /dev/null
> +++ b/tests/spec/arb_gpu_shader5/execution/sampler_array_indexing/vs-struct
> -const-sampler-nonconst.shader_test
> @@ -0,0 +1,84 @@
> +# This test verifies that dynamically uniform indexing of sampler arrays
> +# in the vertex shader behaves correctly.
> +
> +[require]
> +GLSL >= 1.50
> +GL_ARB_gpu_shader5
> +
> +[vertex shader]
> +#version 150
> +#extension GL_ARB_gpu_shader5: require
> +
> +struct S {
> +   sampler2D tex[4];
> +};
> +
> +uniform S s[2];
> +
> +uniform int n;
> +
> +in vec4 piglit_vertex;
> +out vec4 color;
> +
> +void main()
> +{
> +	gl_Position = piglit_vertex;
> +	color = texture(s[1].tex[n], vec2(0.75, 0.25));
> +}
> +
> +[fragment shader]
> +#version 150
> +#extension GL_ARB_gpu_shader5: require
> +
> +in vec4 color;
> +out vec4 out_color;
> +
> +void main()
> +{
> +	out_color = color;
> +}
> +
> +[test]
> +clear color 0.2 0.2 0.2 0.2
> +clear
> +
> +uniform int s[1].tex[0] 0
> +uniform int s[1].tex[1] 1
> +uniform int s[1].tex[2] 2
> +uniform int s[1].tex[3] 3
> +
> +texture checkerboard 0 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 0.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 1 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 1.0, 0.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 2 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (0.0, 0.0, 1.0, 0.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +texture checkerboard 3 0 (32, 32) (0.5, 0.0, 0.0, 0.0) (1.0, 1.0, 1.0, 1.0)
> +texparameter 2D min nearest
> +texparameter 2D mag nearest
> +
> +uniform int n 0
> +draw rect -1 -1 1 1
> +
> +relative probe rect rgb (0.0, 0.0, 0.5, 0.5) (1.0, 0.0, 0.0)
> +
> +uniform int n 1
> +draw rect 0 -1 1 1
> +
> +relative probe rect rgb (0.5, 0.0, 0.5, 0.5) (0.0, 1.0, 0.0)
> +
> +uniform int n 2
> +draw rect -1 0 1 1
> +
> +relative probe rect rgb (0.0, 0.5, 0.5, 0.5) (0.0, 0.0, 1.0)
> +
> +uniform int n 3
> +draw rect 0 0 1 1
> +
> +relative probe rect rgb (0.5, 0.5, 0.5, 0.5) (1.0, 1.0, 1.0)


More information about the Piglit mailing list