[12/17] arb_gl_spirv: add ubo array test with different array_stride

Submitted by apinheiro on Sept. 15, 2018, 4:22 p.m.

Details

Message ID 20180915162255.21591-14-apinheiro@igalia.com
State New
Headers show
Series "ARB_gl_spirv: ubo/ssbo tests" ( rev: 2 1 ) in Piglit

Not browsing as part of any series.

Commit Message

apinheiro Sept. 15, 2018, 4:22 p.m.
For more info, see the long explanation at the commit "arb_gl_spirv:
add ubo matrix test with different matrix_stride"
---
 .../array-different-array-stride-ubo.shader_test   | 147 +++++++++++++++++++++
 1 file changed, 147 insertions(+)
 create mode 100644 tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test

Patch hide | download patch | download mbox

diff --git a/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
new file mode 100644
index 000000000..0638864b2
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
@@ -0,0 +1,147 @@ 
+# UBO test using two ubos, with an array with the same size and type,
+# but setting a different array stride for each one. Used to test that
+# the size is properly computed, and the content properly accessed in
+# both cases.
+
+[require]
+SPIRV ONLY
+GL >= 3.3
+GLSL >= 3.30
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; Automatically generated from the GLSL by shader_test_spirv.py, and then edited by hand to set the proper array stride
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color
+               OpExecutionMode %main OriginLowerLeft
+               OpSource GLSL 450
+               OpName %_ ""
+               OpName %__0 ""
+               OpDecorate %color Location 0
+               OpDecorate %_arr_v4float_uint_3 ArrayStride 16
+               OpMemberDecorate %block16 0 Offset 0
+               OpDecorate %block16 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 5
+               OpDecorate %_arr_v4float_uint_3_0 ArrayStride 32
+               OpMemberDecorate %block32 0 Offset 0
+               OpDecorate %block32 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 6
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+      %color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
+    %block16 = OpTypeStruct %_arr_v4float_uint_3
+%_ptr_Uniform_block16 = OpTypePointer Uniform %block16
+          %_ = OpVariable %_ptr_Uniform_block16 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_arr_v4float_uint_3_0 = OpTypeArray %v4float %uint_3
+    %block32 = OpTypeStruct %_arr_v4float_uint_3_0
+%_ptr_Uniform_block32 = OpTypePointer Uniform %block32
+        %__0 = OpVariable %_ptr_Uniform_block32 Uniform
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_0
+         %20 = OpLoad %v4float %19
+         %22 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_1
+         %23 = OpLoad %v4float %22
+         %24 = OpFAdd %v4float %20 %23
+         %26 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_2
+         %27 = OpLoad %v4float %26
+         %28 = OpFAdd %v4float %24 %27
+         %33 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_0
+         %34 = OpLoad %v4float %33
+         %35 = OpFSub %v4float %28 %34
+         %36 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_1
+         %37 = OpLoad %v4float %36
+         %38 = OpFSub %v4float %35 %37
+         %39 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_2
+         %40 = OpLoad %v4float %39
+         %41 = OpFSub %v4float %38 %40
+               OpStore %color %41
+         %45 = OpLoad %v4float %color
+         %46 = OpFAdd %v4float %45 %44
+               OpStore %color %46
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout (location = 0) out vec4 color;
+
+layout (std140, binding = 5) uniform block16 {
+	vec4 arr16[3];
+};
+
+/*
+ * This array will have a array_stride of 32.
+ *
+ * Note that there is no way to set a explicit array_stride on GLSL. This GLSL
+ * was used initially to generate the SPIRV-V, and then array stride was tweaked.
+ * That's the reason this is a SPIRV ONLY test. GLSL here is just as reference.
+ */
+layout (std140, binding = 6) uniform block32 {
+	vec4 arr32[3];
+};
+
+
+void main()
+{
+	color = arr16[0] + arr16[1] + arr16[2] - arr32[0] - arr32[1] - arr32[2];
+	color += vec4(0.0, 1.0, 0.0, 0.0);
+}
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+block binding 5
+block offset 0
+uniform vec4 arr16[0] 0.0 0.1 0.2 0.3
+block offset 16
+uniform vec4 arr16[1] 0.4 0.5 0.6 0.2
+block offset 32
+uniform vec4 arr16[2] 0.1 0.3 0.1 0.2
+
+block binding 6
+block offset 0
+uniform vec4 arr32[0] 0.0 0.1 0.2 0.3
+block offset 32
+uniform vec4 arr32[1] 0.4 0.5 0.6 0.2
+block offset 64
+uniform vec4 arr32[2] 0.1 0.3 0.1 0.2
+
+block binding 5
+verify program_interface_query GL_UNIFORM_BLOCK block16 GL_NUM_ACTIVE_VARIABLES 1
+verify program_interface_query GL_UNIFORM_BLOCK block16 GL_BUFFER_DATA_SIZE 48
+
+block binding 6
+verify program_interface_query GL_UNIFORM_BLOCK block32 GL_NUM_ACTIVE_VARIABLES 1
+verify program_interface_query GL_UNIFORM_BLOCK block32 GL_BUFFER_DATA_SIZE 96
+
+verify program_query GL_ACTIVE_UNIFORMS 2
+
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0

Comments

On 16/9/18 2:22 am, Alejandro Piñeiro wrote:
> For more info, see the long explanation at the commit "arb_gl_spirv:
> add ubo matrix test with different matrix_stride"
> ---
>   .../array-different-array-stride-ubo.shader_test   | 147 +++++++++++++++++++++
>   1 file changed, 147 insertions(+)
>   create mode 100644 tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
> 
> diff --git a/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
> new file mode 100644
> index 000000000..0638864b2
> --- /dev/null
> +++ b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
> @@ -0,0 +1,147 @@
> +# UBO test using two ubos, with an array with the same size and type,
> +# but setting a different array stride for each one. Used to test that
> +# the size is properly computed, and the content properly accessed in
> +# both cases.
> +
> +[require]
> +SPIRV ONLY
> +GL >= 3.3
> +GLSL >= 3.30
> +
> +[vertex shader passthrough]
> +
> +[fragment shader spirv]
> +; Automatically generated from the GLSL by shader_test_spirv.py, and then edited by hand to set the proper array stride
> +; SPIR-V
> +; Version: 1.0
> +; Generator: Khronos Glslang Reference Front End; 7
> +; Bound: 47
> +; Schema: 0
> +               OpCapability Shader
> +          %1 = OpExtInstImport "GLSL.std.450"
> +               OpMemoryModel Logical GLSL450
> +               OpEntryPoint Fragment %main "main" %color
> +               OpExecutionMode %main OriginLowerLeft
> +               OpSource GLSL 450
> +               OpName %_ ""
> +               OpName %__0 ""
> +               OpDecorate %color Location 0
> +               OpDecorate %_arr_v4float_uint_3 ArrayStride 16
> +               OpMemberDecorate %block16 0 Offset 0
> +               OpDecorate %block16 Block
> +               OpDecorate %_ DescriptorSet 0
> +               OpDecorate %_ Binding 5
> +               OpDecorate %_arr_v4float_uint_3_0 ArrayStride 32
> +               OpMemberDecorate %block32 0 Offset 0
> +               OpDecorate %block32 Block
> +               OpDecorate %__0 DescriptorSet 0
> +               OpDecorate %__0 Binding 6
> +       %void = OpTypeVoid
> +          %3 = OpTypeFunction %void
> +      %float = OpTypeFloat 32
> +    %v4float = OpTypeVector %float 4
> +%_ptr_Output_v4float = OpTypePointer Output %v4float
> +      %color = OpVariable %_ptr_Output_v4float Output
> +       %uint = OpTypeInt 32 0
> +     %uint_3 = OpConstant %uint 3
> +%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
> +    %block16 = OpTypeStruct %_arr_v4float_uint_3
> +%_ptr_Uniform_block16 = OpTypePointer Uniform %block16
> +          %_ = OpVariable %_ptr_Uniform_block16 Uniform
> +        %int = OpTypeInt 32 1
> +      %int_0 = OpConstant %int 0
> +%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
> +      %int_1 = OpConstant %int 1
> +      %int_2 = OpConstant %int 2
> +%_arr_v4float_uint_3_0 = OpTypeArray %v4float %uint_3
> +    %block32 = OpTypeStruct %_arr_v4float_uint_3_0
> +%_ptr_Uniform_block32 = OpTypePointer Uniform %block32
> +        %__0 = OpVariable %_ptr_Uniform_block32 Uniform
> +    %float_0 = OpConstant %float 0
> +    %float_1 = OpConstant %float 1
> +         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
> +       %main = OpFunction %void None %3
> +          %5 = OpLabel
> +         %19 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_0
> +         %20 = OpLoad %v4float %19
> +         %22 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_1
> +         %23 = OpLoad %v4float %22
> +         %24 = OpFAdd %v4float %20 %23
> +         %26 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_2
> +         %27 = OpLoad %v4float %26
> +         %28 = OpFAdd %v4float %24 %27
> +         %33 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_0
> +         %34 = OpLoad %v4float %33
> +         %35 = OpFSub %v4float %28 %34
> +         %36 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_1
> +         %37 = OpLoad %v4float %36
> +         %38 = OpFSub %v4float %35 %37
> +         %39 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_2
> +         %40 = OpLoad %v4float %39
> +         %41 = OpFSub %v4float %38 %40
> +               OpStore %color %41
> +         %45 = OpLoad %v4float %color
> +         %46 = OpFAdd %v4float %45 %44
> +               OpStore %color %46
> +               OpReturn
> +               OpFunctionEnd
> +
> +[fragment shader]
> +#version 450
> +
> +layout (location = 0) out vec4 color;
> +
> +layout (std140, binding = 5) uniform block16 {
> +	vec4 arr16[3];
> +};
> +
> +/*
> + * This array will have a array_stride of 32.
> + *
> + * Note that there is no way to set a explicit array_stride on GLSL. This GLSL
> + * was used initially to generate the SPIRV-V, and then array stride was tweaked.
> + * That's the reason this is a SPIRV ONLY test. GLSL here is just as reference.
> + */
> +layout (std140, binding = 6) uniform block32 {
> +	vec4 arr32[3];
> +};
> +
> +
> +void main()
> +{
> +	color = arr16[0] + arr16[1] + arr16[2] - arr32[0] - arr32[1] - arr32[2];

IMO this is not a very good way to test the values. If the offsets are 
not working correctly or something else is wrong it's very easy for the 
values to end up as vec4(0.0) or similar. So if both blocks are set 
wrong this test will end up passing.


> +	color += vec4(0.0, 1.0, 0.0, 0.0);
> +}
> +
> +[test]
> +clear color 0.2 0.2 0.2 0.2
> +clear
> +
> +block binding 5
> +block offset 0
> +uniform vec4 arr16[0] 0.0 0.1 0.2 0.3
> +block offset 16
> +uniform vec4 arr16[1] 0.4 0.5 0.6 0.2
> +block offset 32
> +uniform vec4 arr16[2] 0.1 0.3 0.1 0.2
> +
> +block binding 6
> +block offset 0
> +uniform vec4 arr32[0] 0.0 0.1 0.2 0.3
> +block offset 32
> +uniform vec4 arr32[1] 0.4 0.5 0.6 0.2
> +block offset 64
> +uniform vec4 arr32[2] 0.1 0.3 0.1 0.2
> +
> +block binding 5
> +verify program_interface_query GL_UNIFORM_BLOCK block16 GL_NUM_ACTIVE_VARIABLES 1
> +verify program_interface_query GL_UNIFORM_BLOCK block16 GL_BUFFER_DATA_SIZE 48
> +
> +block binding 6
> +verify program_interface_query GL_UNIFORM_BLOCK block32 GL_NUM_ACTIVE_VARIABLES 1
> +verify program_interface_query GL_UNIFORM_BLOCK block32 GL_BUFFER_DATA_SIZE 96
> +
> +verify program_query GL_ACTIVE_UNIFORMS 2
> +
> +draw rect -1 -1 2 2
> +probe all rgba 0.0 1.0 0.0 0.0
>
On 21/09/18 00:13, Timothy Arceri wrote:
> On 16/9/18 2:22 am, Alejandro Piñeiro wrote:
>> For more info, see the long explanation at the commit "arb_gl_spirv:
>> add ubo matrix test with different matrix_stride"
>> ---
>>   .../array-different-array-stride-ubo.shader_test   | 147
>> +++++++++++++++++++++
>>   1 file changed, 147 insertions(+)
>>   create mode 100644
>> tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
>>
>> diff --git
>> a/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
>> b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
>>
>> new file mode 100644
>> index 000000000..0638864b2
>> --- /dev/null
>> +++
>> b/tests/spec/arb_gl_spirv/execution/ubo/array-different-array-stride-ubo.shader_test
>> @@ -0,0 +1,147 @@
>> +# UBO test using two ubos, with an array with the same size and type,
>> +# but setting a different array stride for each one. Used to test that
>> +# the size is properly computed, and the content properly accessed in
>> +# both cases.
>> +
>> +[require]
>> +SPIRV ONLY
>> +GL >= 3.3
>> +GLSL >= 3.30
>> +
>> +[vertex shader passthrough]
>> +
>> +[fragment shader spirv]
>> +; Automatically generated from the GLSL by shader_test_spirv.py, and
>> then edited by hand to set the proper array stride
>> +; SPIR-V
>> +; Version: 1.0
>> +; Generator: Khronos Glslang Reference Front End; 7
>> +; Bound: 47
>> +; Schema: 0
>> +               OpCapability Shader
>> +          %1 = OpExtInstImport "GLSL.std.450"
>> +               OpMemoryModel Logical GLSL450
>> +               OpEntryPoint Fragment %main "main" %color
>> +               OpExecutionMode %main OriginLowerLeft
>> +               OpSource GLSL 450
>> +               OpName %_ ""
>> +               OpName %__0 ""
>> +               OpDecorate %color Location 0
>> +               OpDecorate %_arr_v4float_uint_3 ArrayStride 16
>> +               OpMemberDecorate %block16 0 Offset 0
>> +               OpDecorate %block16 Block
>> +               OpDecorate %_ DescriptorSet 0
>> +               OpDecorate %_ Binding 5
>> +               OpDecorate %_arr_v4float_uint_3_0 ArrayStride 32
>> +               OpMemberDecorate %block32 0 Offset 0
>> +               OpDecorate %block32 Block
>> +               OpDecorate %__0 DescriptorSet 0
>> +               OpDecorate %__0 Binding 6
>> +       %void = OpTypeVoid
>> +          %3 = OpTypeFunction %void
>> +      %float = OpTypeFloat 32
>> +    %v4float = OpTypeVector %float 4
>> +%_ptr_Output_v4float = OpTypePointer Output %v4float
>> +      %color = OpVariable %_ptr_Output_v4float Output
>> +       %uint = OpTypeInt 32 0
>> +     %uint_3 = OpConstant %uint 3
>> +%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
>> +    %block16 = OpTypeStruct %_arr_v4float_uint_3
>> +%_ptr_Uniform_block16 = OpTypePointer Uniform %block16
>> +          %_ = OpVariable %_ptr_Uniform_block16 Uniform
>> +        %int = OpTypeInt 32 1
>> +      %int_0 = OpConstant %int 0
>> +%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
>> +      %int_1 = OpConstant %int 1
>> +      %int_2 = OpConstant %int 2
>> +%_arr_v4float_uint_3_0 = OpTypeArray %v4float %uint_3
>> +    %block32 = OpTypeStruct %_arr_v4float_uint_3_0
>> +%_ptr_Uniform_block32 = OpTypePointer Uniform %block32
>> +        %__0 = OpVariable %_ptr_Uniform_block32 Uniform
>> +    %float_0 = OpConstant %float 0
>> +    %float_1 = OpConstant %float 1
>> +         %44 = OpConstantComposite %v4float %float_0 %float_1
>> %float_0 %float_0
>> +       %main = OpFunction %void None %3
>> +          %5 = OpLabel
>> +         %19 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_0
>> +         %20 = OpLoad %v4float %19
>> +         %22 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_1
>> +         %23 = OpLoad %v4float %22
>> +         %24 = OpFAdd %v4float %20 %23
>> +         %26 = OpAccessChain %_ptr_Uniform_v4float %_ %int_0 %int_2
>> +         %27 = OpLoad %v4float %26
>> +         %28 = OpFAdd %v4float %24 %27
>> +         %33 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_0
>> +         %34 = OpLoad %v4float %33
>> +         %35 = OpFSub %v4float %28 %34
>> +         %36 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_1
>> +         %37 = OpLoad %v4float %36
>> +         %38 = OpFSub %v4float %35 %37
>> +         %39 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %int_2
>> +         %40 = OpLoad %v4float %39
>> +         %41 = OpFSub %v4float %38 %40
>> +               OpStore %color %41
>> +         %45 = OpLoad %v4float %color
>> +         %46 = OpFAdd %v4float %45 %44
>> +               OpStore %color %46
>> +               OpReturn
>> +               OpFunctionEnd
>> +
>> +[fragment shader]
>> +#version 450
>> +
>> +layout (location = 0) out vec4 color;
>> +
>> +layout (std140, binding = 5) uniform block16 {
>> +    vec4 arr16[3];
>> +};
>> +
>> +/*
>> + * This array will have a array_stride of 32.
>> + *
>> + * Note that there is no way to set a explicit array_stride on GLSL.
>> This GLSL
>> + * was used initially to generate the SPIRV-V, and then array stride
>> was tweaked.
>> + * That's the reason this is a SPIRV ONLY test. GLSL here is just as
>> reference.
>> + */
>> +layout (std140, binding = 6) uniform block32 {
>> +    vec4 arr32[3];
>> +};
>> +
>> +
>> +void main()
>> +{
>> +    color = arr16[0] + arr16[1] + arr16[2] - arr32[0] - arr32[1] -
>> arr32[2];
>
> IMO this is not a very good way to test the values. If the offsets are
> not working correctly or something else is wrong it's very easy for
> the values to end up as vec4(0.0) or similar. So if both blocks are
> set wrong this test will end up passing.

Ok, I will change all the tests that do this additions and
substractions, and replace them with checking the value of the
array/matrix as we do in other tests. In addition to what you mention,
that would make the set of tests more consistent.

If you don't mind, I will do that changes locally, but will not send the
new version until we get more feedback on the patches.

>
>
>> +    color += vec4(0.0, 1.0, 0.0, 0.0);
>> +}
>> +
>> +[test]
>> +clear color 0.2 0.2 0.2 0.2
>> +clear
>> +
>> +block binding 5
>> +block offset 0
>> +uniform vec4 arr16[0] 0.0 0.1 0.2 0.3
>> +block offset 16
>> +uniform vec4 arr16[1] 0.4 0.5 0.6 0.2
>> +block offset 32
>> +uniform vec4 arr16[2] 0.1 0.3 0.1 0.2
>> +
>> +block binding 6
>> +block offset 0
>> +uniform vec4 arr32[0] 0.0 0.1 0.2 0.3
>> +block offset 32
>> +uniform vec4 arr32[1] 0.4 0.5 0.6 0.2
>> +block offset 64
>> +uniform vec4 arr32[2] 0.1 0.3 0.1 0.2
>> +
>> +block binding 5
>> +verify program_interface_query GL_UNIFORM_BLOCK block16
>> GL_NUM_ACTIVE_VARIABLES 1
>> +verify program_interface_query GL_UNIFORM_BLOCK block16
>> GL_BUFFER_DATA_SIZE 48
>> +
>> +block binding 6
>> +verify program_interface_query GL_UNIFORM_BLOCK block32
>> GL_NUM_ACTIVE_VARIABLES 1
>> +verify program_interface_query GL_UNIFORM_BLOCK block32
>> GL_BUFFER_DATA_SIZE 96
>> +
>> +verify program_query GL_ACTIVE_UNIFORMS 2
>> +
>> +draw rect -1 -1 2 2
>> +probe all rgba 0.0 1.0 0.0 0.0
>>
>