From: Neil Roberts <nrobe...@igalia.com> This is copied from arb_enhanced_layouts/execution/block-member-locations --- ...o-block-member-layout-location.shader_test | 257 ++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 tests/spec/arb_gl_spirv/execution/sso-block-member-layout-location.shader_test
diff --git a/tests/spec/arb_gl_spirv/execution/sso-block-member-layout-location.shader_test b/tests/spec/arb_gl_spirv/execution/sso-block-member-layout-location.shader_test new file mode 100644 index 000000000..a796252c8 --- /dev/null +++ b/tests/spec/arb_gl_spirv/execution/sso-block-member-layout-location.shader_test @@ -0,0 +1,257 @@ +// Test that interface block members are correctly matched by explicit +// location. +// +// This is copied from arb_enhanced_layouts/execution/block-member-locations/ + +[require] +SPIRV YES +GLSL >= 4.40 +SSO ENABLED +GL_ARB_gl_spirv + +[vertex 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: 40 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %name %_ %piglit_vertex %gl_VertexID %gl_InstanceID + OpSource GLSL 450 + OpName %main "main" + OpName %block "block" + OpMemberName %block 0 "c" + OpMemberName %block 1 "d" + OpMemberName %block 2 "a" + OpMemberName %block 3 "b" + OpName %name "name" + 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 %piglit_vertex "piglit_vertex" + OpName %gl_VertexID "gl_VertexID" + OpName %gl_InstanceID "gl_InstanceID" + OpMemberDecorate %block 0 Location 2 + OpMemberDecorate %block 1 Location 3 + OpMemberDecorate %block 2 Location 0 + OpMemberDecorate %block 3 Location 1 + OpDecorate %block Block + OpDecorate %name Location 0 + 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 %piglit_vertex Location 0 + OpDecorate %gl_VertexID BuiltIn VertexId + OpDecorate %gl_InstanceID BuiltIn InstanceId + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %block = OpTypeStruct %v4float %v4float %v4float %v4float +%_ptr_Output_block = OpTypePointer Output %block + %name = OpVariable %_ptr_Output_block Output + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 + %float_1 = OpConstant %float 1 + %float_0 = OpConstant %float 0 + %15 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %int_3 = OpConstant %int 3 + %19 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1 + %int_0 = OpConstant %int 0 + %22 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1 + %int_1 = OpConstant %int 1 + %25 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1 + %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 +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex + %_ = OpVariable %_ptr_Output_gl_PerVertex Output +%_ptr_Input_v4float = OpTypePointer Input %v4float +%piglit_vertex = OpVariable %_ptr_Input_v4float Input +%_ptr_Input_int = OpTypePointer Input %int +%gl_VertexID = OpVariable %_ptr_Input_int Input +%gl_InstanceID = OpVariable %_ptr_Input_int Input + %main = OpFunction %void None %3 + %5 = OpLabel + %17 = OpAccessChain %_ptr_Output_v4float %name %int_2 + OpStore %17 %15 + %20 = OpAccessChain %_ptr_Output_v4float %name %int_3 + OpStore %20 %19 + %23 = OpAccessChain %_ptr_Output_v4float %name %int_0 + OpStore %23 %22 + %26 = OpAccessChain %_ptr_Output_v4float %name %int_1 + OpStore %26 %25 + %35 = OpLoad %v4float %piglit_vertex + %36 = OpAccessChain %_ptr_Output_v4float %_ %int_0 + OpStore %36 %35 + OpReturn + OpFunctionEnd + +[vertex shader] +#version 440 + +in vec4 piglit_vertex; + +layout(location = 0) out block { + layout(location = 2) vec4 c; + vec4 d; + layout(location = 0) vec4 a; + vec4 b; +} name; + +void main() +{ + name.a = vec4(1.0, 0.0, 0.0, 1.0); + name.b = vec4(0.0, 1.0, 0.0, 1.0); + name.c = vec4(0.0, 0.0, 1.0, 1.0); + name.d = vec4(1.0, 1.0, 1.0, 1.0); + + gl_Position = piglit_vertex; +} + +[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: 46 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %color %a %b %c %d + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 450 + OpName %main "main" + OpName %i "i" + OpName %color "color" + OpName %a "a" + OpName %b "b" + OpName %c "c" + OpName %d "d" + OpDecorate %i Location 0 + OpDecorate %i DescriptorSet 0 + OpDecorate %color Location 0 + OpDecorate %a Location 0 + OpDecorate %b Location 1 + OpDecorate %c Location 2 + OpDecorate %d Location 3 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 +%_ptr_UniformConstant_int = OpTypePointer UniformConstant %int + %i = OpVariable %_ptr_UniformConstant_int UniformConstant + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %color = OpVariable %_ptr_Output_v4float Output +%_ptr_Input_v4float = OpTypePointer Input %v4float + %a = OpVariable %_ptr_Input_v4float Input + %int_1 = OpConstant %int 1 + %b = OpVariable %_ptr_Input_v4float Input + %int_2 = OpConstant %int 2 + %c = OpVariable %_ptr_Input_v4float Input + %int_3 = OpConstant %int 3 + %d = OpVariable %_ptr_Input_v4float Input + %main = OpFunction %void None %3 + %5 = OpLabel + %9 = OpLoad %int %i + %12 = OpIEqual %bool %9 %int_0 + OpSelectionMerge %14 None + OpBranchConditional %12 %13 %22 + %13 = OpLabel + %21 = OpLoad %v4float %a + OpStore %color %21 + OpBranch %14 + %22 = OpLabel + %23 = OpLoad %int %i + %25 = OpIEqual %bool %23 %int_1 + OpSelectionMerge %27 None + OpBranchConditional %25 %26 %30 + %26 = OpLabel + %29 = OpLoad %v4float %b + OpStore %color %29 + OpBranch %27 + %30 = OpLabel + %31 = OpLoad %int %i + %33 = OpIEqual %bool %31 %int_2 + OpSelectionMerge %35 None + OpBranchConditional %33 %34 %38 + %34 = OpLabel + %37 = OpLoad %v4float %c + OpStore %color %37 + OpBranch %35 + %38 = OpLabel + %39 = OpLoad %int %i + %41 = OpIEqual %bool %39 %int_3 + OpSelectionMerge %43 None + OpBranchConditional %41 %42 %43 + %42 = OpLabel + %45 = OpLoad %v4float %d + OpStore %color %45 + OpBranch %43 + %43 = OpLabel + OpBranch %35 + %35 = OpLabel + OpBranch %27 + %27 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd + +[fragment shader] +#version 440 + +layout(location = 0) in vec4 a; +layout(location = 1) in vec4 b; +layout(location = 2) in vec4 c; +layout(location = 3) in vec4 d; + +layout(location = 0) uniform int i; + +out vec4 color; + +void main() +{ + if (i == 0) { + color = a; + } else if (i == 1) { + color = b; + } else if (i == 2) { + color = c; + } else if (i == 3) { + color = d; + } +} + +[test] +active shader program GL_FRAGMENT_SHADER + +uniform int 0 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 0 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 0 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 0 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) -- 2.19.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit