HLSL: Stop flattening non-IO structs containing opaques.

This makes struct returns from functions work, but breaks
structs containing arrays, due to limitations in subsequent
transforms in spirv-opt. This is expected to be fixed soon.
This commit is contained in:
John Kessenich
2017-11-16 16:03:18 -07:00
parent 471bfed062
commit dc005fb083
18 changed files with 1610 additions and 1419 deletions

View File

@@ -7,33 +7,48 @@ gl_FragCoord origin is upper left
0:8 Function Parameters:
0:8 'vpos' ( in 4-component vector of float)
0:? Sequence
0:13 Sequence
0:13 move second child to first child ( temp float)
0:? 'a1.n.y' ( temp float)
0:? 'a2.n.y' ( temp float)
0:13 move second child to first child ( temp texture2D)
0:? 'a1.n.texNested' ( temp texture2D)
0:? 'a2.n.texNested' ( temp texture2D)
0:14 Sequence
0:14 move second child to first child ( temp float)
0:? 'b.n.y' ( temp float)
0:? 'a1.n.y' ( temp float)
0:14 move second child to first child ( temp texture2D)
0:? 'b.n.texNested' ( temp texture2D)
0:? 'a1.n.texNested' ( temp texture2D)
0:13 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:13 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:13 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:13 Constant:
0:13 0 (const int)
0:13 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:13 'a2' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:13 Constant:
0:13 0 (const int)
0:14 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:14 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:14 'b' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp texture2D tex})
0:14 Constant:
0:14 0 (const int)
0:14 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:14 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:14 Constant:
0:14 0 (const int)
0:17 Sequence
0:17 Sequence
0:17 move second child to first child ( temp float)
0:? 'n.y' ( temp float)
0:? 'b.n.y' ( temp float)
0:17 move second child to first child ( temp texture2D)
0:? 'n.texNested' ( temp texture2D)
0:? 'b.n.texNested' ( temp texture2D)
0:17 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:17 'n' ( temp structure{ temp float y, temp texture2D texNested})
0:17 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:17 'b' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp texture2D tex})
0:17 Constant:
0:17 0 (const int)
0:20 move second child to first child ( temp texture2D)
0:? 'a2.n.texNested' ( temp texture2D)
0:20 texNested: direct index for structure ( temp texture2D)
0:20 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:20 'a2' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 1 (const int)
0:20 'someTex' ( uniform texture2D)
0:21 move second child to first child ( temp float)
0:? 'a1.n.y' ( temp float)
0:21 y: direct index for structure ( temp float)
0:21 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:21 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:21 Constant:
0:21 0 (const int)
0:21 Constant:
0:21 0 (const int)
0:21 Constant:
0:21 1.000000
0:23 Branch: Return with expression
@@ -68,33 +83,48 @@ gl_FragCoord origin is upper left
0:8 Function Parameters:
0:8 'vpos' ( in 4-component vector of float)
0:? Sequence
0:13 Sequence
0:13 move second child to first child ( temp float)
0:? 'a1.n.y' ( temp float)
0:? 'a2.n.y' ( temp float)
0:13 move second child to first child ( temp texture2D)
0:? 'a1.n.texNested' ( temp texture2D)
0:? 'a2.n.texNested' ( temp texture2D)
0:14 Sequence
0:14 move second child to first child ( temp float)
0:? 'b.n.y' ( temp float)
0:? 'a1.n.y' ( temp float)
0:14 move second child to first child ( temp texture2D)
0:? 'b.n.texNested' ( temp texture2D)
0:? 'a1.n.texNested' ( temp texture2D)
0:13 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:13 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:13 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:13 Constant:
0:13 0 (const int)
0:13 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:13 'a2' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:13 Constant:
0:13 0 (const int)
0:14 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:14 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:14 'b' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp texture2D tex})
0:14 Constant:
0:14 0 (const int)
0:14 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:14 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:14 Constant:
0:14 0 (const int)
0:17 Sequence
0:17 Sequence
0:17 move second child to first child ( temp float)
0:? 'n.y' ( temp float)
0:? 'b.n.y' ( temp float)
0:17 move second child to first child ( temp texture2D)
0:? 'n.texNested' ( temp texture2D)
0:? 'b.n.texNested' ( temp texture2D)
0:17 move second child to first child ( temp structure{ temp float y, temp texture2D texNested})
0:17 'n' ( temp structure{ temp float y, temp texture2D texNested})
0:17 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:17 'b' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp texture2D tex})
0:17 Constant:
0:17 0 (const int)
0:20 move second child to first child ( temp texture2D)
0:? 'a2.n.texNested' ( temp texture2D)
0:20 texNested: direct index for structure ( temp texture2D)
0:20 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:20 'a2' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 1 (const int)
0:20 'someTex' ( uniform texture2D)
0:21 move second child to first child ( temp float)
0:? 'a1.n.y' ( temp float)
0:21 y: direct index for structure ( temp float)
0:21 n: direct index for structure ( temp structure{ temp float y, temp texture2D texNested})
0:21 'a1' ( temp structure{ temp structure{ temp float y, temp texture2D texNested} n, temp float x})
0:21 Constant:
0:21 0 (const int)
0:21 Constant:
0:21 0 (const int)
0:21 Constant:
0:21 1.000000
0:23 Branch: Return with expression
@@ -120,88 +150,99 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80002
// Id's are bound by 47
// Id's are bound by 56
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 40 43
EntryPoint Fragment 4 "main" 49 52
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Name 4 "main"
Name 11 "@main(vf4;"
Name 10 "vpos"
Name 14 "a1.n.y"
Name 15 "a2.n.y"
Name 19 "a1.n.texNested"
Name 20 "a2.n.texNested"
Name 22 "b.n.y"
Name 24 "b.n.texNested"
Name 26 "n.y"
Name 28 "n.texNested"
Name 31 "someTex"
Name 38 "vpos"
Name 40 "vpos"
Name 43 "@entryPointOutput"
Name 44 "param"
Decorate 31(someTex) DescriptorSet 0
Decorate 40(vpos) Location 0
Decorate 43(@entryPointOutput) Location 0
Name 14 "Nested"
MemberName 14(Nested) 0 "y"
MemberName 14(Nested) 1 "texNested"
Name 15 "A"
MemberName 15(A) 0 "n"
MemberName 15(A) 1 "x"
Name 17 "a1"
Name 20 "a2"
Name 25 "B"
MemberName 25(B) 0 "n"
MemberName 25(B) 1 "tex"
Name 27 "b"
Name 31 "n"
Name 36 "someTex"
Name 47 "vpos"
Name 49 "vpos"
Name 52 "@entryPointOutput"
Name 53 "param"
Decorate 36(someTex) DescriptorSet 0
Decorate 49(vpos) Location 0
Decorate 52(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4)
9: TypeFunction 7(fvec4) 8(ptr)
13: TypePointer Function 6(float)
17: TypeImage 6(float) 2D sampled format:Unknown
18: TypePointer Function 17
30: TypePointer UniformConstant 17
31(someTex): 30(ptr) Variable UniformConstant
33: 6(float) Constant 1065353216
34: 6(float) Constant 0
35: 7(fvec4) ConstantComposite 34 34 34 34
39: TypePointer Input 7(fvec4)
40(vpos): 39(ptr) Variable Input
42: TypePointer Output 7(fvec4)
43(@entryPointOutput): 42(ptr) Variable Output
13: TypeImage 6(float) 2D sampled format:Unknown
14(Nested): TypeStruct 6(float) 13
15(A): TypeStruct 14(Nested) 6(float)
16: TypePointer Function 15(A)
18: TypeInt 32 1
19: 18(int) Constant 0
21: TypePointer Function 14(Nested)
25(B): TypeStruct 14(Nested) 13
26: TypePointer Function 25(B)
34: 18(int) Constant 1
35: TypePointer UniformConstant 13
36(someTex): 35(ptr) Variable UniformConstant
38: TypePointer Function 13
40: 6(float) Constant 1065353216
41: TypePointer Function 6(float)
43: 6(float) Constant 0
44: 7(fvec4) ConstantComposite 43 43 43 43
48: TypePointer Input 7(fvec4)
49(vpos): 48(ptr) Variable Input
51: TypePointer Output 7(fvec4)
52(@entryPointOutput): 51(ptr) Variable Output
4(main): 2 Function None 3
5: Label
38(vpos): 8(ptr) Variable Function
44(param): 8(ptr) Variable Function
41: 7(fvec4) Load 40(vpos)
Store 38(vpos) 41
45: 7(fvec4) Load 38(vpos)
Store 44(param) 45
46: 7(fvec4) FunctionCall 11(@main(vf4;) 44(param)
Store 43(@entryPointOutput) 46
47(vpos): 8(ptr) Variable Function
53(param): 8(ptr) Variable Function
50: 7(fvec4) Load 49(vpos)
Store 47(vpos) 50
54: 7(fvec4) Load 47(vpos)
Store 53(param) 54
55: 7(fvec4) FunctionCall 11(@main(vf4;) 53(param)
Store 52(@entryPointOutput) 55
Return
FunctionEnd
11(@main(vf4;): 7(fvec4) Function None 9
10(vpos): 8(ptr) FunctionParameter
12: Label
14(a1.n.y): 13(ptr) Variable Function
15(a2.n.y): 13(ptr) Variable Function
19(a1.n.texNested): 18(ptr) Variable Function
20(a2.n.texNested): 18(ptr) Variable Function
22(b.n.y): 13(ptr) Variable Function
24(b.n.texNested): 18(ptr) Variable Function
26(n.y): 13(ptr) Variable Function
28(n.texNested): 18(ptr) Variable Function
16: 6(float) Load 15(a2.n.y)
Store 14(a1.n.y) 16
21: 17 Load 20(a2.n.texNested)
Store 19(a1.n.texNested) 21
23: 6(float) Load 14(a1.n.y)
Store 22(b.n.y) 23
25: 17 Load 19(a1.n.texNested)
Store 24(b.n.texNested) 25
27: 6(float) Load 22(b.n.y)
Store 26(n.y) 27
29: 17 Load 24(b.n.texNested)
Store 28(n.texNested) 29
32: 17 Load 31(someTex)
Store 20(a2.n.texNested) 32
Store 14(a1.n.y) 33
ReturnValue 35
17(a1): 16(ptr) Variable Function
20(a2): 16(ptr) Variable Function
27(b): 26(ptr) Variable Function
31(n): 21(ptr) Variable Function
22: 21(ptr) AccessChain 20(a2) 19
23: 14(Nested) Load 22
24: 21(ptr) AccessChain 17(a1) 19
Store 24 23
28: 21(ptr) AccessChain 17(a1) 19
29: 14(Nested) Load 28
30: 21(ptr) AccessChain 27(b) 19
Store 30 29
32: 21(ptr) AccessChain 27(b) 19
33: 14(Nested) Load 32
Store 31(n) 33
37: 13 Load 36(someTex)
39: 38(ptr) AccessChain 20(a2) 19 34
Store 39 37
42: 41(ptr) AccessChain 17(a1) 19 19
Store 42 40
ReturnValue 44
FunctionEnd