[19/24] arb_gl_spirv: Add 4 tests for uniform initializers

Submitted by apinheiro on June 20, 2018, 12:40 p.m.

Details

Message ID 20180620124059.25917-20-apinheiro@igalia.com
State New
Headers show
Series "ARB_gl_spirv: support for loading SPIR-V binaries, plus first set of tests" ( rev: 2 ) in Piglit

Not browsing as part of any series.

Commit Message

apinheiro June 20, 2018, 12:40 p.m.
From: Neil Roberts <nroberts@igalia.com>

This includes a basic test with uniform initializers, one using a
mat4x3 type, one using a dvec4 and finally a complex one using a
combination of types (arrays, structs and mats).  # This is the commit
message #2:
---
 .../uniform/initializer-complex.shader_test        | 180 +++++++++++++++++++++
 .../uniform/initializer-dvec4.shader_test          |  68 ++++++++
 .../uniform/initializer-mat4x3.shader_test         |  83 ++++++++++
 .../execution/uniform/initializer.shader_test      |  66 ++++++++
 4 files changed, 397 insertions(+)
 create mode 100644 tests/spec/arb_gl_spirv/execution/uniform/initializer-complex.shader_test
 create mode 100644 tests/spec/arb_gl_spirv/execution/uniform/initializer-dvec4.shader_test
 create mode 100644 tests/spec/arb_gl_spirv/execution/uniform/initializer-mat4x3.shader_test
 create mode 100644 tests/spec/arb_gl_spirv/execution/uniform/initializer.shader_test

Patch hide | download patch | download mbox

diff --git a/tests/spec/arb_gl_spirv/execution/uniform/initializer-complex.shader_test b/tests/spec/arb_gl_spirv/execution/uniform/initializer-complex.shader_test
new file mode 100644
index 000000000..5db111b25
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/uniform/initializer-complex.shader_test
@@ -0,0 +1,180 @@ 
+# Test a uniform with an initializer that has a type containing
+# structs, arrays and matrices.
+
+[require]
+SPIRV YES
+GL >= 3.3
+GLSL >= 4.50
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+
+; This is manually edited by hand to add the uniform constant
+; initialiser because glslang seems to silently drop it.
+
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 4
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %out_color
+               OpExecutionMode %main OriginLowerLeft
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %out_color "out_color"
+               OpName %i "i"
+               OpName %color "color"
+               OpMemberName %color 0 "r"
+               OpMemberName %color 1 "g"
+               OpMemberName %color 2 "b"
+               OpMemberName %color 3 "a"
+               OpName %base "base"
+               OpMemberName %base 0 "colors"
+               OpMemberName %base 1 "transform"
+               OpName %value "value"
+               OpDecorate %out_color Location 0
+               OpDecorate %value Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %out_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %color = OpTypeStruct %float %float %float %float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_color_uint_4 = OpTypeArray %color %uint_4
+%mat4v4float = OpTypeMatrix %v4float 4
+       %base = OpTypeStruct %_arr_color_uint_4 %mat4v4float
+%_ptr_UniformConstant_base = OpTypePointer UniformConstant %base
+        %f01 = OpConstant %float 0.01
+        %f02 = OpConstant %float 0.02
+        %f03 = OpConstant %float 0.03
+        %f04 = OpConstant %float 0.04
+        %f05 = OpConstant %float 0.05
+        %f06 = OpConstant %float 0.06
+        %f07 = OpConstant %float 0.07
+        %f08 = OpConstant %float 0.08
+        %f09 = OpConstant %float 0.09
+        %f11 = OpConstant %float 0.11
+        %f12 = OpConstant %float 0.12
+        %f25 = OpConstant %float 0.25
+        %f85 = OpConstant %float 0.85
+	 %c0 = OpConstantComposite %color %f01 %f02 %f03 %f25
+	 %c1 = OpConstantComposite %color %f04 %f05 %f06 %f25
+	 %c2 = OpConstantComposite %color %f07 %f08 %f09 %f25
+	 %c3 = OpConstantComposite %color %f85 %f11 %f12 %f25
+     %colors = OpConstantComposite %_arr_color_uint_4 %c0 %c1 %c2 %c3
+         %t0 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_0
+         %t1 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_0
+         %t2 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+         %t3 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %transform = OpConstantComposite %mat4v4float %t0 %t1 %t2 %t3
+%initializer = OpConstantComposite %base %colors %transform
+      %value = OpVariable %_ptr_UniformConstant_base UniformConstant %initializer
+%_ptr_UniformConstant_float = OpTypePointer UniformConstant %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_UniformConstant_mat4v4float = OpTypePointer UniformConstant %mat4v4float
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %out_color %11
+               OpStore %i %int_0
+               OpBranch %16
+         %16 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+         %21 = OpLoad %int %i
+         %24 = OpSLessThan %bool %21 %int_4
+               OpBranchConditional %24 %17 %18
+         %17 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_UniformConstant_float %value %int_0 %33 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_UniformConstant_float %value %int_0 %37 %int_1
+         %40 = OpLoad %float %39
+         %41 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_UniformConstant_float %value %int_0 %41 %int_2
+         %44 = OpLoad %float %43
+         %45 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_UniformConstant_float %value %int_0 %45 %int_3
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v4float %36 %40 %44 %48
+         %50 = OpLoad %v4float %out_color
+         %51 = OpFAdd %v4float %50 %49
+               OpStore %out_color %51
+               OpBranch %19
+         %19 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %16
+         %18 = OpLabel
+         %55 = OpAccessChain %_ptr_UniformConstant_mat4v4float %value %int_1
+         %56 = OpLoad %mat4v4float %55
+         %57 = OpLoad %v4float %out_color
+         %58 = OpVectorTimesMatrix %v4float %57 %56
+               OpStore %out_color %58
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout (location = 0) out vec4 out_color;
+
+struct color {
+        float r, g, b, a;
+};
+
+struct base {
+        color colors[4];
+        mat4 transform;
+};
+
+layout (location = 0) uniform base value =
+        base(color[](color(0.01, 0.02, 0.03, 0.25),
+                     color(0.04, 0.05, 0.06, 0.25),
+                     color(0.07, 0.08, 0.09, 0.25),
+                     color(0.85, 0.11, 0.12, 0.25)),
+             mat4(vec4(0.0, 0.0, 1.0, 0.0),
+                  vec4(1.0, 0.0, 0.0, 0.0),
+                  vec4(0.0, 1.0, 0.0, 0.0),
+                  vec4(0.0, 0.0, 0.0, 1.0)));
+
+void main()
+{
+        out_color = vec4(0.0);
+
+        for (int i = 0; i < 4; i++) {
+                out_color += vec4(value.colors[i].r,
+                                  value.colors[i].g,
+                                  value.colors[i].b,
+                                  value.colors[i].a);
+        }
+
+        out_color *= value.transform;
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+draw rect -1 -1 2 2
+probe all rgba 0.30 0.97 0.26 1.0
diff --git a/tests/spec/arb_gl_spirv/execution/uniform/initializer-dvec4.shader_test b/tests/spec/arb_gl_spirv/execution/uniform/initializer-dvec4.shader_test
new file mode 100644
index 000000000..8b9f0952d
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/uniform/initializer-dvec4.shader_test
@@ -0,0 +1,68 @@ 
+# Tests a uniform initialiser with a dvec4 type
+
+[require]
+SPIRV YES
+GLSL >= 4.50
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 6
+; Bound: 19
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float64
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out
+               OpExecutionMode %main OriginLowerLeft
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %color_in "color_in"
+               OpDecorate %color_out Location 0
+               OpDecorate %color_in Location 0
+               OpDecorate %color_in DescriptorSet 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+     %double = OpTypeFloat 64
+   %v4double = OpTypeVector %double 4
+   %double_0 = OpConstant %double 0
+   %double_1 = OpConstant %double 1
+         %14 = OpConstantComposite %v4double %double_0 %double_1 %double_0 %double_0
+%_ptr_UniformConstant_v4double = OpTypePointer UniformConstant %v4double
+   %color_in = OpVariable %_ptr_UniformConstant_v4double UniformConstant %14
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %17 = OpLoad %v4double %color_in
+         %18 = OpFConvert %v4float %17
+               OpStore %color_out %18
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) uniform dvec4 color_in = dvec4(0.0lf, 1.0lf, 0.0lf, 0.0lf);
+layout(location = 0) out vec4 color_out;
+
+void
+main()
+{
+        color_out = vec4(color_in);
+}
+
+[test]
+draw rect -1 -1 1 2
+uniform dvec4 0 0.0 0.0 1.0 0.0
+draw rect 0 -1 1 2
+uniform dvec4 0 0.0 1.0 0.0 0.0
+relative probe rgb (0.25, 0.5) (0.0, 1.0, 0.0)
+relative probe rgb (0.75, 0.5) (0.0, 0.0, 1.0)
diff --git a/tests/spec/arb_gl_spirv/execution/uniform/initializer-mat4x3.shader_test b/tests/spec/arb_gl_spirv/execution/uniform/initializer-mat4x3.shader_test
new file mode 100644
index 000000000..9ebacba5c
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/uniform/initializer-mat4x3.shader_test
@@ -0,0 +1,83 @@ 
+# Tests a uniform initialiser with a mat4x3 type
+
+[require]
+SPIRV YES
+GL >= 3.3
+GLSL >= 4.50
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 6
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out
+               OpExecutionMode %main OriginLowerLeft
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %m "m"
+               OpName %color_in "color_in"
+               OpDecorate %color_out Location 0
+               OpDecorate %m Location 0
+               OpDecorate %m DescriptorSet 0
+               OpDecorate %color_in Location 1
+               OpDecorate %color_in DescriptorSet 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %14 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %15 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %16 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %17 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %18 = OpConstantComposite %mat4v3float %14 %15 %16 %17
+%_ptr_UniformConstant_mat4v3float = OpTypePointer UniformConstant %mat4v3float
+          %m = OpVariable %_ptr_UniformConstant_mat4v3float UniformConstant %18
+%_ptr_UniformConstant_v4float = OpTypePointer UniformConstant %v4float
+   %color_in = OpVariable %_ptr_UniformConstant_v4float UniformConstant
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpLoad %mat4v3float %m
+         %24 = OpLoad %v4float %color_in
+         %25 = OpMatrixTimesVector %v3float %21 %24
+         %26 = OpCompositeExtract %float %25 0
+         %27 = OpCompositeExtract %float %25 1
+         %28 = OpCompositeExtract %float %25 2
+         %29 = OpCompositeConstruct %v4float %26 %27 %28 %float_0
+               OpStore %color_out %29
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) uniform mat4x3 m = mat4x3(0.0, 1.0, 0.0,
+                                               1.0, 0.0, 0.0,
+                                               0.0, 0.0, 1.0,
+                                               0.0, 0.0, 0.0);
+layout(location = 1) uniform vec4 color_in;
+
+layout(location = 0) out vec4 color_out;
+
+void main()
+{
+        color_out = vec4(m * color_in, 0.0);
+}
+
+[test]
+uniform vec4 1 1.0 0.0 0.5 0.0
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.5 0.0
diff --git a/tests/spec/arb_gl_spirv/execution/uniform/initializer.shader_test b/tests/spec/arb_gl_spirv/execution/uniform/initializer.shader_test
new file mode 100644
index 000000000..b46beb837
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/uniform/initializer.shader_test
@@ -0,0 +1,66 @@ 
+# Test a uniform with an initializer
+
+[require]
+SPIRV YES
+GL >= 3.3
+GLSL >= 4.50
+
+[vertex shader passthrough]
+
+[fragment shader spirv]
+
+; This is manually edited by hand to add the uniform constant
+; initialiser because glslang seems to silently drop it.
+
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 4
+; Bound: 13
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color
+               OpExecutionMode %main OriginLowerLeft
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %color "color"
+               OpName %in_color "in_color"
+               OpDecorate %color Location 0
+               OpDecorate %in_color Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+      %color = OpVariable %_ptr_Output_v4float Output
+%_ptr_UniformConstant_v4float = OpTypePointer UniformConstant %v4float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+      %green = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+   %in_color = OpVariable %_ptr_UniformConstant_v4float UniformConstant %green
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %in_color
+               OpStore %color %12
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout (location = 0) out vec4 color;
+
+layout (location = 0) uniform vec4 in_color = vec4(0.0, 1.0, 0.0, 1.0);
+
+void main()
+{
+	color = in_color;
+}
+
+[test]
+clear color 1.0 0.0 0.0 1.0
+clear
+
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0