[v2,11/17] arb_gl_spirv: add ubo matrix test with different matrix_stride

Submitted by apinheiro on Sept. 27, 2018, 9:55 a.m.

Details

Message ID 20180927095507.12642-12-apinheiro@igalia.com
State New
Headers show
Series "arb_gl_spirv: add array test with copy between arrays" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

apinheiro Sept. 27, 2018, 9:55 a.m.
ARB_gl_spirv requires that the SPIR-V includes the explicit matrix
stride. In general layouts are mapping with explicit offset, matrix
stride and array stride. As far as it respect alignments and minimum
offsets, matrix_stride doesn't need to be exactly what OpenGL GLSL
computes, and in fact, the rules are more similar to SPIR-V under
Vulkan.

This tests defines two UBOs, with the same content (on type and data)
but that each one uses a different matrix stride. As they contains the
same content, you should be able to compare one and the other on the
code.

As you can't define different matrix_stride on GLSL, this is a "SPIRV
ONLY" test. GLSL is there as a reference, as it was used to create the
SPIR-V shader, but then tweaked manually.

v2: no expected final substractions/additions value of content, but
    check for real values (Timothy)
---
 .../ubo/matrix/different-matrix-stride.shader_test | 260 +++++++++++++++++++++
 1 file changed, 260 insertions(+)
 create mode 100644 tests/spec/arb_gl_spirv/execution/ubo/matrix/different-matrix-stride.shader_test

Patch hide | download patch | download mbox

diff --git a/tests/spec/arb_gl_spirv/execution/ubo/matrix/different-matrix-stride.shader_test b/tests/spec/arb_gl_spirv/execution/ubo/matrix/different-matrix-stride.shader_test
new file mode 100644
index 000000000..078b5ad76
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/ubo/matrix/different-matrix-stride.shader_test
@@ -0,0 +1,260 @@ 
+# UBO test using two mat3x2. The content is the same, but the matrix
+# stride is different. 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
+GL_ARB_gl_spirv
+
+[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 matrix stride
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 115
+; 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
+               OpMemberDecorate %Block16 0 ColMajor
+               OpMemberDecorate %Block16 0 Offset 0
+               OpMemberDecorate %Block16 0 MatrixStride 16
+               OpDecorate %Block16 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 5
+               OpMemberDecorate %Block32 0 ColMajor
+               OpMemberDecorate %Block32 0 Offset 0
+               OpMemberDecorate %Block32 0 MatrixStride 32
+               OpDecorate %Block32 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 6
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+      %color = OpVariable %_ptr_Output_v4float Output
+         %15 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+    %Block16 = OpTypeStruct %mat3v2float
+%_ptr_Uniform_Block16 = OpTypePointer Uniform %Block16
+          %_ = OpVariable %_ptr_Uniform_Block16 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_31933_2734 = OpConstant %float 31933.2734
+%float_n11642_8975 = OpConstant %float -11642.8975
+         %29 = OpConstantComposite %v2float %float_31933_2734 %float_n11642_8975
+     %v2bool = OpTypeVector %bool 2
+      %int_1 = OpConstant %int 1
+%float_9012_23633 = OpConstant %float 9012.23633
+%float_n6150_84961 = OpConstant %float -6150.84961
+         %41 = OpConstantComposite %v2float %float_9012_23633 %float_n6150_84961
+      %int_2 = OpConstant %int 2
+%float_n10267_4893 = OpConstant %float -10267.4893
+%float_26495_5859 = OpConstant %float 26495.5859
+         %53 = OpConstantComposite %v2float %float_n10267_4893 %float_26495_5859
+    %Block32 = OpTypeStruct %mat3v2float
+%_ptr_Uniform_Block32 = OpTypePointer Uniform %Block32
+        %__0 = OpVariable %_ptr_Uniform_Block32 Uniform
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+ %fail_color = OpVariable %_ptr_Function_v4float Function
+               OpStore %fail_color %12
+               OpStore %color %15
+         %25 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_0
+         %26 = OpLoad %v2float %25
+         %31 = OpFOrdNotEqual %v2bool %26 %29
+         %32 = OpAny %bool %31
+         %33 = OpLogicalNot %bool %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %34 %35
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_1
+         %38 = OpLoad %v2float %37
+         %42 = OpFOrdNotEqual %v2bool %38 %41
+         %43 = OpAny %bool %42
+               OpBranch %35
+         %35 = OpLabel
+         %44 = OpPhi %bool %32 %5 %43 %34
+         %45 = OpLogicalNot %bool %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %46 %47
+         %46 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_2
+         %50 = OpLoad %v2float %49
+         %54 = OpFOrdNotEqual %v2bool %50 %53
+         %55 = OpAny %bool %54
+               OpBranch %47
+         %47 = OpLabel
+         %56 = OpPhi %bool %44 %35 %55 %46
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %57 %58
+         %57 = OpLabel
+         %59 = OpLoad %v4float %fail_color
+               OpStore %color %59
+               OpBranch %58
+         %58 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_0
+         %64 = OpLoad %v2float %63
+         %65 = OpFOrdNotEqual %v2bool %64 %29
+         %66 = OpAny %bool %65
+         %67 = OpLogicalNot %bool %66
+               OpSelectionMerge %69 None
+               OpBranchConditional %67 %68 %69
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_1
+         %71 = OpLoad %v2float %70
+         %72 = OpFOrdNotEqual %v2bool %71 %41
+         %73 = OpAny %bool %72
+               OpBranch %69
+         %69 = OpLabel
+         %74 = OpPhi %bool %66 %58 %73 %68
+         %75 = OpLogicalNot %bool %74
+               OpSelectionMerge %77 None
+               OpBranchConditional %75 %76 %77
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_2
+         %79 = OpLoad %v2float %78
+         %80 = OpFOrdNotEqual %v2bool %79 %53
+         %81 = OpAny %bool %80
+               OpBranch %77
+         %77 = OpLabel
+         %82 = OpPhi %bool %74 %69 %81 %76
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %83 %84
+         %83 = OpLabel
+         %85 = OpLoad %v4float %fail_color
+               OpStore %color %85
+               OpBranch %84
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_0
+         %87 = OpLoad %v2float %86
+         %88 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_0
+         %89 = OpLoad %v2float %88
+         %90 = OpFOrdNotEqual %v2bool %87 %89
+         %91 = OpAny %bool %90
+         %92 = OpLogicalNot %bool %91
+               OpSelectionMerge %94 None
+               OpBranchConditional %92 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_1
+         %96 = OpLoad %v2float %95
+         %97 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_1
+         %98 = OpLoad %v2float %97
+         %99 = OpFOrdNotEqual %v2bool %96 %98
+        %100 = OpAny %bool %99
+               OpBranch %94
+         %94 = OpLabel
+        %101 = OpPhi %bool %91 %84 %100 %93
+        %102 = OpLogicalNot %bool %101
+               OpSelectionMerge %104 None
+               OpBranchConditional %102 %103 %104
+        %103 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0 %int_2
+        %106 = OpLoad %v2float %105
+        %107 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %int_2
+        %108 = OpLoad %v2float %107
+        %109 = OpFOrdNotEqual %v2bool %106 %108
+        %110 = OpAny %bool %109
+               OpBranch %104
+        %104 = OpLabel
+        %111 = OpPhi %bool %101 %94 %110 %103
+               OpSelectionMerge %113 None
+               OpBranchConditional %111 %112 %113
+        %112 = OpLabel
+        %114 = OpLoad %v4float %fail_color
+               OpStore %color %114
+               OpBranch %113
+        %113 = OpLabel
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+
+#version 450
+
+layout (location = 0) out vec4 color;
+layout (std140, binding = 5, column_major) uniform Block16
+ {
+ mat3x2 m16;
+ };
+
+/* Note that there is no way to set the matrix_stride on GLSL. This GLSL was used
+ * initially to generate the SPIRV-V, and then matrix stride was tweaked.
+ * That's the reason this is a SPIRV ONLY test. GLSL here is just as reference.
+ */
+layout (std140, binding = 6, column_major) uniform Block32
+ {
+ mat3x2 m32;
+ };
+
+void main()
+
+{
+	vec4 fail_color = vec4(1.0, 0.0, 0.0, 1.0);
+	color = vec4(0.0, 1.0, 0.0, 1.0);
+
+	if (m16[0] != vec2(31933.27393, -11642.8972152) ||
+            m16[1] != vec2(9012.23624018, -6150.84975967) ||
+            m16[2] != vec2(-10267.4895552, 26495.5859007)) {
+	    color = fail_color;
+	}
+
+	if (m32[0] != vec2(31933.27393, -11642.8972152) ||
+            m32[1] != vec2(9012.23624018, -6150.84975967) ||
+            m32[2] != vec2(-10267.4895552, 26495.5859007)) {
+	    color = fail_color;
+	}
+
+	if (m16[0] != m32[0] ||
+            m16[1] != m32[1] ||
+            m16[2] != m32[2]){
+	    color = fail_color;
+	}
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+
+block binding 5
+block offset 0
+block matrix stride 16
+block row major 0
+uniform mat3x2 m16 31933.27393 -11642.8972152 9012.23624018 -6150.84975967 -10267.4895552 26495.5859007
+
+block binding 6
+block offset 0
+block matrix stride 32
+block row major 0
+uniform mat3x2 m32 31933.27393 -11642.8972152 9012.23624018 -6150.84975967 -10267.4895552 26495.5859007
+
+block binding 5
+verify program_interface_query GL_UNIFORM_BLOCK ComponentsBlock GL_NUM_ACTIVE_VARIABLES 1
+verify program_interface_query GL_UNIFORM_BLOCK ComponentsBlock GL_BUFFER_DATA_SIZE 48
+
+block binding 6
+verify program_interface_query GL_UNIFORM_BLOCK ComponentsBlock GL_NUM_ACTIVE_VARIABLES 1
+verify program_interface_query GL_UNIFORM_BLOCK ComponentsBlock 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 1.0