mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 11:30:06 +00:00
HLSL: fix qualifier propagation from user struct types to block definitions.
The HLSL FE tracks four versions of a declared type to avoid losing information, since it is not (at type-decl time) known how the type will be used downstream. If such a type was used in a cbuffer declaration, the cbuffer type's members should have been using the uniform form of the original user structure type, but were not. This would manifest as matrix qualifiers (and other things, such as pack offsets) on user struct members going missing in the SPIR-V module if the struct type was a member of a cbuffer, like so: struct MyBuffer { row_major float4x4 mat1; column_major float4x4 mat2; }; cbuffer Example { MyBuffer g_MyBuffer; }; Fixes: #789
This commit is contained in:
parent
2b4f77f2dc
commit
898f5fbef7
187
Test/baseResults/hlsl.matpack-1.frag.out
Normal file
187
Test/baseResults/hlsl.matpack-1.frag.out
Normal file
@ -0,0 +1,187 @@
|
||||
hlsl.matpack-1.frag
|
||||
Shader version: 500
|
||||
gl_FragCoord origin is upper left
|
||||
0:? Sequence
|
||||
0:23 Function Definition: @main( ( temp 4-component vector of float)
|
||||
0:23 Function Parameters:
|
||||
0:? Sequence
|
||||
0:25 Branch: Return with expression
|
||||
0:24 add ( temp 4-component vector of float)
|
||||
0:24 vector-times-matrix ( temp 4-component vector of float)
|
||||
0:24 vec1: direct index for structure ( temp 4-component vector of float)
|
||||
0:24 g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo})
|
||||
0:24 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:24 Constant:
|
||||
0:24 0 (const uint)
|
||||
0:24 Constant:
|
||||
0:24 2 (const int)
|
||||
0:24 mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
|
||||
0:24 g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo})
|
||||
0:24 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:24 Constant:
|
||||
0:24 0 (const uint)
|
||||
0:24 Constant:
|
||||
0:24 0 (const int)
|
||||
0:25 vector-times-matrix ( temp 4-component vector of float)
|
||||
0:25 vec1: direct index for structure ( temp 4-component vector of float)
|
||||
0:25 g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1})
|
||||
0:25 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:25 Constant:
|
||||
0:25 1 (const uint)
|
||||
0:25 Constant:
|
||||
0:25 1 (const int)
|
||||
0:25 mat1: direct index for structure (layout( column_major) temp 4X4 matrix of float)
|
||||
0:25 g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1})
|
||||
0:25 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:25 Constant:
|
||||
0:25 1 (const uint)
|
||||
0:25 Constant:
|
||||
0:25 0 (const int)
|
||||
0:23 Function Definition: main( ( temp void)
|
||||
0:23 Function Parameters:
|
||||
0:? Sequence
|
||||
0:23 move second child to first child ( temp 4-component vector of float)
|
||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||
0:23 Function Call: @main( ( temp 4-component vector of float)
|
||||
0:? Linker Objects
|
||||
0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||
|
||||
|
||||
Linked fragment stage:
|
||||
|
||||
|
||||
Shader version: 500
|
||||
gl_FragCoord origin is upper left
|
||||
0:? Sequence
|
||||
0:23 Function Definition: @main( ( temp 4-component vector of float)
|
||||
0:23 Function Parameters:
|
||||
0:? Sequence
|
||||
0:25 Branch: Return with expression
|
||||
0:24 add ( temp 4-component vector of float)
|
||||
0:24 vector-times-matrix ( temp 4-component vector of float)
|
||||
0:24 vec1: direct index for structure ( temp 4-component vector of float)
|
||||
0:24 g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo})
|
||||
0:24 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:24 Constant:
|
||||
0:24 0 (const uint)
|
||||
0:24 Constant:
|
||||
0:24 2 (const int)
|
||||
0:24 mat1: direct index for structure (layout( row_major) temp 4X4 matrix of float)
|
||||
0:24 g_MyBuffer1: direct index for structure (layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo})
|
||||
0:24 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:24 Constant:
|
||||
0:24 0 (const uint)
|
||||
0:24 Constant:
|
||||
0:24 0 (const int)
|
||||
0:25 vector-times-matrix ( temp 4-component vector of float)
|
||||
0:25 vec1: direct index for structure ( temp 4-component vector of float)
|
||||
0:25 g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1})
|
||||
0:25 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:25 Constant:
|
||||
0:25 1 (const uint)
|
||||
0:25 Constant:
|
||||
0:25 1 (const int)
|
||||
0:25 mat1: direct index for structure (layout( column_major) temp 4X4 matrix of float)
|
||||
0:25 g_MyBuffer2: direct index for structure (layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1})
|
||||
0:25 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:25 Constant:
|
||||
0:25 1 (const uint)
|
||||
0:25 Constant:
|
||||
0:25 0 (const int)
|
||||
0:23 Function Definition: main( ( temp void)
|
||||
0:23 Function Parameters:
|
||||
0:? Sequence
|
||||
0:23 move second child to first child ( temp 4-component vector of float)
|
||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||
0:23 Function Call: @main( ( temp 4-component vector of float)
|
||||
0:? Linker Objects
|
||||
0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform structure{layout( row_major) temp 4X4 matrix of float mat1, layout( column_major) temp 4X4 matrix of float mat2, temp 4-component vector of float vec1, temp float foo} g_MyBuffer1, layout( row_major std140) uniform structure{layout( column_major) temp 4X4 matrix of float mat1, temp 4-component vector of float vec1} g_MyBuffer2, layout( row_major std140) uniform 4X4 matrix of float mat1a})
|
||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||
|
||||
// Module Version 10000
|
||||
// Generated by (magic number): 80001
|
||||
// Id's are bound by 39
|
||||
|
||||
Capability Shader
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
MemoryModel Logical GLSL450
|
||||
EntryPoint Fragment 4 "main" 37
|
||||
ExecutionMode 4 OriginUpperLeft
|
||||
Source HLSL 500
|
||||
Name 4 "main"
|
||||
Name 9 "@main("
|
||||
Name 12 "MyBuffer1"
|
||||
MemberName 12(MyBuffer1) 0 "mat1"
|
||||
MemberName 12(MyBuffer1) 1 "mat2"
|
||||
MemberName 12(MyBuffer1) 2 "vec1"
|
||||
MemberName 12(MyBuffer1) 3 "foo"
|
||||
Name 13 "MyBuffer2"
|
||||
MemberName 13(MyBuffer2) 0 "mat1"
|
||||
MemberName 13(MyBuffer2) 1 "vec1"
|
||||
Name 14 "Example"
|
||||
MemberName 14(Example) 0 "g_MyBuffer1"
|
||||
MemberName 14(Example) 1 "g_MyBuffer2"
|
||||
MemberName 14(Example) 2 "mat1a"
|
||||
Name 16 ""
|
||||
Name 37 "@entryPointOutput"
|
||||
MemberDecorate 12(MyBuffer1) 0 RowMajor
|
||||
MemberDecorate 12(MyBuffer1) 0 Offset 0
|
||||
MemberDecorate 12(MyBuffer1) 0 MatrixStride 16
|
||||
MemberDecorate 12(MyBuffer1) 1 ColMajor
|
||||
MemberDecorate 12(MyBuffer1) 1 Offset 64
|
||||
MemberDecorate 12(MyBuffer1) 1 MatrixStride 16
|
||||
MemberDecorate 12(MyBuffer1) 2 Offset 128
|
||||
MemberDecorate 12(MyBuffer1) 3 Offset 144
|
||||
MemberDecorate 13(MyBuffer2) 0 ColMajor
|
||||
MemberDecorate 13(MyBuffer2) 0 Offset 0
|
||||
MemberDecorate 13(MyBuffer2) 0 MatrixStride 16
|
||||
MemberDecorate 13(MyBuffer2) 1 Offset 64
|
||||
MemberDecorate 14(Example) 0 Offset 0
|
||||
MemberDecorate 14(Example) 1 Offset 160
|
||||
MemberDecorate 14(Example) 2 RowMajor
|
||||
MemberDecorate 14(Example) 2 Offset 240
|
||||
MemberDecorate 14(Example) 2 MatrixStride 16
|
||||
Decorate 14(Example) Block
|
||||
Decorate 16 DescriptorSet 0
|
||||
Decorate 37(@entryPointOutput) Location 0
|
||||
2: TypeVoid
|
||||
3: TypeFunction 2
|
||||
6: TypeFloat 32
|
||||
7: TypeVector 6(float) 4
|
||||
8: TypeFunction 7(fvec4)
|
||||
11: TypeMatrix 7(fvec4) 4
|
||||
12(MyBuffer1): TypeStruct 11 11 7(fvec4) 6(float)
|
||||
13(MyBuffer2): TypeStruct 11 7(fvec4)
|
||||
14(Example): TypeStruct 12(MyBuffer1) 13(MyBuffer2) 11
|
||||
15: TypePointer Uniform 14(Example)
|
||||
16: 15(ptr) Variable Uniform
|
||||
17: TypeInt 32 1
|
||||
18: 17(int) Constant 0
|
||||
19: 17(int) Constant 2
|
||||
20: TypePointer Uniform 7(fvec4)
|
||||
23: TypePointer Uniform 11
|
||||
27: 17(int) Constant 1
|
||||
36: TypePointer Output 7(fvec4)
|
||||
37(@entryPointOutput): 36(ptr) Variable Output
|
||||
4(main): 2 Function None 3
|
||||
5: Label
|
||||
38: 7(fvec4) FunctionCall 9(@main()
|
||||
Store 37(@entryPointOutput) 38
|
||||
Return
|
||||
FunctionEnd
|
||||
9(@main(): 7(fvec4) Function None 8
|
||||
10: Label
|
||||
21: 20(ptr) AccessChain 16 18 19
|
||||
22: 7(fvec4) Load 21
|
||||
24: 23(ptr) AccessChain 16 18 18
|
||||
25: 11 Load 24
|
||||
26: 7(fvec4) VectorTimesMatrix 22 25
|
||||
28: 20(ptr) AccessChain 16 27 27
|
||||
29: 7(fvec4) Load 28
|
||||
30: 23(ptr) AccessChain 16 27 18
|
||||
31: 11 Load 30
|
||||
32: 7(fvec4) VectorTimesMatrix 29 31
|
||||
33: 7(fvec4) FAdd 26 32
|
||||
ReturnValue 33
|
||||
FunctionEnd
|
@ -68,7 +68,7 @@ using depth_greater
|
||||
0:15 3 (const int)
|
||||
0:? Linker Objects
|
||||
0:? 'anon@0' (layout( row_major std140) uniform block{ uniform structure{layout( offset=68) temp float f, temp float g, temp float d, temp 4-component vector of float normal} s})
|
||||
0:? 'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{ temp float f, temp float g, temp float d, temp 4-component vector of float normal} t})
|
||||
0:? 'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{layout( offset=68) temp float f, temp float g, temp float d, temp 4-component vector of float normal} t})
|
||||
0:? 'f' (layout( location=0) out float)
|
||||
0:? 'g' (layout( location=1) out float)
|
||||
0:? 'd' ( out float FragDepth)
|
||||
@ -151,7 +151,7 @@ using depth_greater
|
||||
0:15 3 (const int)
|
||||
0:? Linker Objects
|
||||
0:? 'anon@0' (layout( row_major std140) uniform block{ uniform structure{layout( offset=68) temp float f, temp float g, temp float d, temp 4-component vector of float normal} s})
|
||||
0:? 'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{ temp float f, temp float g, temp float d, temp 4-component vector of float normal} t})
|
||||
0:? 'anon@1' (layout( row_major std140) uniform block{layout( row_major std140 offset=88) uniform structure{layout( offset=68) temp float f, temp float g, temp float d, temp 4-component vector of float normal} t})
|
||||
0:? 'f' (layout( location=0) out float)
|
||||
0:? 'g' (layout( location=1) out float)
|
||||
0:? 'd' ( out float FragDepth)
|
||||
@ -163,7 +163,7 @@ using depth_greater
|
||||
|
||||
// Module Version 10000
|
||||
// Generated by (magic number): 80001
|
||||
// Id's are bound by 66
|
||||
// Id's are bound by 65
|
||||
|
||||
Capability Shader
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
@ -200,14 +200,9 @@ using depth_greater
|
||||
Name 59 "$Global"
|
||||
MemberName 59($Global) 0 "s"
|
||||
Name 61 ""
|
||||
Name 62 "T"
|
||||
MemberName 62(T) 0 "f"
|
||||
MemberName 62(T) 1 "g"
|
||||
MemberName 62(T) 2 "d"
|
||||
MemberName 62(T) 3 "normal"
|
||||
Name 63 "buff"
|
||||
MemberName 63(buff) 0 "t"
|
||||
Name 65 ""
|
||||
Name 62 "buff"
|
||||
MemberName 62(buff) 0 "t"
|
||||
Name 64 ""
|
||||
Decorate 22(f) Location 0
|
||||
Decorate 27(g) Centroid
|
||||
Decorate 27(g) Location 1
|
||||
@ -224,13 +219,9 @@ using depth_greater
|
||||
MemberDecorate 59($Global) 0 Offset 0
|
||||
Decorate 59($Global) Block
|
||||
Decorate 61 DescriptorSet 0
|
||||
MemberDecorate 62(T) 0 Offset 0
|
||||
MemberDecorate 62(T) 1 Offset 4
|
||||
MemberDecorate 62(T) 2 Offset 8
|
||||
MemberDecorate 62(T) 3 Offset 16
|
||||
MemberDecorate 63(buff) 0 Offset 96
|
||||
Decorate 63(buff) Block
|
||||
Decorate 65 DescriptorSet 0
|
||||
MemberDecorate 62(buff) 0 Offset 96
|
||||
Decorate 62(buff) Block
|
||||
Decorate 64 DescriptorSet 0
|
||||
2: TypeVoid
|
||||
3: TypeFunction 2
|
||||
6: TypeFloat 32
|
||||
@ -261,10 +252,9 @@ using depth_greater
|
||||
59($Global): TypeStruct 58(T)
|
||||
60: TypePointer Uniform 59($Global)
|
||||
61: 60(ptr) Variable Uniform
|
||||
62(T): TypeStruct 6(float) 6(float) 6(float) 7(fvec4)
|
||||
63(buff): TypeStruct 62(T)
|
||||
64: TypePointer Uniform 63(buff)
|
||||
65: 64(ptr) Variable Uniform
|
||||
62(buff): TypeStruct 58(T)
|
||||
63: TypePointer Uniform 62(buff)
|
||||
64: 63(ptr) Variable Uniform
|
||||
4(main): 2 Function None 3
|
||||
5: Label
|
||||
18(t): 9(ptr) Variable Function
|
||||
|
27
Test/hlsl.matpack-1.frag
Normal file
27
Test/hlsl.matpack-1.frag
Normal file
@ -0,0 +1,27 @@
|
||||
struct MyBuffer1
|
||||
{
|
||||
column_major float4x4 mat1;
|
||||
row_major float4x4 mat2;
|
||||
float4 vec1;
|
||||
float foo;
|
||||
};
|
||||
|
||||
struct MyBuffer2
|
||||
{
|
||||
row_major float4x4 mat1;
|
||||
float4 vec1;
|
||||
};
|
||||
|
||||
cbuffer Example
|
||||
{
|
||||
MyBuffer1 g_MyBuffer1;
|
||||
MyBuffer2 g_MyBuffer2;
|
||||
column_major float4x4 mat1a;
|
||||
};
|
||||
|
||||
float4 main() : SV_Target0
|
||||
{
|
||||
return mul(g_MyBuffer1.mat1, g_MyBuffer1.vec1) +
|
||||
mul(g_MyBuffer2.mat1, g_MyBuffer2.vec1);
|
||||
}
|
||||
|
@ -201,6 +201,7 @@ INSTANTIATE_TEST_CASE_P(
|
||||
{"hlsl.namespace.frag", "main"},
|
||||
{"hlsl.nonint-index.frag", "main"},
|
||||
{"hlsl.matNx1.frag", "main"},
|
||||
{"hlsl.matpack-1.frag", "main"},
|
||||
{"hlsl.matrixSwizzle.vert", "ShaderFunction"},
|
||||
{"hlsl.memberFunCall.frag", "main"},
|
||||
{"hlsl.mintypes.frag", "main"},
|
||||
|
@ -8010,17 +8010,17 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS
|
||||
case EvqBuffer:
|
||||
correctUniform(type.getQualifier());
|
||||
if (it != ioTypeMap.end() && it->second.uniform)
|
||||
type.setStruct(it->second.uniform);
|
||||
memberType.setStruct(it->second.uniform);
|
||||
break;
|
||||
case EvqVaryingIn:
|
||||
correctInput(type.getQualifier());
|
||||
if (it != ioTypeMap.end() && it->second.input)
|
||||
type.setStruct(it->second.input);
|
||||
memberType.setStruct(it->second.input);
|
||||
break;
|
||||
case EvqVaryingOut:
|
||||
correctOutput(type.getQualifier());
|
||||
if (it != ioTypeMap.end() && it->second.output)
|
||||
type.setStruct(it->second.output);
|
||||
memberType.setStruct(it->second.output);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user