Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2019-10-07 11:31:42 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2019-10-07 11:52:16 +0300
commita0c13e4ee85ebea9640671fe20f50e4e88f90a48 (patch)
treef1cc8f5593ed314080a8298759399e4397ecd2f3 /shaders-hlsl-no-opt
parent2d20b1ab936a41b567279c2e80f7bc3bd8785c58 (diff)
Do not consider aliased struct types if the master is not a block.
It is possible for a shader to declare two plain struct types which simply share the same OpName without there being an implicit value/buffer alias relationship. For to_member_name(), make sure to use the type alias master when resolving member names. The member name may be different in a type alias master if the SPIR-V is being intentionally difficult.
Diffstat (limited to 'shaders-hlsl-no-opt')
-rw-r--r--shaders-hlsl-no-opt/asm/comp/aliased-struct-divergent-member-name.asm.comp77
1 files changed, 77 insertions, 0 deletions
diff --git a/shaders-hlsl-no-opt/asm/comp/aliased-struct-divergent-member-name.asm.comp b/shaders-hlsl-no-opt/asm/comp/aliased-struct-divergent-member-name.asm.comp
new file mode 100644
index 00000000..87aee2db
--- /dev/null
+++ b/shaders-hlsl-no-opt/asm/comp/aliased-struct-divergent-member-name.asm.comp
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 37
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 450
+ OpName %main "main"
+ OpName %T "T"
+ OpMemberName %T 0 "a"
+ OpName %v "v"
+ OpName %T_0 "T"
+ OpMemberName %T_0 0 "b"
+ OpName %SSBO1 "SSBO1"
+ OpMemberName %SSBO1 0 "foo"
+ OpName %_ ""
+ OpName %T_1 "T"
+ OpMemberName %T_1 0 "c"
+ OpName %SSBO2 "SSBO2"
+ OpMemberName %SSBO2 0 "bar"
+ OpName %__0 ""
+ OpMemberDecorate %T_0 0 Offset 0
+ OpDecorate %_runtimearr_T_0 ArrayStride 4
+ OpMemberDecorate %SSBO1 0 Offset 0
+ OpDecorate %SSBO1 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpMemberDecorate %T_1 0 Offset 0
+ OpDecorate %_runtimearr_T_1 ArrayStride 16
+ OpMemberDecorate %SSBO2 0 Offset 0
+ OpDecorate %SSBO2 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %T = OpTypeStruct %float
+%_ptr_Function_T = OpTypePointer Function %T
+ %float_40 = OpConstant %float 40
+ %11 = OpConstantComposite %T %float_40
+ %T_0 = OpTypeStruct %float
+%_runtimearr_T_0 = OpTypeRuntimeArray %T_0
+ %SSBO1 = OpTypeStruct %_runtimearr_T_0
+%_ptr_Uniform_SSBO1 = OpTypePointer Uniform %SSBO1
+ %_ = OpVariable %_ptr_Uniform_SSBO1 Uniform
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %int_10 = OpConstant %int 10
+%_ptr_Uniform_T_0 = OpTypePointer Uniform %T_0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %T_1 = OpTypeStruct %float
+%_runtimearr_T_1 = OpTypeRuntimeArray %T_1
+ %SSBO2 = OpTypeStruct %_runtimearr_T_1
+%_ptr_Uniform_SSBO2 = OpTypePointer Uniform %SSBO2
+ %__0 = OpVariable %_ptr_Uniform_SSBO2 Uniform
+ %int_30 = OpConstant %int 30
+%_ptr_Uniform_T_1 = OpTypePointer Uniform %T_1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %v = OpVariable %_ptr_Function_T Function
+ OpStore %v %11
+ %20 = OpLoad %T %v
+ %22 = OpAccessChain %_ptr_Uniform_T_0 %_ %int_0 %int_10
+ %23 = OpCompositeExtract %float %20 0
+ %25 = OpAccessChain %_ptr_Uniform_float %22 %int_0
+ OpStore %25 %23
+ %32 = OpLoad %T %v
+ %34 = OpAccessChain %_ptr_Uniform_T_1 %__0 %int_0 %int_30
+ %35 = OpCompositeExtract %float %32 0
+ %36 = OpAccessChain %_ptr_Uniform_float %34 %int_0
+ OpStore %36 %35
+ OpReturn
+ OpFunctionEnd