[Piglit] [PATCH 40/63] arb_gl_spirv: Add a test for gl_PatchVerticesIn

Alejandro PiƱeiro apinheiro at igalia.com
Sat Feb 23 23:45:28 UTC 2019


From: Neil Roberts <nroberts at igalia.com>

---
 .../tcs-patch-vertices-in.shader_test         | 373 ++++++++++++++++++
 1 file changed, 373 insertions(+)
 create mode 100644 tests/spec/arb_gl_spirv/execution/tcs-patch-vertices-in.shader_test

diff --git a/tests/spec/arb_gl_spirv/execution/tcs-patch-vertices-in.shader_test b/tests/spec/arb_gl_spirv/execution/tcs-patch-vertices-in.shader_test
new file mode 100644
index 000000000..409efc899
--- /dev/null
+++ b/tests/spec/arb_gl_spirv/execution/tcs-patch-vertices-in.shader_test
@@ -0,0 +1,373 @@
+# A simple test that gl_PatchVerticesIn has the right value.
+
+[require]
+SPIRV YES
+GL >= 3.3
+GLSL >= 4.50
+GL_ARB_gl_spirv
+
+[vertex shader passthrough]
+
+[tessellation control 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: 67
+; Schema: 0
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationControl %main "main" %gl_out %gl_InvocationID %gl_in %gl_TessLevelOuter %gl_TessLevelInner %gl_PatchVerticesIn %color_out
+               OpExecutionMode %main OutputVertices 3
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+               OpName %gl_out "gl_out"
+               OpName %gl_InvocationID "gl_InvocationID"
+               OpName %gl_PerVertex_0 "gl_PerVertex"
+               OpMemberName %gl_PerVertex_0 0 "gl_Position"
+               OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+               OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+               OpName %gl_in "gl_in"
+               OpName %gl_TessLevelOuter "gl_TessLevelOuter"
+               OpName %gl_TessLevelInner "gl_TessLevelInner"
+               OpName %gl_PatchVerticesIn "gl_PatchVerticesIn"
+               OpName %expected "expected"
+               OpName %color_out "color_out"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_InvocationID BuiltIn InvocationId
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %gl_TessLevelOuter Patch
+               OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+               OpDecorate %gl_TessLevelInner Patch
+               OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+               OpDecorate %gl_PatchVerticesIn BuiltIn PatchVertices
+               OpDecorate %expected Location 0
+               OpDecorate %expected DescriptorSet 0
+               OpDecorate %expected Binding 0
+               OpDecorate %color_out Location 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+     %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+     %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+        %int = OpTypeInt 32 1
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+      %int_0 = OpConstant %int 0
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+    %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %_arr_float_uint_4 %float_1 %float_1 %float_1 %float_1
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+         %42 = OpConstantComposite %_arr_float_uint_2 %float_1 %float_1
+%gl_PatchVerticesIn = OpVariable %_ptr_Input_int Input
+%_ptr_UniformConstant_int = OpTypePointer UniformConstant %int
+   %expected = OpVariable %_ptr_UniformConstant_int UniformConstant
+       %bool = OpTypeBool
+%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+  %color_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+  %float_255 = OpConstant %float 255
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %19 = OpLoad %int %gl_InvocationID
+         %26 = OpLoad %int %gl_InvocationID
+         %28 = OpAccessChain %_ptr_Input_v4float %gl_in %26 %int_0
+         %29 = OpLoad %v4float %28
+         %31 = OpAccessChain %_ptr_Output_v4float %gl_out %19 %int_0
+               OpStore %31 %29
+               OpStore %gl_TessLevelOuter %37
+               OpStore %gl_TessLevelInner %42
+         %44 = OpLoad %int %gl_PatchVerticesIn
+         %47 = OpLoad %int %expected
+         %49 = OpIEqual %bool %44 %47
+               OpSelectionMerge %51 None
+               OpBranchConditional %49 %50 %59
+         %50 = OpLabel
+         %55 = OpLoad %int %gl_InvocationID
+         %58 = OpAccessChain %_ptr_Output_v4float %color_out %55
+               OpStore %58 %57
+               OpBranch %51
+         %59 = OpLabel
+         %60 = OpLoad %int %gl_InvocationID
+         %61 = OpLoad %int %gl_PatchVerticesIn
+         %62 = OpConvertSToF %float %61
+         %64 = OpFDiv %float %62 %float_255
+         %65 = OpCompositeConstruct %v4float %float_1 %float_0 %64 %float_1
+         %66 = OpAccessChain %_ptr_Output_v4float %color_out %60
+               OpStore %66 %65
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+
+[tessellation control shader]
+#version 450
+
+layout(vertices = 3) out;
+layout(location = 0) uniform int expected;
+layout(location = 0) out vec4 color_out[];
+
+void
+main()
+{
+        gl_out[gl_InvocationID].gl_Position =
+                gl_in[gl_InvocationID].gl_Position;
+        gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0);
+        gl_TessLevelInner = float[2](1.0, 1.0);
+
+        if (gl_PatchVerticesIn == expected) {
+                color_out[gl_InvocationID] = vec4(0.0, 1.0, 0.0, 1.0);
+        } else {
+                color_out[gl_InvocationID] =
+                        vec4(1.0, 0.0, gl_PatchVerticesIn / 255.0, 1.0);
+        }
+}
+
+[tessellation evaluation 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: 70
+; Schema: 0
+               OpCapability Tessellation
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint TessellationEvaluation %main "main" %color_out %color_in %gl_TessCoord %_ %gl_in
+               OpExecutionMode %main Triangles
+               OpExecutionMode %main SpacingEqual
+               OpExecutionMode %main VertexOrderCcw
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %color_in "color_in"
+               OpName %gl_TessCoord "gl_TessCoord"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+               OpName %_ ""
+               OpName %gl_PerVertex_0 "gl_PerVertex"
+               OpMemberName %gl_PerVertex_0 0 "gl_Position"
+               OpMemberName %gl_PerVertex_0 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex_0 2 "gl_ClipDistance"
+               OpMemberName %gl_PerVertex_0 3 "gl_CullDistance"
+               OpName %gl_in "gl_in"
+               OpDecorate %color_out Location 0
+               OpDecorate %color_in Location 0
+               OpDecorate %gl_TessCoord BuiltIn TessCoord
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex Block
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex_0 Block
+       %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
+       %uint = OpTypeInt 32 0
+    %uint_32 = OpConstant %uint 32
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+   %color_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+      %int_2 = OpConstant %int 2
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %18 = OpAccessChain %_ptr_Input_v4float %color_in %int_0
+         %19 = OpLoad %v4float %18
+         %25 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpVectorTimesScalar %v4float %19 %26
+         %29 = OpAccessChain %_ptr_Input_v4float %color_in %int_1
+         %30 = OpLoad %v4float %29
+         %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %33 = OpLoad %float %32
+         %34 = OpVectorTimesScalar %v4float %30 %33
+         %35 = OpFAdd %v4float %27 %34
+         %37 = OpAccessChain %_ptr_Input_v4float %color_in %int_2
+         %38 = OpLoad %v4float %37
+         %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %41 = OpLoad %float %40
+         %42 = OpVectorTimesScalar %v4float %38 %41
+         %43 = OpFAdd %v4float %35 %42
+               OpStore %color_out %43
+         %52 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %53 = OpLoad %v4float %52
+         %54 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+         %55 = OpLoad %float %54
+         %56 = OpVectorTimesScalar %v4float %53 %55
+         %57 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+         %58 = OpLoad %v4float %57
+         %59 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+         %60 = OpLoad %float %59
+         %61 = OpVectorTimesScalar %v4float %58 %60
+         %62 = OpFAdd %v4float %56 %61
+         %63 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+         %64 = OpLoad %v4float %63
+         %65 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+         %66 = OpLoad %float %65
+         %67 = OpVectorTimesScalar %v4float %64 %66
+         %68 = OpFAdd %v4float %62 %67
+         %69 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %69 %68
+               OpReturn
+               OpFunctionEnd
+
+[tessellation evaluation shader]
+#version 450
+
+layout(triangles, equal_spacing) in;
+
+layout(location = 0) in vec4 color_in[];
+layout(location = 0) out vec4 color_out;
+
+void
+main()
+{
+        color_out = (color_in[0] * gl_TessCoord[0] +
+                     color_in[1] * gl_TessCoord[1] +
+                     color_in[2] * gl_TessCoord[2]);
+        gl_Position = (gl_in[0].gl_Position * gl_TessCoord[0] +
+                       gl_in[1].gl_Position * gl_TessCoord[1] +
+                       gl_in[2].gl_Position * gl_TessCoord[2]);
+}
+
+[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: 13
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %color_in
+               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
+       %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
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %color_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %12 = OpLoad %v4float %color_in
+               OpStore %color_out %12
+               OpReturn
+               OpFunctionEnd
+
+[fragment shader]
+#version 450
+
+layout(location = 0) in vec4 color_in;
+layout(location = 0) out vec4 color_out;
+
+void
+main()
+{
+        color_out = color_in;
+}
+
+[vertex data]
+0/float/vec2
+-1 -1
+0 -1
+-1 1
+-1 1
+0 -1
+0 1
+0 -1
+1 -1
+0 1
+0 0
+0 1
+1 -1
+1 1
+0 0
+
+[test]
+clear color 0.9 0.0 0.0 0.0
+clear
+
+uniform int 0 3
+patch parameter vertices 3
+draw arrays GL_PATCHES 0 6
+
+uniform int 0 4
+patch parameter vertices 4
+draw arrays GL_PATCHES 6 8
+
+probe all rgba 0.0 1.0 0.0 1.0
-- 
2.19.1



More information about the Piglit mailing list