Merge pull request #1102 from KhronosGroup/partially-flatten
HLSL: Partially flatten hierarchies, instead of all or nothing.
This commit is contained in:
		
						commit
						0b55e0f203
					
				
							
								
								
									
										366
									
								
								Test/baseResults/hlsl.partialFlattenLocal.vert.out
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										366
									
								
								Test/baseResults/hlsl.partialFlattenLocal.vert.out
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,366 @@ | |||||||
|  | hlsl.partialFlattenLocal.vert | ||||||
|  | WARNING: AST will form illegal SPIR-V; need to transform to legalize | ||||||
|  | Shader version: 500 | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' ( in 4-component vector of float) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:14      move second child to first child ( temp texture2D) | ||||||
|  | 0:?         'packed.tex' ( temp texture2D) | ||||||
|  | 0:14        'tex' ( uniform texture2D) | ||||||
|  | 0:15      move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:15        direct index ( temp 3-component vector of float) | ||||||
|  | 0:?           'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:15          Constant: | ||||||
|  | 0:15            0 (const int) | ||||||
|  | 0:?         Constant: | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:16      move second child to first child ( temp 2-component vector of float) | ||||||
|  | 0:16        direct index ( temp 2-component vector of float) | ||||||
|  | 0:?           'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:16          Constant: | ||||||
|  | 0:16            0 (const int) | ||||||
|  | 0:?         Constant: | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           1.000000 | ||||||
|  | 0:17      move second child to first child ( temp float) | ||||||
|  | 0:?         'packed.x' ( temp float) | ||||||
|  | 0:17        Constant: | ||||||
|  | 0:17          1.000000 | ||||||
|  | 0:18      move second child to first child ( temp int) | ||||||
|  | 0:?         'packed.n' ( temp int) | ||||||
|  | 0:18        Constant: | ||||||
|  | 0:18          3 (const int) | ||||||
|  | 0:20      Sequence | ||||||
|  | 0:20        move second child to first child ( temp int) | ||||||
|  | 0:20          'i' ( temp int) | ||||||
|  | 0:20          Constant: | ||||||
|  | 0:20            0 (const int) | ||||||
|  | 0:20        Loop with condition tested first | ||||||
|  | 0:20          Loop Condition | ||||||
|  | 0:20          Compare Less Than ( temp bool) | ||||||
|  | 0:20            'i' ( temp int) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              1 (const int) | ||||||
|  | 0:20          Loop Body | ||||||
|  | 0:?           Sequence | ||||||
|  | 0:21            add second child into first child ( temp 2-component vector of float) | ||||||
|  | 0:21              vector swizzle ( temp 2-component vector of float) | ||||||
|  | 0:21                indirect index ( temp 3-component vector of float) | ||||||
|  | 0:?                   'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:21                  'i' ( temp int) | ||||||
|  | 0:21                Sequence | ||||||
|  | 0:21                  Constant: | ||||||
|  | 0:21                    0 (const int) | ||||||
|  | 0:21                  Constant: | ||||||
|  | 0:21                    1 (const int) | ||||||
|  | 0:21              indirect index ( temp 2-component vector of float) | ||||||
|  | 0:?                 'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:21                'i' ( temp int) | ||||||
|  | 0:20          Loop Terminal Expression | ||||||
|  | 0:20          Pre-Increment ( temp int) | ||||||
|  | 0:20            'i' ( temp int) | ||||||
|  | 0:24      Sequence | ||||||
|  | 0:24        Sequence | ||||||
|  | 0:24          move second child to first child ( temp texture2D) | ||||||
|  | 0:?             'packed2.tex' ( temp texture2D) | ||||||
|  | 0:?             'packed.tex' ( temp texture2D) | ||||||
|  | 0:24          move second child to first child ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:?             'packed2.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:?             'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:24          move second child to first child ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:?             'packed2.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:?             'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:24          move second child to first child ( temp float) | ||||||
|  | 0:?             'packed2.x' ( temp float) | ||||||
|  | 0:?             'packed.x' ( temp float) | ||||||
|  | 0:24          move second child to first child ( temp int) | ||||||
|  | 0:?             'packed2.n' ( temp int) | ||||||
|  | 0:?             'packed.n' ( temp int) | ||||||
|  | 0:26      Branch: Return with expression | ||||||
|  | 0:26        add ( temp 4-component vector of float) | ||||||
|  | 0:26          'pos' ( in 4-component vector of float) | ||||||
|  | 0:?           Construct vec4 ( temp 4-component vector of float) | ||||||
|  | 0:26            direct index ( temp 3-component vector of float) | ||||||
|  | 0:?               'packed2.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:26              Constant: | ||||||
|  | 0:26                0 (const int) | ||||||
|  | 0:26            Constant: | ||||||
|  | 0:26              0.000000 | ||||||
|  | 0:12  Function Definition: main( ( temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 0:12      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:12        Function Call: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:?           'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'tex' ( uniform texture2D) | ||||||
|  | 0:?     '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:?     'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked vertex stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 500 | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' ( in 4-component vector of float) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:14      move second child to first child ( temp texture2D) | ||||||
|  | 0:?         'packed.tex' ( temp texture2D) | ||||||
|  | 0:14        'tex' ( uniform texture2D) | ||||||
|  | 0:15      move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:15        direct index ( temp 3-component vector of float) | ||||||
|  | 0:?           'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:15          Constant: | ||||||
|  | 0:15            0 (const int) | ||||||
|  | 0:?         Constant: | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:16      move second child to first child ( temp 2-component vector of float) | ||||||
|  | 0:16        direct index ( temp 2-component vector of float) | ||||||
|  | 0:?           'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:16          Constant: | ||||||
|  | 0:16            0 (const int) | ||||||
|  | 0:?         Constant: | ||||||
|  | 0:?           0.000000 | ||||||
|  | 0:?           1.000000 | ||||||
|  | 0:17      move second child to first child ( temp float) | ||||||
|  | 0:?         'packed.x' ( temp float) | ||||||
|  | 0:17        Constant: | ||||||
|  | 0:17          1.000000 | ||||||
|  | 0:18      move second child to first child ( temp int) | ||||||
|  | 0:?         'packed.n' ( temp int) | ||||||
|  | 0:18        Constant: | ||||||
|  | 0:18          3 (const int) | ||||||
|  | 0:20      Sequence | ||||||
|  | 0:20        move second child to first child ( temp int) | ||||||
|  | 0:20          'i' ( temp int) | ||||||
|  | 0:20          Constant: | ||||||
|  | 0:20            0 (const int) | ||||||
|  | 0:20        Loop with condition tested first | ||||||
|  | 0:20          Loop Condition | ||||||
|  | 0:20          Compare Less Than ( temp bool) | ||||||
|  | 0:20            'i' ( temp int) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              1 (const int) | ||||||
|  | 0:20          Loop Body | ||||||
|  | 0:?           Sequence | ||||||
|  | 0:21            add second child into first child ( temp 2-component vector of float) | ||||||
|  | 0:21              vector swizzle ( temp 2-component vector of float) | ||||||
|  | 0:21                indirect index ( temp 3-component vector of float) | ||||||
|  | 0:?                   'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:21                  'i' ( temp int) | ||||||
|  | 0:21                Sequence | ||||||
|  | 0:21                  Constant: | ||||||
|  | 0:21                    0 (const int) | ||||||
|  | 0:21                  Constant: | ||||||
|  | 0:21                    1 (const int) | ||||||
|  | 0:21              indirect index ( temp 2-component vector of float) | ||||||
|  | 0:?                 'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:21                'i' ( temp int) | ||||||
|  | 0:20          Loop Terminal Expression | ||||||
|  | 0:20          Pre-Increment ( temp int) | ||||||
|  | 0:20            'i' ( temp int) | ||||||
|  | 0:24      Sequence | ||||||
|  | 0:24        Sequence | ||||||
|  | 0:24          move second child to first child ( temp texture2D) | ||||||
|  | 0:?             'packed2.tex' ( temp texture2D) | ||||||
|  | 0:?             'packed.tex' ( temp texture2D) | ||||||
|  | 0:24          move second child to first child ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:?             'packed2.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:?             'packed.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:24          move second child to first child ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:?             'packed2.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:?             'packed.uv' ( temp 2-element array of 2-component vector of float) | ||||||
|  | 0:24          move second child to first child ( temp float) | ||||||
|  | 0:?             'packed2.x' ( temp float) | ||||||
|  | 0:?             'packed.x' ( temp float) | ||||||
|  | 0:24          move second child to first child ( temp int) | ||||||
|  | 0:?             'packed2.n' ( temp int) | ||||||
|  | 0:?             'packed.n' ( temp int) | ||||||
|  | 0:26      Branch: Return with expression | ||||||
|  | 0:26        add ( temp 4-component vector of float) | ||||||
|  | 0:26          'pos' ( in 4-component vector of float) | ||||||
|  | 0:?           Construct vec4 ( temp 4-component vector of float) | ||||||
|  | 0:26            direct index ( temp 3-component vector of float) | ||||||
|  | 0:?               'packed2.pos' ( temp 3-element array of 3-component vector of float) | ||||||
|  | 0:26              Constant: | ||||||
|  | 0:26                0 (const int) | ||||||
|  | 0:26            Constant: | ||||||
|  | 0:26              0.000000 | ||||||
|  | 0:12  Function Definition: main( ( temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 0:12      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:12        Function Call: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:?           'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'tex' ( uniform texture2D) | ||||||
|  | 0:?     '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:?     'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80002 | ||||||
|  | // Id's are bound by 97 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Vertex 4  "main" 90 93 | ||||||
|  |                               Source HLSL 500 | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 11  "@main(vf4;" | ||||||
|  |                               Name 10  "pos" | ||||||
|  |                               Name 15  "packed.tex" | ||||||
|  |                               Name 17  "tex" | ||||||
|  |                               Name 24  "packed.pos" | ||||||
|  |                               Name 35  "packed.uv" | ||||||
|  |                               Name 41  "packed.x" | ||||||
|  |                               Name 43  "packed.n" | ||||||
|  |                               Name 45  "i" | ||||||
|  |                               Name 68  "packed2.tex" | ||||||
|  |                               Name 70  "packed2.pos" | ||||||
|  |                               Name 72  "packed2.uv" | ||||||
|  |                               Name 74  "packed2.x" | ||||||
|  |                               Name 76  "packed2.n" | ||||||
|  |                               Name 88  "pos" | ||||||
|  |                               Name 90  "pos" | ||||||
|  |                               Name 93  "@entryPointOutput" | ||||||
|  |                               Name 94  "param" | ||||||
|  |                               Decorate 17(tex) DescriptorSet 0 | ||||||
|  |                               Decorate 90(pos) Location 0 | ||||||
|  |                               Decorate 93(@entryPointOutput) BuiltIn Position | ||||||
|  |                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:             TypeImage 6(float) 2D sampled format:Unknown | ||||||
|  |               14:             TypePointer Function 13 | ||||||
|  |               16:             TypePointer UniformConstant 13 | ||||||
|  |          17(tex):     16(ptr) Variable UniformConstant | ||||||
|  |               19:             TypeVector 6(float) 3 | ||||||
|  |               20:             TypeInt 32 0 | ||||||
|  |               21:     20(int) Constant 3 | ||||||
|  |               22:             TypeArray 19(fvec3) 21 | ||||||
|  |               23:             TypePointer Function 22 | ||||||
|  |               25:             TypeInt 32 1 | ||||||
|  |               26:     25(int) Constant 0 | ||||||
|  |               27:    6(float) Constant 0 | ||||||
|  |               28:   19(fvec3) ConstantComposite 27 27 27 | ||||||
|  |               29:             TypePointer Function 19(fvec3) | ||||||
|  |               31:             TypeVector 6(float) 2 | ||||||
|  |               32:     20(int) Constant 2 | ||||||
|  |               33:             TypeArray 31(fvec2) 32 | ||||||
|  |               34:             TypePointer Function 33 | ||||||
|  |               36:    6(float) Constant 1065353216 | ||||||
|  |               37:   31(fvec2) ConstantComposite 27 36 | ||||||
|  |               38:             TypePointer Function 31(fvec2) | ||||||
|  |               40:             TypePointer Function 6(float) | ||||||
|  |               42:             TypePointer Function 25(int) | ||||||
|  |               44:     25(int) Constant 3 | ||||||
|  |               52:     25(int) Constant 1 | ||||||
|  |               53:             TypeBool | ||||||
|  |               89:             TypePointer Input 7(fvec4) | ||||||
|  |          90(pos):     89(ptr) Variable Input | ||||||
|  |               92:             TypePointer Output 7(fvec4) | ||||||
|  | 93(@entryPointOutput):     92(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          88(pos):      8(ptr) Variable Function | ||||||
|  |        94(param):      8(ptr) Variable Function | ||||||
|  |               91:    7(fvec4) Load 90(pos) | ||||||
|  |                               Store 88(pos) 91 | ||||||
|  |               95:    7(fvec4) Load 88(pos) | ||||||
|  |                               Store 94(param) 95 | ||||||
|  |               96:    7(fvec4) FunctionCall 11(@main(vf4;) 94(param) | ||||||
|  |                               Store 93(@entryPointOutput) 96 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |   11(@main(vf4;):    7(fvec4) Function None 9 | ||||||
|  |          10(pos):      8(ptr) FunctionParameter | ||||||
|  |               12:             Label | ||||||
|  |   15(packed.tex):     14(ptr) Variable Function | ||||||
|  |   24(packed.pos):     23(ptr) Variable Function | ||||||
|  |    35(packed.uv):     34(ptr) Variable Function | ||||||
|  |     41(packed.x):     40(ptr) Variable Function | ||||||
|  |     43(packed.n):     42(ptr) Variable Function | ||||||
|  |            45(i):     42(ptr) Variable Function | ||||||
|  |  68(packed2.tex):     14(ptr) Variable Function | ||||||
|  |  70(packed2.pos):     23(ptr) Variable Function | ||||||
|  |   72(packed2.uv):     34(ptr) Variable Function | ||||||
|  |    74(packed2.x):     40(ptr) Variable Function | ||||||
|  |    76(packed2.n):     42(ptr) Variable Function | ||||||
|  |               18:          13 Load 17(tex) | ||||||
|  |                               Store 15(packed.tex) 18 | ||||||
|  |               30:     29(ptr) AccessChain 24(packed.pos) 26 | ||||||
|  |                               Store 30 28 | ||||||
|  |               39:     38(ptr) AccessChain 35(packed.uv) 26 | ||||||
|  |                               Store 39 37 | ||||||
|  |                               Store 41(packed.x) 36 | ||||||
|  |                               Store 43(packed.n) 44 | ||||||
|  |                               Store 45(i) 26 | ||||||
|  |                               Branch 46 | ||||||
|  |               46:             Label | ||||||
|  |                               LoopMerge 48 49 None | ||||||
|  |                               Branch 50 | ||||||
|  |               50:             Label | ||||||
|  |               51:     25(int) Load 45(i) | ||||||
|  |               54:    53(bool) SLessThan 51 52 | ||||||
|  |                               BranchConditional 54 47 48 | ||||||
|  |               47:               Label | ||||||
|  |               55:     25(int)   Load 45(i) | ||||||
|  |               56:     25(int)   Load 45(i) | ||||||
|  |               57:     38(ptr)   AccessChain 35(packed.uv) 56 | ||||||
|  |               58:   31(fvec2)   Load 57 | ||||||
|  |               59:     29(ptr)   AccessChain 24(packed.pos) 55 | ||||||
|  |               60:   19(fvec3)   Load 59 | ||||||
|  |               61:   31(fvec2)   VectorShuffle 60 60 0 1 | ||||||
|  |               62:   31(fvec2)   FAdd 61 58 | ||||||
|  |               63:     29(ptr)   AccessChain 24(packed.pos) 55 | ||||||
|  |               64:   19(fvec3)   Load 63 | ||||||
|  |               65:   19(fvec3)   VectorShuffle 64 62 3 4 2 | ||||||
|  |                                 Store 63 65 | ||||||
|  |                                 Branch 49 | ||||||
|  |               49:               Label | ||||||
|  |               66:     25(int)   Load 45(i) | ||||||
|  |               67:     25(int)   IAdd 66 52 | ||||||
|  |                                 Store 45(i) 67 | ||||||
|  |                                 Branch 46 | ||||||
|  |               48:             Label | ||||||
|  |               69:          13 Load 15(packed.tex) | ||||||
|  |                               Store 68(packed2.tex) 69 | ||||||
|  |               71:          22 Load 24(packed.pos) | ||||||
|  |                               Store 70(packed2.pos) 71 | ||||||
|  |               73:          33 Load 35(packed.uv) | ||||||
|  |                               Store 72(packed2.uv) 73 | ||||||
|  |               75:    6(float) Load 41(packed.x) | ||||||
|  |                               Store 74(packed2.x) 75 | ||||||
|  |               77:     25(int) Load 43(packed.n) | ||||||
|  |                               Store 76(packed2.n) 77 | ||||||
|  |               78:    7(fvec4) Load 10(pos) | ||||||
|  |               79:     29(ptr) AccessChain 70(packed2.pos) 26 | ||||||
|  |               80:   19(fvec3) Load 79 | ||||||
|  |               81:    6(float) CompositeExtract 80 0 | ||||||
|  |               82:    6(float) CompositeExtract 80 1 | ||||||
|  |               83:    6(float) CompositeExtract 80 2 | ||||||
|  |               84:    7(fvec4) CompositeConstruct 81 82 83 27 | ||||||
|  |               85:    7(fvec4) FAdd 78 84 | ||||||
|  |                               ReturnValue 85 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										150
									
								
								Test/baseResults/hlsl.partialFlattenMixed.vert.out
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										150
									
								
								Test/baseResults/hlsl.partialFlattenMixed.vert.out
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,150 @@ | |||||||
|  | hlsl.partialFlattenMixed.vert | ||||||
|  | WARNING: AST will form illegal SPIR-V; need to transform to legalize | ||||||
|  | Shader version: 500 | ||||||
|  | 0:? Sequence | ||||||
|  | 0:10  Function Definition: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:10    Function Parameters:  | ||||||
|  | 0:10      'pos' ( in 4-component vector of float) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        move second child to first child ( temp texture2D) | ||||||
|  | 0:13          direct index ( temp texture2D) | ||||||
|  | 0:?             'packed.membTex' ( temp 2-element array of texture2D) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const int) | ||||||
|  | 0:?           'tex[0]' ( uniform texture2D) | ||||||
|  | 0:13        move second child to first child ( temp texture2D) | ||||||
|  | 0:13          direct index ( temp texture2D) | ||||||
|  | 0:?             'packed.membTex' ( temp 2-element array of texture2D) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const int) | ||||||
|  | 0:?           'tex[1]' ( uniform texture2D) | ||||||
|  | 0:15      Branch: Return with expression | ||||||
|  | 0:15        'pos' ( in 4-component vector of float) | ||||||
|  | 0:10  Function Definition: main( ( temp void) | ||||||
|  | 0:10    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:10      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 0:10      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:10        Function Call: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:?           'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'tex[0]' ( uniform texture2D) | ||||||
|  | 0:?     'tex[1]' ( uniform texture2D) | ||||||
|  | 0:?     '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:?     'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked vertex stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 500 | ||||||
|  | 0:? Sequence | ||||||
|  | 0:10  Function Definition: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:10    Function Parameters:  | ||||||
|  | 0:10      'pos' ( in 4-component vector of float) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        move second child to first child ( temp texture2D) | ||||||
|  | 0:13          direct index ( temp texture2D) | ||||||
|  | 0:?             'packed.membTex' ( temp 2-element array of texture2D) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const int) | ||||||
|  | 0:?           'tex[0]' ( uniform texture2D) | ||||||
|  | 0:13        move second child to first child ( temp texture2D) | ||||||
|  | 0:13          direct index ( temp texture2D) | ||||||
|  | 0:?             'packed.membTex' ( temp 2-element array of texture2D) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const int) | ||||||
|  | 0:?           'tex[1]' ( uniform texture2D) | ||||||
|  | 0:15      Branch: Return with expression | ||||||
|  | 0:15        'pos' ( in 4-component vector of float) | ||||||
|  | 0:10  Function Definition: main( ( temp void) | ||||||
|  | 0:10    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:10      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?         'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 0:10      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:10        Function Call: @main(vf4; ( temp 4-component vector of float) | ||||||
|  | 0:?           'pos' ( temp 4-component vector of float) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'tex[0]' ( uniform texture2D) | ||||||
|  | 0:?     'tex[1]' ( uniform texture2D) | ||||||
|  | 0:?     '@entryPointOutput' ( out 4-component vector of float Position) | ||||||
|  | 0:?     'pos' (layout( location=0) in 4-component vector of float) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80002 | ||||||
|  | // Id's are bound by 42 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Vertex 4  "main" 35 38 | ||||||
|  |                               Source HLSL 500 | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 11  "@main(vf4;" | ||||||
|  |                               Name 10  "pos" | ||||||
|  |                               Name 18  "packed.membTex" | ||||||
|  |                               Name 22  "tex[0]" | ||||||
|  |                               Name 27  "tex[1]" | ||||||
|  |                               Name 33  "pos" | ||||||
|  |                               Name 35  "pos" | ||||||
|  |                               Name 38  "@entryPointOutput" | ||||||
|  |                               Name 39  "param" | ||||||
|  |                               Decorate 22(tex[0]) DescriptorSet 0 | ||||||
|  |                               Decorate 27(tex[1]) DescriptorSet 0 | ||||||
|  |                               Decorate 35(pos) Location 0 | ||||||
|  |                               Decorate 38(@entryPointOutput) BuiltIn Position | ||||||
|  |                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:             TypeImage 6(float) 2D sampled format:Unknown | ||||||
|  |               14:             TypeInt 32 0 | ||||||
|  |               15:     14(int) Constant 2 | ||||||
|  |               16:             TypeArray 13 15 | ||||||
|  |               17:             TypePointer Function 16 | ||||||
|  |               19:             TypeInt 32 1 | ||||||
|  |               20:     19(int) Constant 0 | ||||||
|  |               21:             TypePointer UniformConstant 13 | ||||||
|  |       22(tex[0]):     21(ptr) Variable UniformConstant | ||||||
|  |               24:             TypePointer Function 13 | ||||||
|  |               26:     19(int) Constant 1 | ||||||
|  |       27(tex[1]):     21(ptr) Variable UniformConstant | ||||||
|  |               34:             TypePointer Input 7(fvec4) | ||||||
|  |          35(pos):     34(ptr) Variable Input | ||||||
|  |               37:             TypePointer Output 7(fvec4) | ||||||
|  | 38(@entryPointOutput):     37(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          33(pos):      8(ptr) Variable Function | ||||||
|  |        39(param):      8(ptr) Variable Function | ||||||
|  |               36:    7(fvec4) Load 35(pos) | ||||||
|  |                               Store 33(pos) 36 | ||||||
|  |               40:    7(fvec4) Load 33(pos) | ||||||
|  |                               Store 39(param) 40 | ||||||
|  |               41:    7(fvec4) FunctionCall 11(@main(vf4;) 39(param) | ||||||
|  |                               Store 38(@entryPointOutput) 41 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |   11(@main(vf4;):    7(fvec4) Function None 9 | ||||||
|  |          10(pos):      8(ptr) FunctionParameter | ||||||
|  |               12:             Label | ||||||
|  | 18(packed.membTex):     17(ptr) Variable Function | ||||||
|  |               23:          13 Load 22(tex[0]) | ||||||
|  |               25:     24(ptr) AccessChain 18(packed.membTex) 20 | ||||||
|  |                               Store 25 23 | ||||||
|  |               28:          13 Load 27(tex[1]) | ||||||
|  |               29:     24(ptr) AccessChain 18(packed.membTex) 26 | ||||||
|  |                               Store 29 28 | ||||||
|  |               30:    7(fvec4) Load 10(pos) | ||||||
|  |                               ReturnValue 30 | ||||||
|  |                               FunctionEnd | ||||||
| @ -27,8 +27,14 @@ gl_FragCoord origin is upper left | |||||||
| 0:26                0.400000 | 0:26                0.400000 | ||||||
| 0:27          texture ( temp 4-component vector of float) | 0:27          texture ( temp 4-component vector of float) | ||||||
| 0:27            Construct combined texture-sampler ( temp sampler1D) | 0:27            Construct combined texture-sampler ( temp sampler1D) | ||||||
| 0:?               'g_texdata_array2[1].tex[0]' ( uniform texture1D) | 0:27              direct index ( temp texture1D) | ||||||
| 0:?               'g_texdata_array2[1].samp[0]' ( uniform sampler) | 0:?                 'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D) | ||||||
|  | 0:27                Constant: | ||||||
|  | 0:27                  0 (const int) | ||||||
|  | 0:27              direct index ( temp sampler) | ||||||
|  | 0:?                 'g_texdata_array2[1].samp' ( uniform 2-element array of sampler) | ||||||
|  | 0:27                Constant: | ||||||
|  | 0:27                  0 (const int) | ||||||
| 0:27            Constant: | 0:27            Constant: | ||||||
| 0:27              0.300000 | 0:27              0.300000 | ||||||
| 0:23  Function Definition: main( ( temp void) | 0:23  Function Definition: main( ( temp void) | ||||||
| @ -58,20 +64,14 @@ gl_FragCoord origin is upper left | |||||||
| 0:?     'g_texdata_array[2].samp' ( uniform sampler) | 0:?     'g_texdata_array[2].samp' ( uniform sampler) | ||||||
| 0:?     'g_texdata_array[2].tex' ( uniform texture1D) | 0:?     'g_texdata_array[2].tex' ( uniform texture1D) | ||||||
| 0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[0].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[0].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[0].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[0].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[0].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[0].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[1].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[1].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[1].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[1].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[1].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[2].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[2].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[2].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[2].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[2].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[2].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float) | 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float) | ||||||
| 
 | 
 | ||||||
| @ -107,8 +107,14 @@ gl_FragCoord origin is upper left | |||||||
| 0:26                0.400000 | 0:26                0.400000 | ||||||
| 0:27          texture ( temp 4-component vector of float) | 0:27          texture ( temp 4-component vector of float) | ||||||
| 0:27            Construct combined texture-sampler ( temp sampler1D) | 0:27            Construct combined texture-sampler ( temp sampler1D) | ||||||
| 0:?               'g_texdata_array2[1].tex[0]' ( uniform texture1D) | 0:27              direct index ( temp texture1D) | ||||||
| 0:?               'g_texdata_array2[1].samp[0]' ( uniform sampler) | 0:?                 'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D) | ||||||
|  | 0:27                Constant: | ||||||
|  | 0:27                  0 (const int) | ||||||
|  | 0:27              direct index ( temp sampler) | ||||||
|  | 0:?                 'g_texdata_array2[1].samp' ( uniform 2-element array of sampler) | ||||||
|  | 0:27                Constant: | ||||||
|  | 0:27                  0 (const int) | ||||||
| 0:27            Constant: | 0:27            Constant: | ||||||
| 0:27              0.300000 | 0:27              0.300000 | ||||||
| 0:23  Function Definition: main( ( temp void) | 0:23  Function Definition: main( ( temp void) | ||||||
| @ -138,32 +144,26 @@ gl_FragCoord origin is upper left | |||||||
| 0:?     'g_texdata_array[2].samp' ( uniform sampler) | 0:?     'g_texdata_array[2].samp' ( uniform sampler) | ||||||
| 0:?     'g_texdata_array[2].tex' ( uniform texture1D) | 0:?     'g_texdata_array[2].tex' ( uniform texture1D) | ||||||
| 0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array[2].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[0].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[0].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[0].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[0].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[0].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[0].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[0].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[1].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[1].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[1].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[1].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[1].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[1].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[1].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'g_texdata_array2[2].samp[0]' ( uniform sampler) | 0:?     'g_texdata_array2[2].samp' ( uniform 2-element array of sampler) | ||||||
| 0:?     'g_texdata_array2[2].samp[1]' ( uniform sampler) | 0:?     'g_texdata_array2[2].tex' ( uniform 2-element array of texture1D) | ||||||
| 0:?     'g_texdata_array2[2].tex[0]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[2].tex[1]' ( uniform texture1D) |  | ||||||
| 0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int) | 0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int) | ||||||
| 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float) | 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float) | ||||||
| 
 | 
 | ||||||
| // Module Version 10000 | // Module Version 10000 | ||||||
| // Generated by (magic number): 80002 | // Generated by (magic number): 80002 | ||||||
| // Id's are bound by 78 | // Id's are bound by 80 | ||||||
| 
 | 
 | ||||||
|                               Capability Shader |                               Capability Shader | ||||||
|                               Capability Sampled1D |                               Capability Sampled1D | ||||||
|                1:             ExtInstImport  "GLSL.std.450" |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|                               MemoryModel Logical GLSL450 |                               MemoryModel Logical GLSL450 | ||||||
|                               EntryPoint Fragment 4  "main" 51 |                               EntryPoint Fragment 4  "main" 59 | ||||||
|                               ExecutionMode 4 OriginUpperLeft |                               ExecutionMode 4 OriginUpperLeft | ||||||
|                               Source HLSL 500 |                               Source HLSL 500 | ||||||
|                               Name 4  "main" |                               Name 4  "main" | ||||||
| @ -175,57 +175,45 @@ gl_FragCoord origin is upper left | |||||||
|                               Name 22  "g_texdata.samp" |                               Name 22  "g_texdata.samp" | ||||||
|                               Name 28  "g_texdata_array[1].tex" |                               Name 28  "g_texdata_array[1].tex" | ||||||
|                               Name 30  "g_texdata_array[1].samp" |                               Name 30  "g_texdata_array[1].samp" | ||||||
|                               Name 36  "g_texdata_array2[1].tex[0]" |                               Name 40  "g_texdata_array2[1].tex" | ||||||
|                               Name 38  "g_texdata_array2[1].samp[0]" |                               Name 45  "g_texdata_array2[1].samp" | ||||||
|                               Name 46  "ps_output" |                               Name 54  "ps_output" | ||||||
|                               Name 47  "param" |                               Name 55  "param" | ||||||
|                               Name 51  "ps_output.color" |                               Name 59  "ps_output.color" | ||||||
|                               Name 54  "g_samp" |                               Name 62  "g_samp" | ||||||
|                               Name 55  "g_tex" |                               Name 63  "g_tex" | ||||||
|                               Name 57  "g_texdata.nonopaque_thing" |                               Name 65  "g_texdata.nonopaque_thing" | ||||||
|                               Name 58  "g_texdata_array[0].samp" |                               Name 66  "g_texdata_array[0].samp" | ||||||
|                               Name 59  "g_texdata_array[0].tex" |                               Name 67  "g_texdata_array[0].tex" | ||||||
|                               Name 60  "g_texdata_array[0].nonopaque_thing" |                               Name 68  "g_texdata_array[0].nonopaque_thing" | ||||||
|                               Name 61  "g_texdata_array[1].nonopaque_thing" |                               Name 69  "g_texdata_array[1].nonopaque_thing" | ||||||
|                               Name 62  "g_texdata_array[2].samp" |                               Name 70  "g_texdata_array[2].samp" | ||||||
|                               Name 63  "g_texdata_array[2].tex" |                               Name 71  "g_texdata_array[2].tex" | ||||||
|                               Name 64  "g_texdata_array[2].nonopaque_thing" |                               Name 72  "g_texdata_array[2].nonopaque_thing" | ||||||
|                               Name 65  "g_texdata_array2[0].samp[0]" |                               Name 73  "g_texdata_array2[0].samp" | ||||||
|                               Name 66  "g_texdata_array2[0].samp[1]" |                               Name 74  "g_texdata_array2[0].tex" | ||||||
|                               Name 67  "g_texdata_array2[0].tex[0]" |                               Name 75  "g_texdata_array2[0].nonopaque_thing" | ||||||
|                               Name 68  "g_texdata_array2[0].tex[1]" |                               Name 76  "g_texdata_array2[1].nonopaque_thing" | ||||||
|                               Name 69  "g_texdata_array2[0].nonopaque_thing" |                               Name 77  "g_texdata_array2[2].samp" | ||||||
|                               Name 70  "g_texdata_array2[1].samp[1]" |                               Name 78  "g_texdata_array2[2].tex" | ||||||
|                               Name 71  "g_texdata_array2[1].tex[1]" |                               Name 79  "g_texdata_array2[2].nonopaque_thing" | ||||||
|                               Name 72  "g_texdata_array2[1].nonopaque_thing" |  | ||||||
|                               Name 73  "g_texdata_array2[2].samp[0]" |  | ||||||
|                               Name 74  "g_texdata_array2[2].samp[1]" |  | ||||||
|                               Name 75  "g_texdata_array2[2].tex[0]" |  | ||||||
|                               Name 76  "g_texdata_array2[2].tex[1]" |  | ||||||
|                               Name 77  "g_texdata_array2[2].nonopaque_thing" |  | ||||||
|                               Decorate 18(g_texdata.tex) DescriptorSet 0 |                               Decorate 18(g_texdata.tex) DescriptorSet 0 | ||||||
|                               Decorate 22(g_texdata.samp) DescriptorSet 0 |                               Decorate 22(g_texdata.samp) DescriptorSet 0 | ||||||
|                               Decorate 28(g_texdata_array[1].tex) DescriptorSet 0 |                               Decorate 28(g_texdata_array[1].tex) DescriptorSet 0 | ||||||
|                               Decorate 30(g_texdata_array[1].samp) DescriptorSet 0 |                               Decorate 30(g_texdata_array[1].samp) DescriptorSet 0 | ||||||
|                               Decorate 36(g_texdata_array2[1].tex[0]) DescriptorSet 0 |                               Decorate 40(g_texdata_array2[1].tex) DescriptorSet 0 | ||||||
|                               Decorate 38(g_texdata_array2[1].samp[0]) DescriptorSet 0 |                               Decorate 45(g_texdata_array2[1].samp) DescriptorSet 0 | ||||||
|                               Decorate 51(ps_output.color) Location 0 |                               Decorate 59(ps_output.color) Location 0 | ||||||
|                               Decorate 54(g_samp) DescriptorSet 0 |                               Decorate 62(g_samp) DescriptorSet 0 | ||||||
|                               Decorate 55(g_tex) DescriptorSet 0 |                               Decorate 63(g_tex) DescriptorSet 0 | ||||||
|                               Decorate 58(g_texdata_array[0].samp) DescriptorSet 0 |                               Decorate 66(g_texdata_array[0].samp) DescriptorSet 0 | ||||||
|                               Decorate 59(g_texdata_array[0].tex) DescriptorSet 0 |                               Decorate 67(g_texdata_array[0].tex) DescriptorSet 0 | ||||||
|                               Decorate 62(g_texdata_array[2].samp) DescriptorSet 0 |                               Decorate 70(g_texdata_array[2].samp) DescriptorSet 0 | ||||||
|                               Decorate 63(g_texdata_array[2].tex) DescriptorSet 0 |                               Decorate 71(g_texdata_array[2].tex) DescriptorSet 0 | ||||||
|                               Decorate 65(g_texdata_array2[0].samp[0]) DescriptorSet 0 |                               Decorate 73(g_texdata_array2[0].samp) DescriptorSet 0 | ||||||
|                               Decorate 66(g_texdata_array2[0].samp[1]) DescriptorSet 0 |                               Decorate 74(g_texdata_array2[0].tex) DescriptorSet 0 | ||||||
|                               Decorate 67(g_texdata_array2[0].tex[0]) DescriptorSet 0 |                               Decorate 77(g_texdata_array2[2].samp) DescriptorSet 0 | ||||||
|                               Decorate 68(g_texdata_array2[0].tex[1]) DescriptorSet 0 |                               Decorate 78(g_texdata_array2[2].tex) DescriptorSet 0 | ||||||
|                               Decorate 70(g_texdata_array2[1].samp[1]) DescriptorSet 0 |  | ||||||
|                               Decorate 71(g_texdata_array2[1].tex[1]) DescriptorSet 0 |  | ||||||
|                               Decorate 73(g_texdata_array2[2].samp[0]) DescriptorSet 0 |  | ||||||
|                               Decorate 74(g_texdata_array2[2].samp[1]) DescriptorSet 0 |  | ||||||
|                               Decorate 75(g_texdata_array2[2].tex[0]) DescriptorSet 0 |  | ||||||
|                               Decorate 76(g_texdata_array2[2].tex[1]) DescriptorSet 0 |  | ||||||
|                2:             TypeVoid |                2:             TypeVoid | ||||||
|                3:             TypeFunction 2 |                3:             TypeFunction 2 | ||||||
|                6:             TypeFloat 32 |                6:             TypeFloat 32 | ||||||
| @ -246,46 +234,46 @@ gl_FragCoord origin is upper left | |||||||
| 28(g_texdata_array[1].tex):     17(ptr) Variable UniformConstant | 28(g_texdata_array[1].tex):     17(ptr) Variable UniformConstant | ||||||
| 30(g_texdata_array[1].samp):     21(ptr) Variable UniformConstant | 30(g_texdata_array[1].samp):     21(ptr) Variable UniformConstant | ||||||
|               33:    6(float) Constant 1053609165 |               33:    6(float) Constant 1053609165 | ||||||
| 36(g_texdata_array2[1].tex[0]):     17(ptr) Variable UniformConstant |               36:             TypeInt 32 0 | ||||||
| 38(g_texdata_array2[1].samp[0]):     21(ptr) Variable UniformConstant |               37:     36(int) Constant 2 | ||||||
|               41:    6(float) Constant 1050253722 |               38:             TypeArray 16 37 | ||||||
|               44:             TypePointer Function 7(fvec4) |               39:             TypePointer UniformConstant 38 | ||||||
|               50:             TypePointer Output 7(fvec4) | 40(g_texdata_array2[1].tex):     39(ptr) Variable UniformConstant | ||||||
| 51(ps_output.color):     50(ptr) Variable Output |               43:             TypeArray 20 37 | ||||||
|       54(g_samp):     21(ptr) Variable UniformConstant |               44:             TypePointer UniformConstant 43 | ||||||
|        55(g_tex):     17(ptr) Variable UniformConstant | 45(g_texdata_array2[1].samp):     44(ptr) Variable UniformConstant | ||||||
|               56:             TypePointer UniformConstant 14(int) |               49:    6(float) Constant 1050253722 | ||||||
| 57(g_texdata.nonopaque_thing):     56(ptr) Variable UniformConstant |               52:             TypePointer Function 7(fvec4) | ||||||
| 58(g_texdata_array[0].samp):     21(ptr) Variable UniformConstant |               58:             TypePointer Output 7(fvec4) | ||||||
| 59(g_texdata_array[0].tex):     17(ptr) Variable UniformConstant | 59(ps_output.color):     58(ptr) Variable Output | ||||||
| 60(g_texdata_array[0].nonopaque_thing):     56(ptr) Variable UniformConstant |       62(g_samp):     21(ptr) Variable UniformConstant | ||||||
| 61(g_texdata_array[1].nonopaque_thing):     56(ptr) Variable UniformConstant |        63(g_tex):     17(ptr) Variable UniformConstant | ||||||
| 62(g_texdata_array[2].samp):     21(ptr) Variable UniformConstant |               64:             TypePointer UniformConstant 14(int) | ||||||
| 63(g_texdata_array[2].tex):     17(ptr) Variable UniformConstant | 65(g_texdata.nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 64(g_texdata_array[2].nonopaque_thing):     56(ptr) Variable UniformConstant | 66(g_texdata_array[0].samp):     21(ptr) Variable UniformConstant | ||||||
| 65(g_texdata_array2[0].samp[0]):     21(ptr) Variable UniformConstant | 67(g_texdata_array[0].tex):     17(ptr) Variable UniformConstant | ||||||
| 66(g_texdata_array2[0].samp[1]):     21(ptr) Variable UniformConstant | 68(g_texdata_array[0].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 67(g_texdata_array2[0].tex[0]):     17(ptr) Variable UniformConstant | 69(g_texdata_array[1].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 68(g_texdata_array2[0].tex[1]):     17(ptr) Variable UniformConstant | 70(g_texdata_array[2].samp):     21(ptr) Variable UniformConstant | ||||||
| 69(g_texdata_array2[0].nonopaque_thing):     56(ptr) Variable UniformConstant | 71(g_texdata_array[2].tex):     17(ptr) Variable UniformConstant | ||||||
| 70(g_texdata_array2[1].samp[1]):     21(ptr) Variable UniformConstant | 72(g_texdata_array[2].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 71(g_texdata_array2[1].tex[1]):     17(ptr) Variable UniformConstant | 73(g_texdata_array2[0].samp):     44(ptr) Variable UniformConstant | ||||||
| 72(g_texdata_array2[1].nonopaque_thing):     56(ptr) Variable UniformConstant | 74(g_texdata_array2[0].tex):     39(ptr) Variable UniformConstant | ||||||
| 73(g_texdata_array2[2].samp[0]):     21(ptr) Variable UniformConstant | 75(g_texdata_array2[0].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 74(g_texdata_array2[2].samp[1]):     21(ptr) Variable UniformConstant | 76(g_texdata_array2[1].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
| 75(g_texdata_array2[2].tex[0]):     17(ptr) Variable UniformConstant | 77(g_texdata_array2[2].samp):     44(ptr) Variable UniformConstant | ||||||
| 76(g_texdata_array2[2].tex[1]):     17(ptr) Variable UniformConstant | 78(g_texdata_array2[2].tex):     39(ptr) Variable UniformConstant | ||||||
| 77(g_texdata_array2[2].nonopaque_thing):     56(ptr) Variable UniformConstant | 79(g_texdata_array2[2].nonopaque_thing):     64(ptr) Variable UniformConstant | ||||||
|          4(main):           2 Function None 3 |          4(main):           2 Function None 3 | ||||||
|                5:             Label |                5:             Label | ||||||
|    46(ps_output):      9(ptr) Variable Function |    54(ps_output):      9(ptr) Variable Function | ||||||
|        47(param):      9(ptr) Variable Function |        55(param):      9(ptr) Variable Function | ||||||
|               48:           2 FunctionCall 12(@main(struct-PS_OUTPUT-vf41;) 47(param) |               56:           2 FunctionCall 12(@main(struct-PS_OUTPUT-vf41;) 55(param) | ||||||
|               49:8(PS_OUTPUT) Load 47(param) |               57:8(PS_OUTPUT) Load 55(param) | ||||||
|                               Store 46(ps_output) 49 |                               Store 54(ps_output) 57 | ||||||
|               52:     44(ptr) AccessChain 46(ps_output) 15 |               60:     52(ptr) AccessChain 54(ps_output) 15 | ||||||
|               53:    7(fvec4) Load 52 |               61:    7(fvec4) Load 60 | ||||||
|                               Store 51(ps_output.color) 53 |                               Store 59(ps_output.color) 61 | ||||||
|                               Return |                               Return | ||||||
|                               FunctionEnd |                               FunctionEnd | ||||||
| 12(@main(struct-PS_OUTPUT-vf41;):           2 Function None 10 | 12(@main(struct-PS_OUTPUT-vf41;):           2 Function None 10 | ||||||
| @ -300,12 +288,14 @@ gl_FragCoord origin is upper left | |||||||
|               32:          24 SampledImage 29 31 |               32:          24 SampledImage 29 31 | ||||||
|               34:    7(fvec4) ImageSampleImplicitLod 32 33 |               34:    7(fvec4) ImageSampleImplicitLod 32 33 | ||||||
|               35:    7(fvec4) FAdd 27 34 |               35:    7(fvec4) FAdd 27 34 | ||||||
|               37:          16 Load 36(g_texdata_array2[1].tex[0]) |               41:     17(ptr) AccessChain 40(g_texdata_array2[1].tex) 15 | ||||||
|               39:          20 Load 38(g_texdata_array2[1].samp[0]) |               42:          16 Load 41 | ||||||
|               40:          24 SampledImage 37 39 |               46:     21(ptr) AccessChain 45(g_texdata_array2[1].samp) 15 | ||||||
|               42:    7(fvec4) ImageSampleImplicitLod 40 41 |               47:          20 Load 46 | ||||||
|               43:    7(fvec4) FAdd 35 42 |               48:          24 SampledImage 42 47 | ||||||
|               45:     44(ptr) AccessChain 11(ps_output) 15 |               50:    7(fvec4) ImageSampleImplicitLod 48 49 | ||||||
|                               Store 45 43 |               51:    7(fvec4) FAdd 35 50 | ||||||
|  |               53:     52(ptr) AccessChain 11(ps_output) 15 | ||||||
|  |                               Store 53 51 | ||||||
|                               Return |                               Return | ||||||
|                               FunctionEnd |                               FunctionEnd | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								Test/hlsl.partialFlattenLocal.vert
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Test/hlsl.partialFlattenLocal.vert
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | Texture2D tex; | ||||||
|  | 
 | ||||||
|  | struct Packed { | ||||||
|  |   Texture2D     tex; | ||||||
|  |   float3        pos[3]; | ||||||
|  |   float2        uv[2]; | ||||||
|  |   float         x; | ||||||
|  |   int           n; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | float4 main(float4 pos : POSITION) : SV_POSITION | ||||||
|  | { | ||||||
|  |   Packed packed; | ||||||
|  |   packed.tex    = tex; | ||||||
|  |   packed.pos[0] = float3(0, 0, 0); | ||||||
|  |   packed.uv[0]  = float2(0, 1); | ||||||
|  |   packed.x      = 1.0; | ||||||
|  |   packed.n      = 3; | ||||||
|  | 
 | ||||||
|  |   for (int i = 0; i < 1; ++i) { | ||||||
|  |     packed.pos[i].xy += packed.uv[i]; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Packed packed2 = packed; | ||||||
|  | 
 | ||||||
|  |   return pos + float4(packed2.pos[0], 0); | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								Test/hlsl.partialFlattenMixed.vert
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								Test/hlsl.partialFlattenMixed.vert
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | Texture2D tex[2]; | ||||||
|  | 
 | ||||||
|  | struct Packed { | ||||||
|  |     int a; | ||||||
|  |     Texture2D     membTex[2]; | ||||||
|  |     int b; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | float4 main(float4 pos : POSITION) : SV_POSITION | ||||||
|  | { | ||||||
|  |     Packed packed; | ||||||
|  | 
 | ||||||
|  |     packed.membTex = tex; | ||||||
|  | 
 | ||||||
|  |     return pos; | ||||||
|  | } | ||||||
| @ -247,6 +247,7 @@ INSTANTIATE_TEST_CASE_P( | |||||||
|         {"hlsl.params.default.frag", "main"}, |         {"hlsl.params.default.frag", "main"}, | ||||||
|         {"hlsl.params.default.negative.frag", "main"}, |         {"hlsl.params.default.negative.frag", "main"}, | ||||||
|         {"hlsl.partialInit.frag", "PixelShaderFunction"}, |         {"hlsl.partialInit.frag", "PixelShaderFunction"}, | ||||||
|  |         {"hlsl.partialFlattenLocal.vert", "main"}, | ||||||
|         {"hlsl.pp.vert", "main"}, |         {"hlsl.pp.vert", "main"}, | ||||||
|         {"hlsl.pp.line.frag", "main"}, |         {"hlsl.pp.line.frag", "main"}, | ||||||
|         {"hlsl.precise.frag", "main"}, |         {"hlsl.precise.frag", "main"}, | ||||||
| @ -367,6 +368,7 @@ INSTANTIATE_TEST_CASE_P( | |||||||
|     ToSpirv, HlslCompileAndFlattenTest, |     ToSpirv, HlslCompileAndFlattenTest, | ||||||
|     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{ |     ::testing::ValuesIn(std::vector<FileNameEntryPointPair>{ | ||||||
|         {"hlsl.array.flatten.frag", "main"}, |         {"hlsl.array.flatten.frag", "main"}, | ||||||
|  |         {"hlsl.partialFlattenMixed.vert", "main"}, | ||||||
|     }), |     }), | ||||||
|     FileNameAsCustomTestSuffix |     FileNameAsCustomTestSuffix | ||||||
| ); | ); | ||||||
|  | |||||||
| @ -1146,13 +1146,22 @@ const TType& HlslParseContext::split(const TType& type, const TString& name, con | |||||||
|     return type; |     return type; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Is this a uniform array or structure which should be flattened?
 | // Is this an aggregate that should be flattened?
 | ||||||
| bool HlslParseContext::shouldFlatten(const TType& type) const | // Can be applied to intermediate levels of type in a hierarchy.
 | ||||||
|  | // Some things like flattening uniform arrays are only about the top level
 | ||||||
|  | // of the aggregate, triggered on 'topLevel'.
 | ||||||
|  | bool HlslParseContext::shouldFlatten(const TType& type, TStorageQualifier qualifier, bool topLevel) const | ||||||
| { | { | ||||||
|     const TStorageQualifier qualifier = type.getQualifier().storage; |     switch (qualifier) { | ||||||
| 
 |     case EvqVaryingIn: | ||||||
|     return (qualifier == EvqUniform && type.isArray() && intermediate.getFlattenUniformArrays()) || |     case EvqVaryingOut: | ||||||
|            (type.isStruct() && type.containsOpaque()); |         return type.isStruct() || type.isArray(); | ||||||
|  |     case EvqUniform: | ||||||
|  |         return type.isArray() && intermediate.getFlattenUniformArrays() && topLevel || | ||||||
|  |                type.isStruct() && type.containsOpaque(); | ||||||
|  |     default: | ||||||
|  |         return type.isStruct() && type.containsOpaque(); | ||||||
|  |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Top level variable flattening: construct data
 | // Top level variable flattening: construct data
 | ||||||
| @ -1223,7 +1232,7 @@ int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType& | |||||||
|                                          const TQualifier& outerQualifier, |                                          const TQualifier& outerQualifier, | ||||||
|                                          const TArraySizes* builtInArraySizes) |                                          const TArraySizes* builtInArraySizes) | ||||||
| { | { | ||||||
|     if (isFinalFlattening(type)) { |     if (!shouldFlatten(type, outerQualifier.storage, false)) { | ||||||
|         // This is as far as we flatten.  Insert the variable.
 |         // This is as far as we flatten.  Insert the variable.
 | ||||||
|         TVariable* memberVariable = makeInternalVariable(memberName, type); |         TVariable* memberVariable = makeInternalVariable(memberName, type); | ||||||
|         mergeQualifiers(memberVariable->getWritableType().getQualifier(), variable.getType().getQualifier()); |         mergeQualifiers(memberVariable->getWritableType().getQualifier(), variable.getType().getQualifier()); | ||||||
| @ -1347,11 +1356,13 @@ TIntermTyped* HlslParseContext::flattenAccess(TIntermTyped* base, int member) | |||||||
| { | { | ||||||
|     const TType dereferencedType(base->getType(), member);  // dereferenced type
 |     const TType dereferencedType(base->getType(), member);  // dereferenced type
 | ||||||
|     const TIntermSymbol& symbolNode = *base->getAsSymbolNode(); |     const TIntermSymbol& symbolNode = *base->getAsSymbolNode(); | ||||||
|     TIntermTyped* flattened = flattenAccess(symbolNode.getId(), member, dereferencedType, symbolNode.getFlattenSubset()); |     TIntermTyped* flattened = flattenAccess(symbolNode.getId(), member, base->getQualifier().storage, | ||||||
|  |                                             dereferencedType, symbolNode.getFlattenSubset()); | ||||||
| 
 | 
 | ||||||
|     return flattened ? flattened : base; |     return flattened ? flattened : base; | ||||||
| } | } | ||||||
| TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TType& dereferencedType, int subset) | TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage, | ||||||
|  |     const TType& dereferencedType, int subset) | ||||||
| { | { | ||||||
|     const auto flattenData = flattenMap.find(uniqueId); |     const auto flattenData = flattenMap.find(uniqueId); | ||||||
| 
 | 
 | ||||||
| @ -1362,7 +1373,7 @@ TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TT | |||||||
|     int newSubset = flattenData->second.offsets[subset >= 0 ? subset + member : member]; |     int newSubset = flattenData->second.offsets[subset >= 0 ? subset + member : member]; | ||||||
| 
 | 
 | ||||||
|     TIntermSymbol* subsetSymbol; |     TIntermSymbol* subsetSymbol; | ||||||
|     if (isFinalFlattening(dereferencedType)) { |     if (!shouldFlatten(dereferencedType, outerStorage, false)) { | ||||||
|         // Finished flattening: create symbol for variable
 |         // Finished flattening: create symbol for variable
 | ||||||
|         member = flattenData->second.offsets[newSubset]; |         member = flattenData->second.offsets[newSubset]; | ||||||
|         const TVariable* memberVariable = flattenData->second.members[member]; |         const TVariable* memberVariable = flattenData->second.members[member]; | ||||||
| @ -1670,7 +1681,7 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l | |||||||
|                 error(loc, "redefinition", variable->getName().c_str(), ""); |                 error(loc, "redefinition", variable->getName().c_str(), ""); | ||||||
| 
 | 
 | ||||||
|             // Add parameters to the AST list.
 |             // Add parameters to the AST list.
 | ||||||
|             if (shouldFlatten(variable->getType())) { |             if (shouldFlatten(variable->getType(), variable->getType().getQualifier().storage, true)) { | ||||||
|                 // Expand the AST parameter nodes (but not the name mangling or symbol table view)
 |                 // Expand the AST parameter nodes (but not the name mangling or symbol table view)
 | ||||||
|                 // for structures that need to be flattened.
 |                 // for structures that need to be flattened.
 | ||||||
|                 flatten(*variable, false); |                 flatten(*variable, false); | ||||||
| @ -1678,6 +1689,7 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l | |||||||
|                 for (int mem = 0; mem < (int)structure->size(); ++mem) { |                 for (int mem = 0; mem < (int)structure->size(); ++mem) { | ||||||
|                     paramNodes = intermediate.growAggregate(paramNodes, |                     paramNodes = intermediate.growAggregate(paramNodes, | ||||||
|                                                             flattenAccess(variable->getUniqueId(), mem, |                                                             flattenAccess(variable->getUniqueId(), mem, | ||||||
|  |                                                                           variable->getType().getQualifier().storage, | ||||||
|                                                                           *(*structure)[mem].type), |                                                                           *(*structure)[mem].type), | ||||||
|                                                             loc); |                                                             loc); | ||||||
|                 } |                 } | ||||||
| @ -1931,7 +1943,7 @@ TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunct | |||||||
|             if (variable.getType().getQualifier().isArrayedIo(language)) { |             if (variable.getType().getQualifier().isArrayedIo(language)) { | ||||||
|                 if (variable.getType().containsBuiltIn()) |                 if (variable.getType().containsBuiltIn()) | ||||||
|                     split(variable); |                     split(variable); | ||||||
|             } else |             } else if (shouldFlatten(variable.getType(), EvqVaryingIn /* not assigned yet, but close enough */, true)) | ||||||
|                 flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */); |                 flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */); | ||||||
|         } |         } | ||||||
|         // TODO: flatten arrays too
 |         // TODO: flatten arrays too
 | ||||||
| @ -2616,9 +2628,9 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|     int leftOffset = findSubtreeOffset(*left); |     int leftOffset = findSubtreeOffset(*left); | ||||||
|     int rightOffset = findSubtreeOffset(*right); |     int rightOffset = findSubtreeOffset(*right); | ||||||
| 
 | 
 | ||||||
|     const auto getMember = [&](bool isLeft, const TType& type, int member, TIntermTyped* splitNode, int splitMember) |     const auto getMember = [&](bool isLeft, const TType& type, int member, TIntermTyped* splitNode, int splitMember, | ||||||
|  |                                bool flattened) | ||||||
|                            -> TIntermTyped * { |                            -> TIntermTyped * { | ||||||
|         const bool flattened = isLeft ? isFlattenLeft : isFlattenRight; |  | ||||||
|         const bool split     = isLeft ? isSplitLeft   : isSplitRight; |         const bool split     = isLeft ? isSplitLeft   : isSplitRight; | ||||||
| 
 | 
 | ||||||
|         TIntermTyped* subTree; |         TIntermTyped* subTree; | ||||||
| @ -2643,7 +2655,7 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|                                                 intermediate.addConstantUnion(arrayElement.back(), loc), loc); |                                                 intermediate.addConstantUnion(arrayElement.back(), loc), loc); | ||||||
|                 subTree->setType(splitDerefType); |                 subTree->setType(splitDerefType); | ||||||
|             } |             } | ||||||
|         } else if (flattened && isFinalFlattening(derefType)) { |         } else if (flattened && !shouldFlatten(derefType, isLeft ? leftStorage : rightStorage, false)) { | ||||||
|             if (isLeft) |             if (isLeft) | ||||||
|                 subTree = intermediate.addSymbol(*(*leftVariables)[leftOffset++]); |                 subTree = intermediate.addSymbol(*(*leftVariables)[leftOffset++]); | ||||||
|             else |             else | ||||||
| @ -2674,12 +2686,19 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
| 
 | 
 | ||||||
|     // Cannot use auto here, because this is recursive, and auto can't work out the type without seeing the
 |     // Cannot use auto here, because this is recursive, and auto can't work out the type without seeing the
 | ||||||
|     // whole thing.  So, we'll resort to an explicit type via std::function.
 |     // whole thing.  So, we'll resort to an explicit type via std::function.
 | ||||||
|     const std::function<void(TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight)> |     const std::function<void(TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight, | ||||||
|     traverse = [&](TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight) -> void { |                              bool topLevel)> | ||||||
|  |     traverse = [&](TIntermTyped* left, TIntermTyped* right, TIntermTyped* splitLeft, TIntermTyped* splitRight, | ||||||
|  |                    bool topLevel) -> void { | ||||||
|         // If we get here, we are assigning to or from a whole array or struct that must be
 |         // If we get here, we are assigning to or from a whole array or struct that must be
 | ||||||
|         // flattened, so have to do member-by-member assignment:
 |         // flattened, so have to do member-by-member assignment:
 | ||||||
| 
 | 
 | ||||||
|         if (left->getType().isArray() || right->getType().isArray()) { |         bool shouldFlattenSubsetLeft = isFlattenLeft && shouldFlatten(left->getType(), leftStorage, topLevel); | ||||||
|  |         bool shouldFlattenSubsetRight = isFlattenRight && shouldFlatten(right->getType(), rightStorage, topLevel); | ||||||
|  | 
 | ||||||
|  |         if ((left->getType().isArray() || right->getType().isArray()) && | ||||||
|  |               (shouldFlattenSubsetLeft  || isSplitLeft || | ||||||
|  |                shouldFlattenSubsetRight || isSplitRight)) { | ||||||
|             const int elementsL = left->getType().isArray()  ? left->getType().getOuterArraySize()  : 1; |             const int elementsL = left->getType().isArray()  ? left->getType().getOuterArraySize()  : 1; | ||||||
|             const int elementsR = right->getType().isArray() ? right->getType().getOuterArraySize() : 1; |             const int elementsR = right->getType().isArray() ? right->getType().getOuterArraySize() : 1; | ||||||
| 
 | 
 | ||||||
| @ -2692,19 +2711,24 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|                 arrayElement.push_back(element); |                 arrayElement.push_back(element); | ||||||
| 
 | 
 | ||||||
|                 // Add a new AST symbol node if we have a temp variable holding a complex RHS.
 |                 // Add a new AST symbol node if we have a temp variable holding a complex RHS.
 | ||||||
|                 TIntermTyped* subLeft  = getMember(true,  left->getType(),  element, left, element); |                 TIntermTyped* subLeft  = getMember(true,  left->getType(),  element, left, element, | ||||||
|                 TIntermTyped* subRight = getMember(false, right->getType(), element, right, element); |                                                    shouldFlattenSubsetLeft); | ||||||
|  |                 TIntermTyped* subRight = getMember(false, right->getType(), element, right, element, | ||||||
|  |                                                    shouldFlattenSubsetRight); | ||||||
| 
 | 
 | ||||||
|                 TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  element, splitLeft, element) |                 TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  element, splitLeft, | ||||||
|  |                                                                        element, shouldFlattenSubsetLeft) | ||||||
|                                                            : subLeft; |                                                            : subLeft; | ||||||
|                 TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), element, splitRight, element) |                 TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), element, splitRight, | ||||||
|  |                                                                        element, shouldFlattenSubsetRight) | ||||||
|                                                            : subRight; |                                                            : subRight; | ||||||
| 
 | 
 | ||||||
|                 traverse(subLeft, subRight, subSplitLeft, subSplitRight); |                 traverse(subLeft, subRight, subSplitLeft, subSplitRight, false); | ||||||
| 
 | 
 | ||||||
|                 arrayElement.pop_back(); |                 arrayElement.pop_back(); | ||||||
|             } |             } | ||||||
|         } else if (left->getType().isStruct()) { |         } else if (left->getType().isStruct() && (shouldFlattenSubsetLeft  || isSplitLeft || | ||||||
|  |                                                   shouldFlattenSubsetRight || isSplitRight)) { | ||||||
|             // struct case
 |             // struct case
 | ||||||
|             const auto& membersL = *left->getType().getStruct(); |             const auto& membersL = *left->getType().getStruct(); | ||||||
|             const auto& membersR = *right->getType().getStruct(); |             const auto& membersR = *right->getType().getStruct(); | ||||||
| @ -2722,13 +2746,17 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|                 const TType& typeL = *membersL[member].type; |                 const TType& typeL = *membersL[member].type; | ||||||
|                 const TType& typeR = *membersR[member].type; |                 const TType& typeR = *membersR[member].type; | ||||||
| 
 | 
 | ||||||
|                 TIntermTyped* subLeft  = getMember(true,  left->getType(), member, left, member); |                 TIntermTyped* subLeft  = getMember(true,  left->getType(), member, left, member, | ||||||
|                 TIntermTyped* subRight = getMember(false, right->getType(), member, right, member); |                                                    shouldFlattenSubsetLeft); | ||||||
|  |                 TIntermTyped* subRight = getMember(false, right->getType(), member, right, member, | ||||||
|  |                                                    shouldFlattenSubsetRight); | ||||||
| 
 | 
 | ||||||
|                 // If there is no splitting, use the same values to avoid inefficiency.
 |                 // If there is no splitting, use the same values to avoid inefficiency.
 | ||||||
|                 TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  member, splitLeft, memberL) |                 TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left->getType(),  member, splitLeft, | ||||||
|  |                                                                        memberL, shouldFlattenSubsetLeft) | ||||||
|                                                            : subLeft; |                                                            : subLeft; | ||||||
|                 TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), member, splitRight, memberR) |                 TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right->getType(), member, splitRight, | ||||||
|  |                                                                        memberR, shouldFlattenSubsetRight) | ||||||
|                                                            : subRight; |                                                            : subRight; | ||||||
| 
 | 
 | ||||||
|                 if (isClipOrCullDistance(subSplitLeft->getType()) || isClipOrCullDistance(subSplitRight->getType())) { |                 if (isClipOrCullDistance(subSplitLeft->getType()) || isClipOrCullDistance(subSplitRight->getType())) { | ||||||
| @ -2747,9 +2775,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
| 
 | 
 | ||||||
|                     assignList = intermediate.growAggregate(assignList, clipCullAssign, loc); |                     assignList = intermediate.growAggregate(assignList, clipCullAssign, loc); | ||||||
| 
 | 
 | ||||||
|                 } else if (!isFlattenLeft && !isFlattenRight && |                 } else if (!shouldFlattenSubsetLeft && !shouldFlattenSubsetRight && | ||||||
|                            !typeL.containsBuiltIn() && |                            !typeL.containsBuiltIn() && !typeR.containsBuiltIn()) { | ||||||
|                            !typeR.containsBuiltIn()) { |  | ||||||
|                     // If this is the final flattening (no nested types below to flatten)
 |                     // If this is the final flattening (no nested types below to flatten)
 | ||||||
|                     // we'll copy the member, else recurse into the type hierarchy.
 |                     // we'll copy the member, else recurse into the type hierarchy.
 | ||||||
|                     // However, if splitting the struct, that means we can copy a whole
 |                     // However, if splitting the struct, that means we can copy a whole
 | ||||||
| @ -2762,7 +2789,7 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|                                                             intermediate.addAssign(op, subSplitLeft, subSplitRight, loc), |                                                             intermediate.addAssign(op, subSplitLeft, subSplitRight, loc), | ||||||
|                                                             loc); |                                                             loc); | ||||||
|                 } else { |                 } else { | ||||||
|                     traverse(subLeft, subRight, subSplitLeft, subSplitRight); |                     traverse(subLeft, subRight, subSplitLeft, subSplitRight, false); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 memberL += (typeL.isBuiltIn() ? 0 : 1); |                 memberL += (typeL.isBuiltIn() ? 0 : 1); | ||||||
| @ -2804,7 +2831,7 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|         splitRight = intermediate.addSymbol(*getSplitNonIoVar(right->getAsSymbolNode()->getId()), loc); |         splitRight = intermediate.addSymbol(*getSplitNonIoVar(right->getAsSymbolNode()->getId()), loc); | ||||||
| 
 | 
 | ||||||
|     // This makes the whole assignment, recursing through subtypes as needed.
 |     // This makes the whole assignment, recursing through subtypes as needed.
 | ||||||
|     traverse(left, right, splitLeft, splitRight); |     traverse(left, right, splitLeft, splitRight, true); | ||||||
| 
 | 
 | ||||||
|     assert(assignList != nullptr); |     assert(assignList != nullptr); | ||||||
|     assignList->setOperator(EOpSequence); |     assignList->setOperator(EOpSequence); | ||||||
| @ -5090,7 +5117,8 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct | |||||||
|                         // add buffer and counter buffer argument qualifier
 |                         // add buffer and counter buffer argument qualifier
 | ||||||
|                         qualifierList.push_back(qual); |                         qualifierList.push_back(qual); | ||||||
|                         qualifierList.push_back(qual); |                         qualifierList.push_back(qual); | ||||||
|                     } else if (shouldFlatten(*(*fnCandidate)[i].type)) { |                     } else if (shouldFlatten(*(*fnCandidate)[i].type, (*fnCandidate)[i].type->getQualifier().storage, | ||||||
|  |                                              true)) { | ||||||
|                         // add structure member expansion
 |                         // add structure member expansion
 | ||||||
|                         for (int memb = 0; memb < (int)(*fnCandidate)[i].type->getStruct()->size(); ++memb) |                         for (int memb = 0; memb < (int)(*fnCandidate)[i].type->getStruct()->size(); ++memb) | ||||||
|                             qualifierList.push_back(qual); |                             qualifierList.push_back(qual); | ||||||
| @ -5179,7 +5207,7 @@ void HlslParseContext::addInputArgumentConversions(const TFunction& function, TI | |||||||
|             if (wasFlattened(arg)) { |             if (wasFlattened(arg)) { | ||||||
|                 // If both formal and calling arg are to be flattened, leave that to argument
 |                 // If both formal and calling arg are to be flattened, leave that to argument
 | ||||||
|                 // expansion, not conversion.
 |                 // expansion, not conversion.
 | ||||||
|                 if (!shouldFlatten(*function[param].type)) { |                 if (!shouldFlatten(*function[param].type, function[param].type->getQualifier().storage, true)) { | ||||||
|                     // Will make a two-level subtree.
 |                     // Will make a two-level subtree.
 | ||||||
|                     // The deepest will copy member-by-member to build the structure to pass.
 |                     // The deepest will copy member-by-member to build the structure to pass.
 | ||||||
|                     // The level above that will be a two-operand EOpComma sequence that follows the copy by the
 |                     // The level above that will be a two-operand EOpComma sequence that follows the copy by the
 | ||||||
| @ -5256,7 +5284,7 @@ void HlslParseContext::expandArguments(const TSourceLoc& loc, const TFunction& f | |||||||
|                                         aggregate->getSequence()[param + functionParamNumberOffset]->getAsTyped() : |                                         aggregate->getSequence()[param + functionParamNumberOffset]->getAsTyped() : | ||||||
|                                         arguments->getAsTyped()); |                                         arguments->getAsTyped()); | ||||||
| 
 | 
 | ||||||
|         if (wasFlattened(arg) && shouldFlatten(*function[param].type)) { |         if (wasFlattened(arg) && shouldFlatten(*function[param].type, function[param].type->getQualifier().storage, true)) { | ||||||
|             // Need to pass the structure members instead of the structure.
 |             // Need to pass the structure members instead of the structure.
 | ||||||
|             TVector<TIntermTyped*> memberArgs; |             TVector<TIntermTyped*> memberArgs; | ||||||
|             for (int memb = 0; memb < (int)arg->getType().getStruct()->size(); ++memb) |             for (int memb = 0; memb < (int)arg->getType().getStruct()->size(); ++memb) | ||||||
| @ -7439,7 +7467,7 @@ TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, const TStr | |||||||
| 
 | 
 | ||||||
|     inheritGlobalDefaults(type.getQualifier()); |     inheritGlobalDefaults(type.getQualifier()); | ||||||
| 
 | 
 | ||||||
|     const bool flattenVar = shouldFlatten(type); |     const bool flattenVar = shouldFlatten(type, type.getQualifier().storage, true); | ||||||
| 
 | 
 | ||||||
|     // correct IO in the type
 |     // correct IO in the type
 | ||||||
|     switch (type.getQualifier().storage) { |     switch (type.getQualifier().storage) { | ||||||
|  | |||||||
| @ -244,15 +244,14 @@ protected: | |||||||
| 
 | 
 | ||||||
|     // Array and struct flattening
 |     // Array and struct flattening
 | ||||||
|     TIntermTyped* flattenAccess(TIntermTyped* base, int member); |     TIntermTyped* flattenAccess(TIntermTyped* base, int member); | ||||||
|     TIntermTyped* flattenAccess(int uniqueId, int member, const TType&, int subset = -1); |     TIntermTyped* flattenAccess(int uniqueId, int member, TStorageQualifier outerStorage, const TType&, int subset = -1); | ||||||
|     int findSubtreeOffset(const TIntermNode&) const; |     int findSubtreeOffset(const TIntermNode&) const; | ||||||
|     int findSubtreeOffset(const TType&, int subset, const TVector<int>& offsets) const; |     int findSubtreeOffset(const TType&, int subset, const TVector<int>& offsets) const; | ||||||
|     bool shouldFlatten(const TType&) const; |     bool shouldFlatten(const TType&, TStorageQualifier, bool topLevel) const; | ||||||
|     bool wasFlattened(const TIntermTyped* node) const; |     bool wasFlattened(const TIntermTyped* node) const; | ||||||
|     bool wasFlattened(int id) const { return flattenMap.find(id) != flattenMap.end(); } |     bool wasFlattened(int id) const { return flattenMap.find(id) != flattenMap.end(); } | ||||||
|     int  addFlattenedMember(const TVariable&, const TType&, TFlattenData&, const TString& name, bool linkage, |     int  addFlattenedMember(const TVariable&, const TType&, TFlattenData&, const TString& name, bool linkage, | ||||||
|                             const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes); |                             const TQualifier& outerQualifier, const TArraySizes* builtInArraySizes); | ||||||
|     bool isFinalFlattening(const TType& type) const { return !(type.isStruct() || type.isArray()); } |  | ||||||
| 
 | 
 | ||||||
|     // Structure splitting (splits interstage built-in types into its own struct)
 |     // Structure splitting (splits interstage built-in types into its own struct)
 | ||||||
|     void split(const TVariable&); |     void split(const TVariable&); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Kessenich
						John Kessenich