Merge pull request #725 from steve-lunarg/structurebuffer
HLSL: implement 4 (of 6) structuredbuffer types
This commit is contained in:
		
						commit
						2fbe08c763
					
				| @ -1125,7 +1125,8 @@ Id Builder::createAccessChain(StorageClass storageClass, Id base, const std::vec | |||||||
| 
 | 
 | ||||||
| Id Builder::createArrayLength(Id base, unsigned int member) | Id Builder::createArrayLength(Id base, unsigned int member) | ||||||
| { | { | ||||||
|     Instruction* length = new Instruction(getUniqueId(), makeIntType(32), OpArrayLength); |     spv::Id intType = makeIntType(32); | ||||||
|  |     Instruction* length = new Instruction(getUniqueId(), intType, OpArrayLength); | ||||||
|     length->addIdOperand(base); |     length->addIdOperand(base); | ||||||
|     length->addImmediateOperand(member); |     length->addImmediateOperand(member); | ||||||
|     buildPoint->addInstruction(std::unique_ptr<Instruction>(length)); |     buildPoint->addInstruction(std::unique_ptr<Instruction>(length)); | ||||||
|  | |||||||
							
								
								
									
										599
									
								
								Test/baseResults/hlsl.structbuffer.atomics.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										599
									
								
								Test/baseResults/hlsl.structbuffer.atomics.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,599 @@ | |||||||
|  | hlsl.structbuffer.atomics.frag | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:5  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:5      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:8      AtomicAdd (temp void) | ||||||
|  | 0:8        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              0 (const uint) | ||||||
|  | 0:8          right-shift (temp int) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              8 (const int) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              2 (const int) | ||||||
|  | 0:8        Constant: | ||||||
|  | 0:8          1 (const int) | ||||||
|  | 0:9      move second child to first child (temp uint) | ||||||
|  | 0:9        'u' (temp uint) | ||||||
|  | 0:9        AtomicAdd (temp uint) | ||||||
|  | 0:9          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                0 (const uint) | ||||||
|  | 0:9            right-shift (temp int) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                8 (const int) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                2 (const int) | ||||||
|  | 0:9          Constant: | ||||||
|  | 0:9            1 (const int) | ||||||
|  | 0:10      AtomicAnd (temp void) | ||||||
|  | 0:10        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              0 (const uint) | ||||||
|  | 0:10          right-shift (temp int) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              8 (const int) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              2 (const int) | ||||||
|  | 0:10        Constant: | ||||||
|  | 0:10          1 (const int) | ||||||
|  | 0:11      move second child to first child (temp uint) | ||||||
|  | 0:11        'u' (temp uint) | ||||||
|  | 0:11        AtomicAnd (temp uint) | ||||||
|  | 0:11          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                0 (const uint) | ||||||
|  | 0:11            right-shift (temp int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                8 (const int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                2 (const int) | ||||||
|  | 0:11          Constant: | ||||||
|  | 0:11            1 (const int) | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:12        'u' (temp uint) | ||||||
|  | 0:12        Convert int to uint (temp uint) | ||||||
|  | 0:12          AtomicCompSwap (temp int) | ||||||
|  | 0:12            indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  0 (const uint) | ||||||
|  | 0:12              right-shift (temp int) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  8 (const int) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  2 (const int) | ||||||
|  | 0:12            Constant: | ||||||
|  | 0:12              1 (const int) | ||||||
|  | 0:12            Constant: | ||||||
|  | 0:12              2 (const int) | ||||||
|  | 0:14      move second child to first child (temp uint) | ||||||
|  | 0:14        'u' (temp uint) | ||||||
|  | 0:14        AtomicExchange (temp uint) | ||||||
|  | 0:14          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                0 (const uint) | ||||||
|  | 0:14            right-shift (temp int) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                8 (const int) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                2 (const int) | ||||||
|  | 0:14          Constant: | ||||||
|  | 0:14            1 (const int) | ||||||
|  | 0:15      AtomicMax (temp void) | ||||||
|  | 0:15        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              0 (const uint) | ||||||
|  | 0:15          right-shift (temp int) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              8 (const int) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              2 (const int) | ||||||
|  | 0:15        Constant: | ||||||
|  | 0:15          1 (const int) | ||||||
|  | 0:16      move second child to first child (temp uint) | ||||||
|  | 0:16        'u' (temp uint) | ||||||
|  | 0:16        AtomicMax (temp uint) | ||||||
|  | 0:16          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                0 (const uint) | ||||||
|  | 0:16            right-shift (temp int) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                8 (const int) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                2 (const int) | ||||||
|  | 0:16          Constant: | ||||||
|  | 0:16            1 (const int) | ||||||
|  | 0:17      AtomicMin (temp void) | ||||||
|  | 0:17        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              0 (const uint) | ||||||
|  | 0:17          right-shift (temp int) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              8 (const int) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              2 (const int) | ||||||
|  | 0:17        Constant: | ||||||
|  | 0:17          1 (const int) | ||||||
|  | 0:18      move second child to first child (temp uint) | ||||||
|  | 0:18        'u' (temp uint) | ||||||
|  | 0:18        AtomicMin (temp uint) | ||||||
|  | 0:18          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                0 (const uint) | ||||||
|  | 0:18            right-shift (temp int) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                8 (const int) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                2 (const int) | ||||||
|  | 0:18          Constant: | ||||||
|  | 0:18            1 (const int) | ||||||
|  | 0:19      AtomicOr (temp void) | ||||||
|  | 0:19        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              0 (const uint) | ||||||
|  | 0:19          right-shift (temp int) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              8 (const int) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              2 (const int) | ||||||
|  | 0:19        Constant: | ||||||
|  | 0:19          1 (const int) | ||||||
|  | 0:20      move second child to first child (temp uint) | ||||||
|  | 0:20        'u' (temp uint) | ||||||
|  | 0:20        AtomicOr (temp uint) | ||||||
|  | 0:20          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                0 (const uint) | ||||||
|  | 0:20            right-shift (temp int) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                8 (const int) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                2 (const int) | ||||||
|  | 0:20          Constant: | ||||||
|  | 0:20            1 (const int) | ||||||
|  | 0:21      AtomicXor (temp void) | ||||||
|  | 0:21        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              0 (const uint) | ||||||
|  | 0:21          right-shift (temp int) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              8 (const int) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              2 (const int) | ||||||
|  | 0:21        Constant: | ||||||
|  | 0:21          1 (const int) | ||||||
|  | 0:22      move second child to first child (temp uint) | ||||||
|  | 0:22        'u' (temp uint) | ||||||
|  | 0:22        AtomicXor (temp uint) | ||||||
|  | 0:22          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                0 (const uint) | ||||||
|  | 0:22            right-shift (temp int) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                8 (const int) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                2 (const int) | ||||||
|  | 0:22          Constant: | ||||||
|  | 0:22            1 (const int) | ||||||
|  | 0:24      Branch: Return with expression | ||||||
|  | 0:24        Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:24          Convert uint to float (temp float) | ||||||
|  | 0:24            indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:24                Constant: | ||||||
|  | 0:24                  0 (const uint) | ||||||
|  | 0:24              right-shift (temp int) | ||||||
|  | 0:24                'pos' (in uint) | ||||||
|  | 0:24                Constant: | ||||||
|  | 0:24                  2 (const int) | ||||||
|  | 0:5  Function Definition: main( (temp void) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:5      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:5      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:5        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:5  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:5      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:8      AtomicAdd (temp void) | ||||||
|  | 0:8        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              0 (const uint) | ||||||
|  | 0:8          right-shift (temp int) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              8 (const int) | ||||||
|  | 0:8            Constant: | ||||||
|  | 0:8              2 (const int) | ||||||
|  | 0:8        Constant: | ||||||
|  | 0:8          1 (const int) | ||||||
|  | 0:9      move second child to first child (temp uint) | ||||||
|  | 0:9        'u' (temp uint) | ||||||
|  | 0:9        AtomicAdd (temp uint) | ||||||
|  | 0:9          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                0 (const uint) | ||||||
|  | 0:9            right-shift (temp int) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                8 (const int) | ||||||
|  | 0:9              Constant: | ||||||
|  | 0:9                2 (const int) | ||||||
|  | 0:9          Constant: | ||||||
|  | 0:9            1 (const int) | ||||||
|  | 0:10      AtomicAnd (temp void) | ||||||
|  | 0:10        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              0 (const uint) | ||||||
|  | 0:10          right-shift (temp int) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              8 (const int) | ||||||
|  | 0:10            Constant: | ||||||
|  | 0:10              2 (const int) | ||||||
|  | 0:10        Constant: | ||||||
|  | 0:10          1 (const int) | ||||||
|  | 0:11      move second child to first child (temp uint) | ||||||
|  | 0:11        'u' (temp uint) | ||||||
|  | 0:11        AtomicAnd (temp uint) | ||||||
|  | 0:11          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                0 (const uint) | ||||||
|  | 0:11            right-shift (temp int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                8 (const int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                2 (const int) | ||||||
|  | 0:11          Constant: | ||||||
|  | 0:11            1 (const int) | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:12        'u' (temp uint) | ||||||
|  | 0:12        Convert int to uint (temp uint) | ||||||
|  | 0:12          AtomicCompSwap (temp int) | ||||||
|  | 0:12            indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  0 (const uint) | ||||||
|  | 0:12              right-shift (temp int) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  8 (const int) | ||||||
|  | 0:12                Constant: | ||||||
|  | 0:12                  2 (const int) | ||||||
|  | 0:12            Constant: | ||||||
|  | 0:12              1 (const int) | ||||||
|  | 0:12            Constant: | ||||||
|  | 0:12              2 (const int) | ||||||
|  | 0:14      move second child to first child (temp uint) | ||||||
|  | 0:14        'u' (temp uint) | ||||||
|  | 0:14        AtomicExchange (temp uint) | ||||||
|  | 0:14          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                0 (const uint) | ||||||
|  | 0:14            right-shift (temp int) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                8 (const int) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                2 (const int) | ||||||
|  | 0:14          Constant: | ||||||
|  | 0:14            1 (const int) | ||||||
|  | 0:15      AtomicMax (temp void) | ||||||
|  | 0:15        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              0 (const uint) | ||||||
|  | 0:15          right-shift (temp int) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              8 (const int) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              2 (const int) | ||||||
|  | 0:15        Constant: | ||||||
|  | 0:15          1 (const int) | ||||||
|  | 0:16      move second child to first child (temp uint) | ||||||
|  | 0:16        'u' (temp uint) | ||||||
|  | 0:16        AtomicMax (temp uint) | ||||||
|  | 0:16          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                0 (const uint) | ||||||
|  | 0:16            right-shift (temp int) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                8 (const int) | ||||||
|  | 0:16              Constant: | ||||||
|  | 0:16                2 (const int) | ||||||
|  | 0:16          Constant: | ||||||
|  | 0:16            1 (const int) | ||||||
|  | 0:17      AtomicMin (temp void) | ||||||
|  | 0:17        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              0 (const uint) | ||||||
|  | 0:17          right-shift (temp int) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              8 (const int) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              2 (const int) | ||||||
|  | 0:17        Constant: | ||||||
|  | 0:17          1 (const int) | ||||||
|  | 0:18      move second child to first child (temp uint) | ||||||
|  | 0:18        'u' (temp uint) | ||||||
|  | 0:18        AtomicMin (temp uint) | ||||||
|  | 0:18          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                0 (const uint) | ||||||
|  | 0:18            right-shift (temp int) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                8 (const int) | ||||||
|  | 0:18              Constant: | ||||||
|  | 0:18                2 (const int) | ||||||
|  | 0:18          Constant: | ||||||
|  | 0:18            1 (const int) | ||||||
|  | 0:19      AtomicOr (temp void) | ||||||
|  | 0:19        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              0 (const uint) | ||||||
|  | 0:19          right-shift (temp int) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              8 (const int) | ||||||
|  | 0:19            Constant: | ||||||
|  | 0:19              2 (const int) | ||||||
|  | 0:19        Constant: | ||||||
|  | 0:19          1 (const int) | ||||||
|  | 0:20      move second child to first child (temp uint) | ||||||
|  | 0:20        'u' (temp uint) | ||||||
|  | 0:20        AtomicOr (temp uint) | ||||||
|  | 0:20          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                0 (const uint) | ||||||
|  | 0:20            right-shift (temp int) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                8 (const int) | ||||||
|  | 0:20              Constant: | ||||||
|  | 0:20                2 (const int) | ||||||
|  | 0:20          Constant: | ||||||
|  | 0:20            1 (const int) | ||||||
|  | 0:21      AtomicXor (temp void) | ||||||
|  | 0:21        indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              0 (const uint) | ||||||
|  | 0:21          right-shift (temp int) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              8 (const int) | ||||||
|  | 0:21            Constant: | ||||||
|  | 0:21              2 (const int) | ||||||
|  | 0:21        Constant: | ||||||
|  | 0:21          1 (const int) | ||||||
|  | 0:22      move second child to first child (temp uint) | ||||||
|  | 0:22        'u' (temp uint) | ||||||
|  | 0:22        AtomicXor (temp uint) | ||||||
|  | 0:22          indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                0 (const uint) | ||||||
|  | 0:22            right-shift (temp int) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                8 (const int) | ||||||
|  | 0:22              Constant: | ||||||
|  | 0:22                2 (const int) | ||||||
|  | 0:22          Constant: | ||||||
|  | 0:22            1 (const int) | ||||||
|  | 0:24      Branch: Return with expression | ||||||
|  | 0:24        Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:24          Convert uint to float (temp float) | ||||||
|  | 0:24            indirect index (layout(row_major std430 ) buffer uint) | ||||||
|  | 0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint) | ||||||
|  | 0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:24                Constant: | ||||||
|  | 0:24                  0 (const uint) | ||||||
|  | 0:24              right-shift (temp int) | ||||||
|  | 0:24                'pos' (in uint) | ||||||
|  | 0:24                Constant: | ||||||
|  | 0:24                  2 (const int) | ||||||
|  | 0:5  Function Definition: main( (temp void) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:5      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:5      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:5        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 87 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 80 83 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 12  "@main(u1;" | ||||||
|  |                               Name 11  "pos" | ||||||
|  |                               Name 15  "sbuf" | ||||||
|  |                               MemberName 15(sbuf) 0  "sbuf" | ||||||
|  |                               Name 17  "" | ||||||
|  |                               Name 29  "u" | ||||||
|  |                               Name 78  "pos" | ||||||
|  |                               Name 80  "pos" | ||||||
|  |                               Name 83  "@entryPointOutput" | ||||||
|  |                               Name 84  "param" | ||||||
|  |                               Decorate 14 ArrayStride 4 | ||||||
|  |                               MemberDecorate 15(sbuf) 0 Offset 0 | ||||||
|  |                               Decorate 15(sbuf) BufferBlock | ||||||
|  |                               Decorate 17 DescriptorSet 0 | ||||||
|  |                               Decorate 80(pos) Location 0 | ||||||
|  |                               Decorate 83(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeInt 32 0 | ||||||
|  |                7:             TypePointer Function 6(int) | ||||||
|  |                8:             TypeFloat 32 | ||||||
|  |                9:             TypeVector 8(float) 4 | ||||||
|  |               10:             TypeFunction 9(fvec4) 7(ptr) | ||||||
|  |               14:             TypeRuntimeArray 6(int) | ||||||
|  |         15(sbuf):             TypeStruct 14 | ||||||
|  |               16:             TypePointer Uniform 15(sbuf) | ||||||
|  |               17:     16(ptr) Variable Uniform | ||||||
|  |               18:             TypeInt 32 1 | ||||||
|  |               19:     18(int) Constant 0 | ||||||
|  |               20:     18(int) Constant 8 | ||||||
|  |               21:     18(int) Constant 2 | ||||||
|  |               23:             TypePointer Uniform 6(int) | ||||||
|  |               25:     18(int) Constant 1 | ||||||
|  |               26:      6(int) Constant 1 | ||||||
|  |               27:      6(int) Constant 0 | ||||||
|  |               79:             TypePointer Input 6(int) | ||||||
|  |          80(pos):     79(ptr) Variable Input | ||||||
|  |               82:             TypePointer Output 9(fvec4) | ||||||
|  | 83(@entryPointOutput):     82(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          78(pos):      7(ptr) Variable Function | ||||||
|  |        84(param):      7(ptr) Variable Function | ||||||
|  |               81:      6(int) Load 80(pos) | ||||||
|  |                               Store 78(pos) 81 | ||||||
|  |               85:      6(int) Load 78(pos) | ||||||
|  |                               Store 84(param) 85 | ||||||
|  |               86:    9(fvec4) FunctionCall 12(@main(u1;) 84(param) | ||||||
|  |                               Store 83(@entryPointOutput) 86 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |    12(@main(u1;):    9(fvec4) Function None 10 | ||||||
|  |          11(pos):      7(ptr) FunctionParameter | ||||||
|  |               13:             Label | ||||||
|  |            29(u):      7(ptr) Variable Function | ||||||
|  |               22:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               24:     23(ptr) AccessChain 17 19 22 | ||||||
|  |               28:           2 AtomicIAdd 24 26 27 25 | ||||||
|  |               30:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               31:     23(ptr) AccessChain 17 19 30 | ||||||
|  |               32:      6(int) AtomicIAdd 31 26 27 25 | ||||||
|  |                               Store 29(u) 32 | ||||||
|  |               33:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               34:     23(ptr) AccessChain 17 19 33 | ||||||
|  |               35:           2 AtomicAnd 34 26 27 25 | ||||||
|  |               36:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               37:     23(ptr) AccessChain 17 19 36 | ||||||
|  |               38:      6(int) AtomicAnd 37 26 27 25 | ||||||
|  |                               Store 29(u) 38 | ||||||
|  |               39:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               40:     23(ptr) AccessChain 17 19 39 | ||||||
|  |               41:     18(int) AtomicCompareExchange 40 26 27 27 21 25 | ||||||
|  |               42:      6(int) Bitcast 41 | ||||||
|  |                               Store 29(u) 42 | ||||||
|  |               43:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               44:     23(ptr) AccessChain 17 19 43 | ||||||
|  |               45:      6(int) AtomicExchange 44 26 27 25 | ||||||
|  |                               Store 29(u) 45 | ||||||
|  |               46:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               47:     23(ptr) AccessChain 17 19 46 | ||||||
|  |               48:           2 AtomicSMax 47 26 27 25 | ||||||
|  |               49:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               50:     23(ptr) AccessChain 17 19 49 | ||||||
|  |               51:      6(int) AtomicUMax 50 26 27 25 | ||||||
|  |                               Store 29(u) 51 | ||||||
|  |               52:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               53:     23(ptr) AccessChain 17 19 52 | ||||||
|  |               54:           2 AtomicSMin 53 26 27 25 | ||||||
|  |               55:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               56:     23(ptr) AccessChain 17 19 55 | ||||||
|  |               57:      6(int) AtomicUMin 56 26 27 25 | ||||||
|  |                               Store 29(u) 57 | ||||||
|  |               58:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               59:     23(ptr) AccessChain 17 19 58 | ||||||
|  |               60:           2 AtomicOr 59 26 27 25 | ||||||
|  |               61:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               62:     23(ptr) AccessChain 17 19 61 | ||||||
|  |               63:      6(int) AtomicOr 62 26 27 25 | ||||||
|  |                               Store 29(u) 63 | ||||||
|  |               64:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               65:     23(ptr) AccessChain 17 19 64 | ||||||
|  |               66:           2 AtomicXor 65 26 27 25 | ||||||
|  |               67:     18(int) ShiftRightArithmetic 20 21 | ||||||
|  |               68:     23(ptr) AccessChain 17 19 67 | ||||||
|  |               69:      6(int) AtomicXor 68 26 27 25 | ||||||
|  |                               Store 29(u) 69 | ||||||
|  |               70:      6(int) Load 11(pos) | ||||||
|  |               71:     18(int) ShiftRightLogical 70 21 | ||||||
|  |               72:     23(ptr) AccessChain 17 19 71 | ||||||
|  |               73:      6(int) Load 72 | ||||||
|  |               74:    8(float) ConvertUToF 73 | ||||||
|  |               75:    9(fvec4) CompositeConstruct 74 74 74 74 | ||||||
|  |                               ReturnValue 75 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										476
									
								
								Test/baseResults/hlsl.structbuffer.byte.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										476
									
								
								Test/baseResults/hlsl.structbuffer.byte.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,476 @@ | |||||||
|  | hlsl.structbuffer.byte.frag | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:5  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:5      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:7      Sequence | ||||||
|  | 0:7        move second child to first child (temp uint) | ||||||
|  | 0:7          'size' (temp uint) | ||||||
|  | 0:7          array length (temp uint) | ||||||
|  | 0:7            sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:7              'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:7              Constant: | ||||||
|  | 0:7                0 (const uint) | ||||||
|  | 0:12      Branch: Return with expression | ||||||
|  | 0:11        add (temp 4-component vector of float) | ||||||
|  | 0:10          add (temp 4-component vector of float) | ||||||
|  | 0:9            add (temp 4-component vector of float) | ||||||
|  | 0:9              Convert uint to float (temp float) | ||||||
|  | 0:9                indirect index (layout(row_major std430 ) readonly buffer uint) | ||||||
|  | 0:9                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:9                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:9                    Constant: | ||||||
|  | 0:9                      0 (const uint) | ||||||
|  | 0:9                  right-shift (temp int) | ||||||
|  | 0:9                    'pos' (in uint) | ||||||
|  | 0:9                    Constant: | ||||||
|  | 0:9                      2 (const int) | ||||||
|  | 0:?               Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:?                 Convert uint to float (temp 2-component vector of float) | ||||||
|  | 0:?                   Sequence | ||||||
|  | 0:10                    move second child to first child (temp int) | ||||||
|  | 0:10                      'byteAddrTemp' (temp int) | ||||||
|  | 0:10                      right-shift (temp int) | ||||||
|  | 0:10                        add (temp uint) | ||||||
|  | 0:10                          'pos' (in uint) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            4 (const uint) | ||||||
|  | 0:10                        Constant: | ||||||
|  | 0:10                          2 (const int) | ||||||
|  | 0:?                     Construct vec2 (temp 2-component vector of uint) | ||||||
|  | 0:10                      indirect index (temp float) | ||||||
|  | 0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            0 (const uint) | ||||||
|  | 0:10                        'byteAddrTemp' (temp int) | ||||||
|  | 0:10                      indirect index (temp float) | ||||||
|  | 0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            0 (const uint) | ||||||
|  | 0:10                        add (temp int) | ||||||
|  | 0:10                          'byteAddrTemp' (temp int) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            1 (const int) | ||||||
|  | 0:10                Constant: | ||||||
|  | 0:10                  0.000000 | ||||||
|  | 0:10                Constant: | ||||||
|  | 0:10                  0.000000 | ||||||
|  | 0:?             Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:?               Convert uint to float (temp 3-component vector of float) | ||||||
|  | 0:?                 Sequence | ||||||
|  | 0:11                  move second child to first child (temp int) | ||||||
|  | 0:11                    'byteAddrTemp' (temp int) | ||||||
|  | 0:11                    right-shift (temp int) | ||||||
|  | 0:11                      add (temp uint) | ||||||
|  | 0:11                        'pos' (in uint) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          8 (const uint) | ||||||
|  | 0:11                      Constant: | ||||||
|  | 0:11                        2 (const int) | ||||||
|  | 0:?                   Construct vec3 (temp 3-component vector of uint) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      'byteAddrTemp' (temp int) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      add (temp int) | ||||||
|  | 0:11                        'byteAddrTemp' (temp int) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          1 (const int) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      add (temp int) | ||||||
|  | 0:11                        'byteAddrTemp' (temp int) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          2 (const int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                0.000000 | ||||||
|  | 0:?           Convert uint to float (temp 4-component vector of float) | ||||||
|  | 0:?             Sequence | ||||||
|  | 0:12              move second child to first child (temp int) | ||||||
|  | 0:12                'byteAddrTemp' (temp int) | ||||||
|  | 0:12                right-shift (temp int) | ||||||
|  | 0:12                  add (temp uint) | ||||||
|  | 0:12                    'pos' (in uint) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      12 (const uint) | ||||||
|  | 0:12                  Constant: | ||||||
|  | 0:12                    2 (const int) | ||||||
|  | 0:?               Construct vec4 (temp 4-component vector of uint) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  'byteAddrTemp' (temp int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      1 (const int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      2 (const int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      3 (const int) | ||||||
|  | 0:5  Function Definition: main( (temp void) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:5      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:5      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:5        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:5  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:5      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:7      Sequence | ||||||
|  | 0:7        move second child to first child (temp uint) | ||||||
|  | 0:7          'size' (temp uint) | ||||||
|  | 0:7          array length (temp uint) | ||||||
|  | 0:7            sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:7              'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:7              Constant: | ||||||
|  | 0:7                0 (const uint) | ||||||
|  | 0:12      Branch: Return with expression | ||||||
|  | 0:11        add (temp 4-component vector of float) | ||||||
|  | 0:10          add (temp 4-component vector of float) | ||||||
|  | 0:9            add (temp 4-component vector of float) | ||||||
|  | 0:9              Convert uint to float (temp float) | ||||||
|  | 0:9                indirect index (layout(row_major std430 ) readonly buffer uint) | ||||||
|  | 0:9                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:9                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:9                    Constant: | ||||||
|  | 0:9                      0 (const uint) | ||||||
|  | 0:9                  right-shift (temp int) | ||||||
|  | 0:9                    'pos' (in uint) | ||||||
|  | 0:9                    Constant: | ||||||
|  | 0:9                      2 (const int) | ||||||
|  | 0:?               Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:?                 Convert uint to float (temp 2-component vector of float) | ||||||
|  | 0:?                   Sequence | ||||||
|  | 0:10                    move second child to first child (temp int) | ||||||
|  | 0:10                      'byteAddrTemp' (temp int) | ||||||
|  | 0:10                      right-shift (temp int) | ||||||
|  | 0:10                        add (temp uint) | ||||||
|  | 0:10                          'pos' (in uint) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            4 (const uint) | ||||||
|  | 0:10                        Constant: | ||||||
|  | 0:10                          2 (const int) | ||||||
|  | 0:?                     Construct vec2 (temp 2-component vector of uint) | ||||||
|  | 0:10                      indirect index (temp float) | ||||||
|  | 0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            0 (const uint) | ||||||
|  | 0:10                        'byteAddrTemp' (temp int) | ||||||
|  | 0:10                      indirect index (temp float) | ||||||
|  | 0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            0 (const uint) | ||||||
|  | 0:10                        add (temp int) | ||||||
|  | 0:10                          'byteAddrTemp' (temp int) | ||||||
|  | 0:10                          Constant: | ||||||
|  | 0:10                            1 (const int) | ||||||
|  | 0:10                Constant: | ||||||
|  | 0:10                  0.000000 | ||||||
|  | 0:10                Constant: | ||||||
|  | 0:10                  0.000000 | ||||||
|  | 0:?             Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:?               Convert uint to float (temp 3-component vector of float) | ||||||
|  | 0:?                 Sequence | ||||||
|  | 0:11                  move second child to first child (temp int) | ||||||
|  | 0:11                    'byteAddrTemp' (temp int) | ||||||
|  | 0:11                    right-shift (temp int) | ||||||
|  | 0:11                      add (temp uint) | ||||||
|  | 0:11                        'pos' (in uint) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          8 (const uint) | ||||||
|  | 0:11                      Constant: | ||||||
|  | 0:11                        2 (const int) | ||||||
|  | 0:?                   Construct vec3 (temp 3-component vector of uint) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      'byteAddrTemp' (temp int) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      add (temp int) | ||||||
|  | 0:11                        'byteAddrTemp' (temp int) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          1 (const int) | ||||||
|  | 0:11                    indirect index (temp float) | ||||||
|  | 0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          0 (const uint) | ||||||
|  | 0:11                      add (temp int) | ||||||
|  | 0:11                        'byteAddrTemp' (temp int) | ||||||
|  | 0:11                        Constant: | ||||||
|  | 0:11                          2 (const int) | ||||||
|  | 0:11              Constant: | ||||||
|  | 0:11                0.000000 | ||||||
|  | 0:?           Convert uint to float (temp 4-component vector of float) | ||||||
|  | 0:?             Sequence | ||||||
|  | 0:12              move second child to first child (temp int) | ||||||
|  | 0:12                'byteAddrTemp' (temp int) | ||||||
|  | 0:12                right-shift (temp int) | ||||||
|  | 0:12                  add (temp uint) | ||||||
|  | 0:12                    'pos' (in uint) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      12 (const uint) | ||||||
|  | 0:12                  Constant: | ||||||
|  | 0:12                    2 (const int) | ||||||
|  | 0:?               Construct vec4 (temp 4-component vector of uint) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  'byteAddrTemp' (temp int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      1 (const int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      2 (const int) | ||||||
|  | 0:12                indirect index (temp float) | ||||||
|  | 0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint) | ||||||
|  | 0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      0 (const uint) | ||||||
|  | 0:12                  add (temp int) | ||||||
|  | 0:12                    'byteAddrTemp' (temp int) | ||||||
|  | 0:12                    Constant: | ||||||
|  | 0:12                      3 (const int) | ||||||
|  | 0:5  Function Definition: main( (temp void) | ||||||
|  | 0:5    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:5      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:5      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:5        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 114 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 107 110 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 12  "@main(u1;" | ||||||
|  |                               Name 11  "pos" | ||||||
|  |                               Name 14  "size" | ||||||
|  |                               Name 16  "sbuf" | ||||||
|  |                               MemberName 16(sbuf) 0  "sbuf" | ||||||
|  |                               Name 18  "" | ||||||
|  |                               Name 30  "byteAddrTemp" | ||||||
|  |                               Name 53  "byteAddrTemp" | ||||||
|  |                               Name 78  "byteAddrTemp" | ||||||
|  |                               Name 105  "pos" | ||||||
|  |                               Name 107  "pos" | ||||||
|  |                               Name 110  "@entryPointOutput" | ||||||
|  |                               Name 111  "param" | ||||||
|  |                               Decorate 15 ArrayStride 4 | ||||||
|  |                               MemberDecorate 16(sbuf) 0 NonWritable | ||||||
|  |                               MemberDecorate 16(sbuf) 0 Offset 0 | ||||||
|  |                               Decorate 16(sbuf) BufferBlock | ||||||
|  |                               Decorate 18 DescriptorSet 0 | ||||||
|  |                               Decorate 107(pos) Location 0 | ||||||
|  |                               Decorate 110(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeInt 32 0 | ||||||
|  |                7:             TypePointer Function 6(int) | ||||||
|  |                8:             TypeFloat 32 | ||||||
|  |                9:             TypeVector 8(float) 4 | ||||||
|  |               10:             TypeFunction 9(fvec4) 7(ptr) | ||||||
|  |               15:             TypeRuntimeArray 6(int) | ||||||
|  |         16(sbuf):             TypeStruct 15 | ||||||
|  |               17:             TypePointer Uniform 16(sbuf) | ||||||
|  |               18:     17(ptr) Variable Uniform | ||||||
|  |               19:             TypeInt 32 1 | ||||||
|  |               21:     19(int) Constant 0 | ||||||
|  |               23:     19(int) Constant 2 | ||||||
|  |               25:             TypePointer Uniform 6(int) | ||||||
|  |               29:             TypePointer Function 19(int) | ||||||
|  |               32:      6(int) Constant 4 | ||||||
|  |               39:     19(int) Constant 1 | ||||||
|  |               43:             TypeVector 6(int) 2 | ||||||
|  |               45:             TypeVector 8(float) 2 | ||||||
|  |               47:    8(float) Constant 0 | ||||||
|  |               55:      6(int) Constant 8 | ||||||
|  |               69:             TypeVector 6(int) 3 | ||||||
|  |               71:             TypeVector 8(float) 3 | ||||||
|  |               80:      6(int) Constant 12 | ||||||
|  |               95:     19(int) Constant 3 | ||||||
|  |               99:             TypeVector 6(int) 4 | ||||||
|  |              106:             TypePointer Input 6(int) | ||||||
|  |         107(pos):    106(ptr) Variable Input | ||||||
|  |              109:             TypePointer Output 9(fvec4) | ||||||
|  | 110(@entryPointOutput):    109(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |         105(pos):      7(ptr) Variable Function | ||||||
|  |       111(param):      7(ptr) Variable Function | ||||||
|  |              108:      6(int) Load 107(pos) | ||||||
|  |                               Store 105(pos) 108 | ||||||
|  |              112:      6(int) Load 105(pos) | ||||||
|  |                               Store 111(param) 112 | ||||||
|  |              113:    9(fvec4) FunctionCall 12(@main(u1;) 111(param) | ||||||
|  |                               Store 110(@entryPointOutput) 113 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |    12(@main(u1;):    9(fvec4) Function None 10 | ||||||
|  |          11(pos):      7(ptr) FunctionParameter | ||||||
|  |               13:             Label | ||||||
|  |         14(size):      7(ptr) Variable Function | ||||||
|  | 30(byteAddrTemp):     29(ptr) Variable Function | ||||||
|  | 53(byteAddrTemp):     29(ptr) Variable Function | ||||||
|  | 78(byteAddrTemp):     29(ptr) Variable Function | ||||||
|  |               20:     19(int) ArrayLength 18 0 | ||||||
|  |                               Store 14(size) 20 | ||||||
|  |               22:      6(int) Load 11(pos) | ||||||
|  |               24:     19(int) ShiftRightLogical 22 23 | ||||||
|  |               26:     25(ptr) AccessChain 18 21 24 | ||||||
|  |               27:      6(int) Load 26 | ||||||
|  |               28:    8(float) ConvertUToF 27 | ||||||
|  |               31:      6(int) Load 11(pos) | ||||||
|  |               33:      6(int) IAdd 31 32 | ||||||
|  |               34:     19(int) ShiftRightLogical 33 23 | ||||||
|  |                               Store 30(byteAddrTemp) 34 | ||||||
|  |               35:     19(int) Load 30(byteAddrTemp) | ||||||
|  |               36:     25(ptr) AccessChain 18 21 35 | ||||||
|  |               37:      6(int) Load 36 | ||||||
|  |               38:     19(int) Load 30(byteAddrTemp) | ||||||
|  |               40:     19(int) IAdd 38 39 | ||||||
|  |               41:     25(ptr) AccessChain 18 21 40 | ||||||
|  |               42:      6(int) Load 41 | ||||||
|  |               44:   43(ivec2) CompositeConstruct 37 42 | ||||||
|  |               46:   45(fvec2) ConvertUToF 44 | ||||||
|  |               48:    8(float) CompositeExtract 46 0 | ||||||
|  |               49:    8(float) CompositeExtract 46 1 | ||||||
|  |               50:    9(fvec4) CompositeConstruct 48 49 47 47 | ||||||
|  |               51:    9(fvec4) CompositeConstruct 28 28 28 28 | ||||||
|  |               52:    9(fvec4) FAdd 51 50 | ||||||
|  |               54:      6(int) Load 11(pos) | ||||||
|  |               56:      6(int) IAdd 54 55 | ||||||
|  |               57:     19(int) ShiftRightLogical 56 23 | ||||||
|  |                               Store 53(byteAddrTemp) 57 | ||||||
|  |               58:     19(int) Load 53(byteAddrTemp) | ||||||
|  |               59:     25(ptr) AccessChain 18 21 58 | ||||||
|  |               60:      6(int) Load 59 | ||||||
|  |               61:     19(int) Load 53(byteAddrTemp) | ||||||
|  |               62:     19(int) IAdd 61 39 | ||||||
|  |               63:     25(ptr) AccessChain 18 21 62 | ||||||
|  |               64:      6(int) Load 63 | ||||||
|  |               65:     19(int) Load 53(byteAddrTemp) | ||||||
|  |               66:     19(int) IAdd 65 23 | ||||||
|  |               67:     25(ptr) AccessChain 18 21 66 | ||||||
|  |               68:      6(int) Load 67 | ||||||
|  |               70:   69(ivec3) CompositeConstruct 60 64 68 | ||||||
|  |               72:   71(fvec3) ConvertUToF 70 | ||||||
|  |               73:    8(float) CompositeExtract 72 0 | ||||||
|  |               74:    8(float) CompositeExtract 72 1 | ||||||
|  |               75:    8(float) CompositeExtract 72 2 | ||||||
|  |               76:    9(fvec4) CompositeConstruct 73 74 75 47 | ||||||
|  |               77:    9(fvec4) FAdd 52 76 | ||||||
|  |               79:      6(int) Load 11(pos) | ||||||
|  |               81:      6(int) IAdd 79 80 | ||||||
|  |               82:     19(int) ShiftRightLogical 81 23 | ||||||
|  |                               Store 78(byteAddrTemp) 82 | ||||||
|  |               83:     19(int) Load 78(byteAddrTemp) | ||||||
|  |               84:     25(ptr) AccessChain 18 21 83 | ||||||
|  |               85:      6(int) Load 84 | ||||||
|  |               86:     19(int) Load 78(byteAddrTemp) | ||||||
|  |               87:     19(int) IAdd 86 39 | ||||||
|  |               88:     25(ptr) AccessChain 18 21 87 | ||||||
|  |               89:      6(int) Load 88 | ||||||
|  |               90:     19(int) Load 78(byteAddrTemp) | ||||||
|  |               91:     19(int) IAdd 90 23 | ||||||
|  |               92:     25(ptr) AccessChain 18 21 91 | ||||||
|  |               93:      6(int) Load 92 | ||||||
|  |               94:     19(int) Load 78(byteAddrTemp) | ||||||
|  |               96:     19(int) IAdd 94 95 | ||||||
|  |               97:     25(ptr) AccessChain 18 21 96 | ||||||
|  |               98:      6(int) Load 97 | ||||||
|  |              100:   99(ivec4) CompositeConstruct 85 89 93 98 | ||||||
|  |              101:    9(fvec4) ConvertUToF 100 | ||||||
|  |              102:    9(fvec4) FAdd 77 101 | ||||||
|  |                               ReturnValue 102 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										308
									
								
								Test/baseResults/hlsl.structbuffer.coherent.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								Test/baseResults/hlsl.structbuffer.coherent.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,308 @@ | |||||||
|  | hlsl.structbuffer.coherent.frag | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      move second child to first child (temp float) | ||||||
|  | 0:13        indirect index (layout(row_major std430 ) coherent temp float) | ||||||
|  | 0:13          sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float) | ||||||
|  | 0:13            'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const uint) | ||||||
|  | 0:13          add (temp uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const uint) | ||||||
|  | 0:13        Constant: | ||||||
|  | 0:13          42.000000 | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:17              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            16 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                    'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) coherent temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            Convert uint to float (temp float) | ||||||
|  | 0:22              add (temp uint) | ||||||
|  | 0:22                'size' (temp uint) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      move second child to first child (temp float) | ||||||
|  | 0:13        indirect index (layout(row_major std430 ) coherent temp float) | ||||||
|  | 0:13          sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float) | ||||||
|  | 0:13            'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const uint) | ||||||
|  | 0:13          add (temp uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const uint) | ||||||
|  | 0:13        Constant: | ||||||
|  | 0:13          42.000000 | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:17              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            16 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                    'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) coherent temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            Convert uint to float (temp float) | ||||||
|  | 0:22              add (temp uint) | ||||||
|  | 0:22                'size' (temp uint) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 78 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 71 74 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 12  "@main(u1;" | ||||||
|  |                               Name 11  "pos" | ||||||
|  |                               Name 15  "sbuf2" | ||||||
|  |                               MemberName 15(sbuf2) 0  "sbuf2" | ||||||
|  |                               Name 17  "" | ||||||
|  |                               Name 26  "size" | ||||||
|  |                               Name 28  "sb_t" | ||||||
|  |                               MemberName 28(sb_t) 0  "color" | ||||||
|  |                               MemberName 28(sb_t) 1  "test" | ||||||
|  |                               Name 30  "sbuf" | ||||||
|  |                               MemberName 30(sbuf) 0  "sbuf" | ||||||
|  |                               Name 32  "" | ||||||
|  |                               Name 34  "stride" | ||||||
|  |                               Name 69  "pos" | ||||||
|  |                               Name 71  "pos" | ||||||
|  |                               Name 74  "@entryPointOutput" | ||||||
|  |                               Name 75  "param" | ||||||
|  |                               Decorate 14 ArrayStride 4 | ||||||
|  |                               MemberDecorate 15(sbuf2) 0 Coherent | ||||||
|  |                               MemberDecorate 15(sbuf2) 0 Offset 0 | ||||||
|  |                               Decorate 15(sbuf2) BufferBlock | ||||||
|  |                               Decorate 17 DescriptorSet 0 | ||||||
|  |                               MemberDecorate 28(sb_t) 0 Coherent | ||||||
|  |                               MemberDecorate 28(sb_t) 0 Offset 0 | ||||||
|  |                               MemberDecorate 28(sb_t) 1 Coherent | ||||||
|  |                               MemberDecorate 28(sb_t) 1 Offset 12 | ||||||
|  |                               Decorate 29 ArrayStride 16 | ||||||
|  |                               MemberDecorate 30(sbuf) 0 Coherent | ||||||
|  |                               MemberDecorate 30(sbuf) 0 Offset 0 | ||||||
|  |                               Decorate 30(sbuf) BufferBlock | ||||||
|  |                               Decorate 32 DescriptorSet 0 | ||||||
|  |                               Decorate 71(pos) Location 0 | ||||||
|  |                               Decorate 74(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeInt 32 0 | ||||||
|  |                7:             TypePointer Function 6(int) | ||||||
|  |                8:             TypeFloat 32 | ||||||
|  |                9:             TypeVector 8(float) 4 | ||||||
|  |               10:             TypeFunction 9(fvec4) 7(ptr) | ||||||
|  |               14:             TypeRuntimeArray 8(float) | ||||||
|  |        15(sbuf2):             TypeStruct 14 | ||||||
|  |               16:             TypePointer Uniform 15(sbuf2) | ||||||
|  |               17:     16(ptr) Variable Uniform | ||||||
|  |               18:             TypeInt 32 1 | ||||||
|  |               19:     18(int) Constant 0 | ||||||
|  |               21:      6(int) Constant 1 | ||||||
|  |               23:    8(float) Constant 1109917696 | ||||||
|  |               24:             TypePointer Uniform 8(float) | ||||||
|  |               27:             TypeVector 8(float) 3 | ||||||
|  |         28(sb_t):             TypeStruct 27(fvec3) 6(int) | ||||||
|  |               29:             TypeRuntimeArray 28(sb_t) | ||||||
|  |         30(sbuf):             TypeStruct 29 | ||||||
|  |               31:             TypePointer Uniform 30(sbuf) | ||||||
|  |               32:     31(ptr) Variable Uniform | ||||||
|  |               35:      6(int) Constant 16 | ||||||
|  |               37:     18(int) Constant 1 | ||||||
|  |               38:             TypePointer Uniform 6(int) | ||||||
|  |               41:             TypeBool | ||||||
|  |               42:      6(int) Constant 0 | ||||||
|  |               47:             TypePointer Uniform 27(fvec3) | ||||||
|  |               55:    8(float) Constant 0 | ||||||
|  |               70:             TypePointer Input 6(int) | ||||||
|  |          71(pos):     70(ptr) Variable Input | ||||||
|  |               73:             TypePointer Output 9(fvec4) | ||||||
|  | 74(@entryPointOutput):     73(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          69(pos):      7(ptr) Variable Function | ||||||
|  |        75(param):      7(ptr) Variable Function | ||||||
|  |               72:      6(int) Load 71(pos) | ||||||
|  |                               Store 69(pos) 72 | ||||||
|  |               76:      6(int) Load 69(pos) | ||||||
|  |                               Store 75(param) 76 | ||||||
|  |               77:    9(fvec4) FunctionCall 12(@main(u1;) 75(param) | ||||||
|  |                               Store 74(@entryPointOutput) 77 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |    12(@main(u1;):    9(fvec4) Function None 10 | ||||||
|  |          11(pos):      7(ptr) FunctionParameter | ||||||
|  |               13:             Label | ||||||
|  |         26(size):      7(ptr) Variable Function | ||||||
|  |       34(stride):      7(ptr) Variable Function | ||||||
|  |               20:      6(int) Load 11(pos) | ||||||
|  |               22:      6(int) IAdd 20 21 | ||||||
|  |               25:     24(ptr) AccessChain 17 19 22 | ||||||
|  |                               Store 25 23 | ||||||
|  |               33:     18(int) ArrayLength 32 0 | ||||||
|  |                               Store 26(size) 33 | ||||||
|  |                               Store 34(stride) 35 | ||||||
|  |               36:      6(int) Load 11(pos) | ||||||
|  |               39:     38(ptr) AccessChain 32 19 36 37 | ||||||
|  |               40:      6(int) Load 39 | ||||||
|  |               43:    41(bool) INotEqual 40 42 | ||||||
|  |                               SelectionMerge 45 None | ||||||
|  |                               BranchConditional 43 44 61 | ||||||
|  |               44:               Label | ||||||
|  |               46:      6(int)   Load 11(pos) | ||||||
|  |               48:     47(ptr)   AccessChain 32 19 46 19 | ||||||
|  |               49:   27(fvec3)   Load 48 | ||||||
|  |               50:      6(int)   Load 11(pos) | ||||||
|  |               51:     24(ptr)   AccessChain 17 19 50 | ||||||
|  |               52:    8(float)   Load 51 | ||||||
|  |               53:   27(fvec3)   CompositeConstruct 52 52 52 | ||||||
|  |               54:   27(fvec3)   FAdd 49 53 | ||||||
|  |               56:    8(float)   CompositeExtract 54 0 | ||||||
|  |               57:    8(float)   CompositeExtract 54 1 | ||||||
|  |               58:    8(float)   CompositeExtract 54 2 | ||||||
|  |               59:    9(fvec4)   CompositeConstruct 56 57 58 55 | ||||||
|  |                                 ReturnValue 59 | ||||||
|  |               61:               Label | ||||||
|  |               62:      6(int)   Load 26(size) | ||||||
|  |               63:      6(int)   Load 34(stride) | ||||||
|  |               64:      6(int)   IAdd 62 63 | ||||||
|  |               65:    8(float)   ConvertUToF 64 | ||||||
|  |               66:    9(fvec4)   CompositeConstruct 65 65 65 65 | ||||||
|  |                                 ReturnValue 66 | ||||||
|  |               45:             Label | ||||||
|  |               68:    9(fvec4) Undef | ||||||
|  |                               ReturnValue 68 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										347
									
								
								Test/baseResults/hlsl.structbuffer.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								Test/baseResults/hlsl.structbuffer.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,347 @@ | |||||||
|  | hlsl.structbuffer.frag | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13          indirect index (layout(binding=10 row_major std430 ) readonly buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                0 (const uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:17              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            32 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:19              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:20                    'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) readonly temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            add (temp float) | ||||||
|  | 0:22              add (temp float) | ||||||
|  | 0:22                direct index (temp float) | ||||||
|  | 0:22                  color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:22                    'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:22                    Constant: | ||||||
|  | 0:22                      0 (const int) | ||||||
|  | 0:22                  Constant: | ||||||
|  | 0:22                    0 (const int) | ||||||
|  | 0:22                Convert uint to float (temp float) | ||||||
|  | 0:22                  'size' (temp uint) | ||||||
|  | 0:22              Convert uint to float (temp float) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13          indirect index (layout(binding=10 row_major std430 ) readonly buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:13              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                0 (const uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:17              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            32 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:19              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:20                    'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) readonly temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            add (temp float) | ||||||
|  | 0:22              add (temp float) | ||||||
|  | 0:22                direct index (temp float) | ||||||
|  | 0:22                  color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:22                    'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2}) | ||||||
|  | 0:22                    Constant: | ||||||
|  | 0:22                      0 (const int) | ||||||
|  | 0:22                  Constant: | ||||||
|  | 0:22                    0 (const int) | ||||||
|  | 0:22                Convert uint to float (temp float) | ||||||
|  | 0:22                  'size' (temp uint) | ||||||
|  | 0:22              Convert uint to float (temp float) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 94 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 87 90 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 12  "@main(u1;" | ||||||
|  |                               Name 11  "pos" | ||||||
|  |                               Name 16  "sb_t" | ||||||
|  |                               MemberName 16(sb_t) 0  "color" | ||||||
|  |                               MemberName 16(sb_t) 1  "test" | ||||||
|  |                               MemberName 16(sb_t) 2  "test2" | ||||||
|  |                               Name 18  "mydata" | ||||||
|  |                               Name 19  "sb_t" | ||||||
|  |                               MemberName 19(sb_t) 0  "color" | ||||||
|  |                               MemberName 19(sb_t) 1  "test" | ||||||
|  |                               MemberName 19(sb_t) 2  "test2" | ||||||
|  |                               Name 21  "sbuf" | ||||||
|  |                               MemberName 21(sbuf) 0  "sbuf" | ||||||
|  |                               Name 23  "" | ||||||
|  |                               Name 40  "size" | ||||||
|  |                               Name 42  "stride" | ||||||
|  |                               Name 57  "sbuf2" | ||||||
|  |                               MemberName 57(sbuf2) 0  "sbuf2" | ||||||
|  |                               Name 59  "" | ||||||
|  |                               Name 85  "pos" | ||||||
|  |                               Name 87  "pos" | ||||||
|  |                               Name 90  "@entryPointOutput" | ||||||
|  |                               Name 91  "param" | ||||||
|  |                               MemberDecorate 19(sb_t) 0 NonWritable | ||||||
|  |                               MemberDecorate 19(sb_t) 0 Offset 0 | ||||||
|  |                               MemberDecorate 19(sb_t) 1 NonWritable | ||||||
|  |                               MemberDecorate 19(sb_t) 1 Offset 12 | ||||||
|  |                               MemberDecorate 19(sb_t) 2 NonWritable | ||||||
|  |                               MemberDecorate 19(sb_t) 2 Offset 16 | ||||||
|  |                               Decorate 20 ArrayStride 32 | ||||||
|  |                               MemberDecorate 21(sbuf) 0 NonWritable | ||||||
|  |                               MemberDecorate 21(sbuf) 0 Offset 0 | ||||||
|  |                               Decorate 21(sbuf) BufferBlock | ||||||
|  |                               Decorate 23 DescriptorSet 0 | ||||||
|  |                               Decorate 23 Binding 10 | ||||||
|  |                               Decorate 56 ArrayStride 4 | ||||||
|  |                               MemberDecorate 57(sbuf2) 0 NonWritable | ||||||
|  |                               MemberDecorate 57(sbuf2) 0 Offset 0 | ||||||
|  |                               Decorate 57(sbuf2) BufferBlock | ||||||
|  |                               Decorate 59 DescriptorSet 0 | ||||||
|  |                               Decorate 87(pos) Location 0 | ||||||
|  |                               Decorate 90(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeInt 32 0 | ||||||
|  |                7:             TypePointer Function 6(int) | ||||||
|  |                8:             TypeFloat 32 | ||||||
|  |                9:             TypeVector 8(float) 4 | ||||||
|  |               10:             TypeFunction 9(fvec4) 7(ptr) | ||||||
|  |               14:             TypeVector 8(float) 3 | ||||||
|  |               15:             TypeBool | ||||||
|  |         16(sb_t):             TypeStruct 14(fvec3) 15(bool) 15(bool) | ||||||
|  |               17:             TypePointer Function 16(sb_t) | ||||||
|  |         19(sb_t):             TypeStruct 14(fvec3) 6(int) 6(int) | ||||||
|  |               20:             TypeRuntimeArray 19(sb_t) | ||||||
|  |         21(sbuf):             TypeStruct 20 | ||||||
|  |               22:             TypePointer Uniform 21(sbuf) | ||||||
|  |               23:     22(ptr) Variable Uniform | ||||||
|  |               24:             TypeInt 32 1 | ||||||
|  |               25:     24(int) Constant 0 | ||||||
|  |               27:             TypePointer Uniform 19(sb_t) | ||||||
|  |               31:             TypePointer Function 14(fvec3) | ||||||
|  |               34:     24(int) Constant 1 | ||||||
|  |               35:             TypePointer Function 15(bool) | ||||||
|  |               38:     24(int) Constant 2 | ||||||
|  |               43:      6(int) Constant 32 | ||||||
|  |               45:             TypePointer Uniform 6(int) | ||||||
|  |               48:      6(int) Constant 0 | ||||||
|  |               53:             TypePointer Uniform 14(fvec3) | ||||||
|  |               56:             TypeRuntimeArray 8(float) | ||||||
|  |        57(sbuf2):             TypeStruct 56 | ||||||
|  |               58:             TypePointer Uniform 57(sbuf2) | ||||||
|  |               59:     58(ptr) Variable Uniform | ||||||
|  |               61:             TypePointer Uniform 8(float) | ||||||
|  |               66:    8(float) Constant 0 | ||||||
|  |               73:             TypePointer Function 8(float) | ||||||
|  |               86:             TypePointer Input 6(int) | ||||||
|  |          87(pos):     86(ptr) Variable Input | ||||||
|  |               89:             TypePointer Output 9(fvec4) | ||||||
|  | 90(@entryPointOutput):     89(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          85(pos):      7(ptr) Variable Function | ||||||
|  |        91(param):      7(ptr) Variable Function | ||||||
|  |               88:      6(int) Load 87(pos) | ||||||
|  |                               Store 85(pos) 88 | ||||||
|  |               92:      6(int) Load 85(pos) | ||||||
|  |                               Store 91(param) 92 | ||||||
|  |               93:    9(fvec4) FunctionCall 12(@main(u1;) 91(param) | ||||||
|  |                               Store 90(@entryPointOutput) 93 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |    12(@main(u1;):    9(fvec4) Function None 10 | ||||||
|  |          11(pos):      7(ptr) FunctionParameter | ||||||
|  |               13:             Label | ||||||
|  |       18(mydata):     17(ptr) Variable Function | ||||||
|  |         40(size):      7(ptr) Variable Function | ||||||
|  |       42(stride):      7(ptr) Variable Function | ||||||
|  |               26:      6(int) Load 11(pos) | ||||||
|  |               28:     27(ptr) AccessChain 23 25 26 | ||||||
|  |               29:    19(sb_t) Load 28 | ||||||
|  |               30:   14(fvec3) CompositeExtract 29 0 | ||||||
|  |               32:     31(ptr) AccessChain 18(mydata) 25 | ||||||
|  |                               Store 32 30 | ||||||
|  |               33:      6(int) CompositeExtract 29 1 | ||||||
|  |               36:     35(ptr) AccessChain 18(mydata) 34 | ||||||
|  |                               Store 36 33 | ||||||
|  |               37:      6(int) CompositeExtract 29 2 | ||||||
|  |               39:     35(ptr) AccessChain 18(mydata) 38 | ||||||
|  |                               Store 39 37 | ||||||
|  |               41:     24(int) ArrayLength 23 0 | ||||||
|  |                               Store 40(size) 41 | ||||||
|  |                               Store 42(stride) 43 | ||||||
|  |               44:      6(int) Load 11(pos) | ||||||
|  |               46:     45(ptr) AccessChain 23 25 44 34 | ||||||
|  |               47:      6(int) Load 46 | ||||||
|  |               49:    15(bool) INotEqual 47 48 | ||||||
|  |                               SelectionMerge 51 None | ||||||
|  |                               BranchConditional 49 50 72 | ||||||
|  |               50:               Label | ||||||
|  |               52:      6(int)   Load 11(pos) | ||||||
|  |               54:     53(ptr)   AccessChain 23 25 52 25 | ||||||
|  |               55:   14(fvec3)   Load 54 | ||||||
|  |               60:      6(int)   Load 11(pos) | ||||||
|  |               62:     61(ptr)   AccessChain 59 25 60 | ||||||
|  |               63:    8(float)   Load 62 | ||||||
|  |               64:   14(fvec3)   CompositeConstruct 63 63 63 | ||||||
|  |               65:   14(fvec3)   FAdd 55 64 | ||||||
|  |               67:    8(float)   CompositeExtract 65 0 | ||||||
|  |               68:    8(float)   CompositeExtract 65 1 | ||||||
|  |               69:    8(float)   CompositeExtract 65 2 | ||||||
|  |               70:    9(fvec4)   CompositeConstruct 67 68 69 66 | ||||||
|  |                                 ReturnValue 70 | ||||||
|  |               72:               Label | ||||||
|  |               74:     73(ptr)   AccessChain 18(mydata) 25 48 | ||||||
|  |               75:    8(float)   Load 74 | ||||||
|  |               76:      6(int)   Load 40(size) | ||||||
|  |               77:    8(float)   ConvertUToF 76 | ||||||
|  |               78:    8(float)   FAdd 75 77 | ||||||
|  |               79:      6(int)   Load 42(stride) | ||||||
|  |               80:    8(float)   ConvertUToF 79 | ||||||
|  |               81:    8(float)   FAdd 78 80 | ||||||
|  |               82:    9(fvec4)   CompositeConstruct 81 81 81 81 | ||||||
|  |                                 ReturnValue 82 | ||||||
|  |               51:             Label | ||||||
|  |               84:    9(fvec4) Undef | ||||||
|  |                               ReturnValue 84 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										304
									
								
								Test/baseResults/hlsl.structbuffer.rw.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								Test/baseResults/hlsl.structbuffer.rw.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,304 @@ | |||||||
|  | hlsl.structbuffer.rw.frag | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      move second child to first child (temp float) | ||||||
|  | 0:13        indirect index (layout(row_major std430 ) temp float) | ||||||
|  | 0:13          sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float) | ||||||
|  | 0:13            'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const uint) | ||||||
|  | 0:13          add (temp uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const uint) | ||||||
|  | 0:13        Constant: | ||||||
|  | 0:13          42.000000 | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:17              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            16 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                    'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            Convert uint to float (temp float) | ||||||
|  | 0:22              add (temp uint) | ||||||
|  | 0:22                'size' (temp uint) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:12  Function Definition: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:12      'pos' (in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      move second child to first child (temp float) | ||||||
|  | 0:13        indirect index (layout(row_major std430 ) temp float) | ||||||
|  | 0:13          sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float) | ||||||
|  | 0:13            'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              0 (const uint) | ||||||
|  | 0:13          add (temp uint) | ||||||
|  | 0:13            'pos' (in uint) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const uint) | ||||||
|  | 0:13        Constant: | ||||||
|  | 0:13          42.000000 | ||||||
|  | 0:17      Sequence | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'size' (temp uint) | ||||||
|  | 0:17          array length (temp uint) | ||||||
|  | 0:17            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:17              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:17              Constant: | ||||||
|  | 0:17                0 (const uint) | ||||||
|  | 0:17        move second child to first child (temp uint) | ||||||
|  | 0:17          'stride' (temp uint) | ||||||
|  | 0:17          Constant: | ||||||
|  | 0:17            16 (const uint) | ||||||
|  | 0:19      Test condition and select (temp void) | ||||||
|  | 0:19        Condition | ||||||
|  | 0:19        test: direct index for structure (temp bool) | ||||||
|  | 0:19          indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:19              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:19              Constant: | ||||||
|  | 0:19                0 (const uint) | ||||||
|  | 0:19            'pos' (in uint) | ||||||
|  | 0:19          Constant: | ||||||
|  | 0:19            1 (const int) | ||||||
|  | 0:19        true case | ||||||
|  | 0:20        Branch: Return with expression | ||||||
|  | 0:?           Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:20            add (temp 3-component vector of float) | ||||||
|  | 0:20              color: direct index for structure (temp 3-component vector of float) | ||||||
|  | 0:20                indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                  sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test}) | ||||||
|  | 0:20                    'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:20                    Constant: | ||||||
|  | 0:20                      0 (const uint) | ||||||
|  | 0:20                  'pos' (in uint) | ||||||
|  | 0:20                Constant: | ||||||
|  | 0:20                  0 (const int) | ||||||
|  | 0:20              indirect index (layout(row_major std430 ) temp float) | ||||||
|  | 0:20                sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float) | ||||||
|  | 0:20                  'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:20                  Constant: | ||||||
|  | 0:20                    0 (const uint) | ||||||
|  | 0:20                'pos' (in uint) | ||||||
|  | 0:20            Constant: | ||||||
|  | 0:20              0.000000 | ||||||
|  | 0:19        false case | ||||||
|  | 0:22        Branch: Return with expression | ||||||
|  | 0:22          Construct vec4 (temp 4-component vector of float) | ||||||
|  | 0:22            Convert uint to float (temp float) | ||||||
|  | 0:22              add (temp uint) | ||||||
|  | 0:22                'size' (temp uint) | ||||||
|  | 0:22                'stride' (temp uint) | ||||||
|  | 0:12  Function Definition: main( (temp void) | ||||||
|  | 0:12    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:12      move second child to first child (temp uint) | ||||||
|  | 0:?         'pos' (temp uint) | ||||||
|  | 0:?         'pos' (layout(location=0 ) in uint) | ||||||
|  | 0:12      move second child to first child (temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:12        Function Call: @main(u1; (temp 4-component vector of float) | ||||||
|  | 0:?           'pos' (temp uint) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf}) | ||||||
|  | 0:?     'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) | ||||||
|  | 0:?     'pos' (layout(location=0 ) in uint) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 78 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 71 74 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 12  "@main(u1;" | ||||||
|  |                               Name 11  "pos" | ||||||
|  |                               Name 15  "sbuf2" | ||||||
|  |                               MemberName 15(sbuf2) 0  "sbuf2" | ||||||
|  |                               Name 17  "" | ||||||
|  |                               Name 26  "size" | ||||||
|  |                               Name 28  "sb_t" | ||||||
|  |                               MemberName 28(sb_t) 0  "color" | ||||||
|  |                               MemberName 28(sb_t) 1  "test" | ||||||
|  |                               Name 30  "sbuf" | ||||||
|  |                               MemberName 30(sbuf) 0  "sbuf" | ||||||
|  |                               Name 32  "" | ||||||
|  |                               Name 34  "stride" | ||||||
|  |                               Name 69  "pos" | ||||||
|  |                               Name 71  "pos" | ||||||
|  |                               Name 74  "@entryPointOutput" | ||||||
|  |                               Name 75  "param" | ||||||
|  |                               Decorate 14 ArrayStride 4 | ||||||
|  |                               MemberDecorate 15(sbuf2) 0 Offset 0 | ||||||
|  |                               Decorate 15(sbuf2) BufferBlock | ||||||
|  |                               Decorate 17 DescriptorSet 0 | ||||||
|  |                               MemberDecorate 28(sb_t) 0 Offset 0 | ||||||
|  |                               MemberDecorate 28(sb_t) 1 Offset 12 | ||||||
|  |                               Decorate 29 ArrayStride 16 | ||||||
|  |                               MemberDecorate 30(sbuf) 0 Offset 0 | ||||||
|  |                               Decorate 30(sbuf) BufferBlock | ||||||
|  |                               Decorate 32 DescriptorSet 0 | ||||||
|  |                               Decorate 71(pos) Location 0 | ||||||
|  |                               Decorate 74(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeInt 32 0 | ||||||
|  |                7:             TypePointer Function 6(int) | ||||||
|  |                8:             TypeFloat 32 | ||||||
|  |                9:             TypeVector 8(float) 4 | ||||||
|  |               10:             TypeFunction 9(fvec4) 7(ptr) | ||||||
|  |               14:             TypeRuntimeArray 8(float) | ||||||
|  |        15(sbuf2):             TypeStruct 14 | ||||||
|  |               16:             TypePointer Uniform 15(sbuf2) | ||||||
|  |               17:     16(ptr) Variable Uniform | ||||||
|  |               18:             TypeInt 32 1 | ||||||
|  |               19:     18(int) Constant 0 | ||||||
|  |               21:      6(int) Constant 1 | ||||||
|  |               23:    8(float) Constant 1109917696 | ||||||
|  |               24:             TypePointer Uniform 8(float) | ||||||
|  |               27:             TypeVector 8(float) 3 | ||||||
|  |         28(sb_t):             TypeStruct 27(fvec3) 6(int) | ||||||
|  |               29:             TypeRuntimeArray 28(sb_t) | ||||||
|  |         30(sbuf):             TypeStruct 29 | ||||||
|  |               31:             TypePointer Uniform 30(sbuf) | ||||||
|  |               32:     31(ptr) Variable Uniform | ||||||
|  |               35:      6(int) Constant 16 | ||||||
|  |               37:     18(int) Constant 1 | ||||||
|  |               38:             TypePointer Uniform 6(int) | ||||||
|  |               41:             TypeBool | ||||||
|  |               42:      6(int) Constant 0 | ||||||
|  |               47:             TypePointer Uniform 27(fvec3) | ||||||
|  |               55:    8(float) Constant 0 | ||||||
|  |               70:             TypePointer Input 6(int) | ||||||
|  |          71(pos):     70(ptr) Variable Input | ||||||
|  |               73:             TypePointer Output 9(fvec4) | ||||||
|  | 74(@entryPointOutput):     73(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |          69(pos):      7(ptr) Variable Function | ||||||
|  |        75(param):      7(ptr) Variable Function | ||||||
|  |               72:      6(int) Load 71(pos) | ||||||
|  |                               Store 69(pos) 72 | ||||||
|  |               76:      6(int) Load 69(pos) | ||||||
|  |                               Store 75(param) 76 | ||||||
|  |               77:    9(fvec4) FunctionCall 12(@main(u1;) 75(param) | ||||||
|  |                               Store 74(@entryPointOutput) 77 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  |    12(@main(u1;):    9(fvec4) Function None 10 | ||||||
|  |          11(pos):      7(ptr) FunctionParameter | ||||||
|  |               13:             Label | ||||||
|  |         26(size):      7(ptr) Variable Function | ||||||
|  |       34(stride):      7(ptr) Variable Function | ||||||
|  |               20:      6(int) Load 11(pos) | ||||||
|  |               22:      6(int) IAdd 20 21 | ||||||
|  |               25:     24(ptr) AccessChain 17 19 22 | ||||||
|  |                               Store 25 23 | ||||||
|  |               33:     18(int) ArrayLength 32 0 | ||||||
|  |                               Store 26(size) 33 | ||||||
|  |                               Store 34(stride) 35 | ||||||
|  |               36:      6(int) Load 11(pos) | ||||||
|  |               39:     38(ptr) AccessChain 32 19 36 37 | ||||||
|  |               40:      6(int) Load 39 | ||||||
|  |               43:    41(bool) INotEqual 40 42 | ||||||
|  |                               SelectionMerge 45 None | ||||||
|  |                               BranchConditional 43 44 61 | ||||||
|  |               44:               Label | ||||||
|  |               46:      6(int)   Load 11(pos) | ||||||
|  |               48:     47(ptr)   AccessChain 32 19 46 19 | ||||||
|  |               49:   27(fvec3)   Load 48 | ||||||
|  |               50:      6(int)   Load 11(pos) | ||||||
|  |               51:     24(ptr)   AccessChain 17 19 50 | ||||||
|  |               52:    8(float)   Load 51 | ||||||
|  |               53:   27(fvec3)   CompositeConstruct 52 52 52 | ||||||
|  |               54:   27(fvec3)   FAdd 49 53 | ||||||
|  |               56:    8(float)   CompositeExtract 54 0 | ||||||
|  |               57:    8(float)   CompositeExtract 54 1 | ||||||
|  |               58:    8(float)   CompositeExtract 54 2 | ||||||
|  |               59:    9(fvec4)   CompositeConstruct 56 57 58 55 | ||||||
|  |                                 ReturnValue 59 | ||||||
|  |               61:               Label | ||||||
|  |               62:      6(int)   Load 26(size) | ||||||
|  |               63:      6(int)   Load 34(stride) | ||||||
|  |               64:      6(int)   IAdd 62 63 | ||||||
|  |               65:    8(float)   ConvertUToF 64 | ||||||
|  |               66:    9(fvec4)   CompositeConstruct 65 65 65 65 | ||||||
|  |                                 ReturnValue 66 | ||||||
|  |               45:             Label | ||||||
|  |               68:    9(fvec4) Undef | ||||||
|  |                               ReturnValue 68 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										1307
									
								
								Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1307
									
								
								Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										25
									
								
								Test/hlsl.structbuffer.atomics.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Test/hlsl.structbuffer.atomics.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | 
 | ||||||
|  | RWByteAddressBuffer sbuf; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     uint u; | ||||||
|  | 
 | ||||||
|  |     sbuf.InterlockedAdd(8, 1); | ||||||
|  |     sbuf.InterlockedAdd(8, 1, u); | ||||||
|  |     sbuf.InterlockedAnd(8, 1); | ||||||
|  |     sbuf.InterlockedAnd(8, 1, u); | ||||||
|  |     sbuf.InterlockedCompareExchange(8, 1, 2, u); | ||||||
|  |     // sbuf.InterlockedCompareStore(8, 1, 2); // TODO: ... | ||||||
|  |     sbuf.InterlockedExchange(8, 1, u); | ||||||
|  |     sbuf.InterlockedMax(8, 1); | ||||||
|  |     sbuf.InterlockedMax(8, 1, u); | ||||||
|  |     sbuf.InterlockedMin(8, 1); | ||||||
|  |     sbuf.InterlockedMin(8, 1, u); | ||||||
|  |     sbuf.InterlockedOr(8, 1); | ||||||
|  |     sbuf.InterlockedOr(8, 1, u); | ||||||
|  |     sbuf.InterlockedXor(8, 1); | ||||||
|  |     sbuf.InterlockedXor(8, 1, u); | ||||||
|  | 
 | ||||||
|  |     return sbuf.Load(pos); | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								Test/hlsl.structbuffer.byte.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Test/hlsl.structbuffer.byte.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | 
 | ||||||
|  | ByteAddressBuffer sbuf; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     uint size; | ||||||
|  |     sbuf.GetDimensions(size); | ||||||
|  | 
 | ||||||
|  |     return sbuf.Load(pos) + | ||||||
|  |         float4(sbuf.Load2(pos+4), 0, 0) + | ||||||
|  |         float4(sbuf.Load3(pos+8), 0) + | ||||||
|  |         sbuf.Load4(pos+12); | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								Test/hlsl.structbuffer.coherent.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Test/hlsl.structbuffer.coherent.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | struct sb_t | ||||||
|  | { | ||||||
|  |     float3 color; | ||||||
|  |     bool   test; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | globallycoherent RWStructuredBuffer<sb_t>  sbuf; | ||||||
|  | globallycoherent RWStructuredBuffer<float> sbuf2; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     sbuf2[pos+1] = 42; | ||||||
|  | 
 | ||||||
|  |     uint size; | ||||||
|  |     uint stride; | ||||||
|  |     sbuf.GetDimensions(size, stride); | ||||||
|  | 
 | ||||||
|  |     if (sbuf[pos].test) | ||||||
|  |         return float4(sbuf[pos].color + sbuf2[pos], 0); | ||||||
|  |     else | ||||||
|  |         return size + stride; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								Test/hlsl.structbuffer.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Test/hlsl.structbuffer.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | struct sb_t | ||||||
|  | { | ||||||
|  |     float3 color; | ||||||
|  |     bool   test; | ||||||
|  |     bool   test2; | ||||||
|  | }; // stride = 20 | ||||||
|  | 
 | ||||||
|  | StructuredBuffer<sb_t>  sbuf : register(c10); | ||||||
|  | StructuredBuffer<float> sbuf2; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     sb_t mydata = sbuf.Load(pos); | ||||||
|  | 
 | ||||||
|  |     uint size; | ||||||
|  |     uint stride; | ||||||
|  |     sbuf.GetDimensions(size, stride); | ||||||
|  | 
 | ||||||
|  |     if (sbuf[pos].test) | ||||||
|  |         return float4(sbuf[pos].color + sbuf2[pos], 0); | ||||||
|  |     else | ||||||
|  |         return mydata.color.x + size + stride; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								Test/hlsl.structbuffer.rw.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Test/hlsl.structbuffer.rw.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | struct sb_t | ||||||
|  | { | ||||||
|  |     float3 color; | ||||||
|  |     bool   test; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | RWStructuredBuffer<sb_t>  sbuf; | ||||||
|  | RWStructuredBuffer<float> sbuf2; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     sbuf2[pos+1] = 42; | ||||||
|  | 
 | ||||||
|  |     uint size; | ||||||
|  |     uint stride; | ||||||
|  |     sbuf.GetDimensions(size, stride); | ||||||
|  | 
 | ||||||
|  |     if (sbuf[pos].test) | ||||||
|  |         return float4(sbuf[pos].color + sbuf2[pos], 0); | ||||||
|  |     else | ||||||
|  |         return size + stride; | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								Test/hlsl.structbuffer.rwbyte.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Test/hlsl.structbuffer.rwbyte.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | 
 | ||||||
|  | RWByteAddressBuffer sbuf; | ||||||
|  | 
 | ||||||
|  | float4 main(uint pos : FOO) : SV_Target0 | ||||||
|  | { | ||||||
|  |     uint size; | ||||||
|  |     sbuf.GetDimensions(size); | ||||||
|  | 
 | ||||||
|  |     sbuf.Store(pos,  sbuf.Load(pos)); | ||||||
|  |     sbuf.Store2(pos, sbuf.Load2(pos)); | ||||||
|  |     sbuf.Store3(pos, sbuf.Load3(pos)); | ||||||
|  |     sbuf.Store4(pos, sbuf.Load4(pos)); | ||||||
|  | 
 | ||||||
|  |     return sbuf.Load(pos); | ||||||
|  | } | ||||||
| @ -624,6 +624,15 @@ enum TOperator { | |||||||
|     EOpMethodCalculateLevelOfDetail,     // ...
 |     EOpMethodCalculateLevelOfDetail,     // ...
 | ||||||
|     EOpMethodCalculateLevelOfDetailUnclamped,     // ...
 |     EOpMethodCalculateLevelOfDetailUnclamped,     // ...
 | ||||||
| 
 | 
 | ||||||
|  |     // Load already defined above for textures
 | ||||||
|  |     EOpMethodLoad2,                      // Structure buffer object methods.  These are translated to existing
 | ||||||
|  |     EOpMethodLoad3,                      // AST methods, and exist to represent HLSL semantics until that
 | ||||||
|  |     EOpMethodLoad4,                      // translation is performed.  See HlslParseContext::decomposeSampleMethods().
 | ||||||
|  |     EOpMethodStore,                      // ...
 | ||||||
|  |     EOpMethodStore2,                     // ...
 | ||||||
|  |     EOpMethodStore3,                     // ...
 | ||||||
|  |     EOpMethodStore4,                     // ...
 | ||||||
|  | 
 | ||||||
|     // SM5 texture methods
 |     // SM5 texture methods
 | ||||||
|     EOpMethodGatherRed,                  // These are covered under the above EOpMethodSample comment about
 |     EOpMethodGatherRed,                  // These are covered under the above EOpMethodSample comment about
 | ||||||
|     EOpMethodGatherGreen,                // translation to existing AST opcodes.  They exist temporarily
 |     EOpMethodGatherGreen,                // translation to existing AST opcodes.  They exist temporarily
 | ||||||
|  | |||||||
| @ -221,6 +221,12 @@ INSTANTIATE_TEST_CASE_P( | |||||||
|         {"hlsl.struct.split.trivial.vert", "main"}, |         {"hlsl.struct.split.trivial.vert", "main"}, | ||||||
|         {"hlsl.structarray.flatten.frag", "main"}, |         {"hlsl.structarray.flatten.frag", "main"}, | ||||||
|         {"hlsl.structarray.flatten.geom", "main"}, |         {"hlsl.structarray.flatten.geom", "main"}, | ||||||
|  |         {"hlsl.structbuffer.frag", "main"}, | ||||||
|  |         {"hlsl.structbuffer.atomics.frag", "main"}, | ||||||
|  |         {"hlsl.structbuffer.byte.frag", "main"}, | ||||||
|  |         {"hlsl.structbuffer.coherent.frag", "main"}, | ||||||
|  |         {"hlsl.structbuffer.rw.frag", "main"}, | ||||||
|  |         {"hlsl.structbuffer.rwbyte.frag", "main"}, | ||||||
|         {"hlsl.structin.vert", "main"}, |         {"hlsl.structin.vert", "main"}, | ||||||
|         {"hlsl.structIoFourWay.frag", "main"}, |         {"hlsl.structIoFourWay.frag", "main"}, | ||||||
|         {"hlsl.intrinsics.vert", "VertexShaderFunction"}, |         {"hlsl.intrinsics.vert", "VertexShaderFunction"}, | ||||||
|  | |||||||
| @ -406,6 +406,27 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node, TIntermNode*& node2) | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             TString* blockName = idToken.string; | ||||||
|  | 
 | ||||||
|  |             // For structbuffers, we couldn't create the block type while accepting the
 | ||||||
|  |             // template type, because we need the identifier name.  Now that we have that,
 | ||||||
|  |             // we can create the buffer type.
 | ||||||
|  |             // TODO: how to determine this without looking for implicit array sizes?
 | ||||||
|  |             if (variableType.getBasicType() == EbtBlock) { | ||||||
|  |                 const int memberCount = variableType.getStruct()->size(); | ||||||
|  |                 assert(memberCount > 0); | ||||||
|  | 
 | ||||||
|  |                 TType* contentType = (*variableType.getStruct())[memberCount-1].type; | ||||||
|  |                  | ||||||
|  |                 // Set the field name and qualifier from the declaration, now that we know it.
 | ||||||
|  |                 if (contentType->isRuntimeSizedArray()) { | ||||||
|  |                     contentType->getQualifier() = variableType.getQualifier(); | ||||||
|  |                     blockName     = nullptr;        // this will be an anonymous block...
 | ||||||
|  |                     contentType->setFieldName(*idToken.string); // field name is declaration name
 | ||||||
|  |                     variableType.setTypeName(*idToken.string); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             // Hand off the actual declaration
 |             // Hand off the actual declaration
 | ||||||
| 
 | 
 | ||||||
|             // TODO: things scoped within an annotation need their own name space;
 |             // TODO: things scoped within an annotation need their own name space;
 | ||||||
| @ -414,7 +435,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node, TIntermNode*& node2) | |||||||
|                 if (typedefDecl) |                 if (typedefDecl) | ||||||
|                     parseContext.declareTypedef(idToken.loc, *idToken.string, variableType); |                     parseContext.declareTypedef(idToken.loc, *idToken.string, variableType); | ||||||
|                 else if (variableType.getBasicType() == EbtBlock) |                 else if (variableType.getBasicType() == EbtBlock) | ||||||
|                     parseContext.declareBlock(idToken.loc, variableType, idToken.string); |                     parseContext.declareBlock(idToken.loc, variableType, blockName); | ||||||
|                 else { |                 else { | ||||||
|                     if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) { |                     if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) { | ||||||
|                         // this isn't really an individual variable, but a member of the $Global buffer
 |                         // this isn't really an individual variable, but a member of the $Global buffer
 | ||||||
| @ -533,8 +554,11 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type) | |||||||
|         qualifier.layoutFormat = type.getQualifier().layoutFormat; |         qualifier.layoutFormat = type.getQualifier().layoutFormat; | ||||||
|         qualifier.precision    = type.getQualifier().precision; |         qualifier.precision    = type.getQualifier().precision; | ||||||
| 
 | 
 | ||||||
|         if (type.getQualifier().storage == EvqVaryingOut) |         if (type.getQualifier().storage == EvqVaryingOut || | ||||||
|  |             type.getQualifier().storage == EvqBuffer) { | ||||||
|             qualifier.storage      = type.getQualifier().storage; |             qualifier.storage      = type.getQualifier().storage; | ||||||
|  |             qualifier.readonly     = type.getQualifier().readonly; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         type.getQualifier()    = qualifier; |         type.getQualifier()    = qualifier; | ||||||
|     } |     } | ||||||
| @ -609,6 +633,9 @@ bool HlslGrammar::acceptQualifier(TQualifier& qualifier) | |||||||
|             if (! acceptLayoutQualifierList(qualifier)) |             if (! acceptLayoutQualifierList(qualifier)) | ||||||
|                 return false; |                 return false; | ||||||
|             continue; |             continue; | ||||||
|  |         case EHTokGloballyCoherent: | ||||||
|  |             qualifier.coherent = true; | ||||||
|  |             break; | ||||||
| 
 | 
 | ||||||
|         // GS geometries: these are specified on stage input variables, and are an error (not verified here)
 |         // GS geometries: these are specified on stage input variables, and are an error (not verified here)
 | ||||||
|         // for output variables.
 |         // for output variables.
 | ||||||
| @ -1246,11 +1273,19 @@ bool HlslGrammar::acceptType(TType& type) | |||||||
|         return acceptTextureType(type); |         return acceptTextureType(type); | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|  |     case EHTokAppendStructuredBuffer: | ||||||
|  |     case EHTokByteAddressBuffer: | ||||||
|  |     case EHTokConsumeStructuredBuffer: | ||||||
|  |     case EHTokRWByteAddressBuffer: | ||||||
|  |     case EHTokRWStructuredBuffer: | ||||||
|  |     case EHTokStructuredBuffer: | ||||||
|  |         return acceptStructBufferType(type); | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|     case EHTokStruct: |     case EHTokStruct: | ||||||
|     case EHTokCBuffer: |     case EHTokCBuffer: | ||||||
|     case EHTokTBuffer: |     case EHTokTBuffer: | ||||||
|         return acceptStruct(type); |         return acceptStruct(type); | ||||||
|         break; |  | ||||||
| 
 | 
 | ||||||
|     case EHTokIdentifier: |     case EHTokIdentifier: | ||||||
|         // An identifier could be for a user-defined type.
 |         // An identifier could be for a user-defined type.
 | ||||||
| @ -1783,6 +1818,93 @@ bool HlslGrammar::acceptStruct(TType& type) | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // struct_buffer
 | ||||||
|  | //    : APPENDSTRUCTUREDBUFFER
 | ||||||
|  | //    | BYTEADDRESSBUFFER
 | ||||||
|  | //    | CONSUMESTRUCTUREDBUFFER
 | ||||||
|  | //    | RWBYTEADDRESSBUFFER
 | ||||||
|  | //    | RWSTRUCTUREDBUFFER
 | ||||||
|  | //    | STRUCTUREDBUFFER
 | ||||||
|  | bool HlslGrammar::acceptStructBufferType(TType& type) | ||||||
|  | { | ||||||
|  |     const EHlslTokenClass structBuffType = peek(); | ||||||
|  | 
 | ||||||
|  |     // TODO: globallycoherent
 | ||||||
|  |     bool hasTemplateType = true; | ||||||
|  |     bool readonly = false; | ||||||
|  | 
 | ||||||
|  |     TStorageQualifier storage = EvqBuffer; | ||||||
|  | 
 | ||||||
|  |     switch (structBuffType) { | ||||||
|  |     case EHTokAppendStructuredBuffer: | ||||||
|  |         unimplemented("AppendStructuredBuffer"); | ||||||
|  |         return false; | ||||||
|  |     case EHTokByteAddressBuffer: | ||||||
|  |         hasTemplateType = false; | ||||||
|  |         readonly = true; | ||||||
|  |         break; | ||||||
|  |     case EHTokConsumeStructuredBuffer: | ||||||
|  |         unimplemented("ConsumeStructuredBuffer"); | ||||||
|  |         return false; | ||||||
|  |     case EHTokRWByteAddressBuffer: | ||||||
|  |         hasTemplateType = false; | ||||||
|  |         break; | ||||||
|  |     case EHTokRWStructuredBuffer: | ||||||
|  |         break; | ||||||
|  |     case EHTokStructuredBuffer: | ||||||
|  |         readonly = true; | ||||||
|  |         break; | ||||||
|  |     default: | ||||||
|  |         return false;  // not a structure buffer type
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     advanceToken();  // consume the structure keyword
 | ||||||
|  | 
 | ||||||
|  |     // type on which this StructedBuffer is templatized.  E.g, StructedBuffer<MyStruct> ==> MyStruct
 | ||||||
|  |     TType* templateType = new TType; | ||||||
|  | 
 | ||||||
|  |     if (hasTemplateType) { | ||||||
|  |         if (! acceptTokenClass(EHTokLeftAngle)) { | ||||||
|  |             expected("left angle bracket"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         if (! acceptType(*templateType)) { | ||||||
|  |             expected("type"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if (! acceptTokenClass(EHTokRightAngle)) { | ||||||
|  |             expected("right angle bracket"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         // byte address buffers have no explicit type.
 | ||||||
|  |         TType uintType(EbtUint, storage); | ||||||
|  |         templateType->shallowCopy(uintType); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Create an unsized array out of that type.
 | ||||||
|  |     // TODO: does this work if it's already an array type?
 | ||||||
|  |     TArraySizes unsizedArray; | ||||||
|  |     unsizedArray.addInnerSize(UnsizedArraySize); | ||||||
|  |     templateType->newArraySizes(unsizedArray); | ||||||
|  |     templateType->getQualifier().storage = storage; | ||||||
|  |     templateType->getQualifier().readonly = readonly; | ||||||
|  | 
 | ||||||
|  |     // Create block type.  TODO: hidden internal uint member when needed
 | ||||||
|  |     TTypeList* blockStruct = new TTypeList; | ||||||
|  |     TTypeLoc  member = { templateType, token.loc }; | ||||||
|  |     blockStruct->push_back(member); | ||||||
|  | 
 | ||||||
|  |     TType blockType(blockStruct, "", templateType->getQualifier()); | ||||||
|  | 
 | ||||||
|  |     // It's not until we see the name during declaration that we can set the
 | ||||||
|  |     // field name.  That happens in HlslGrammar::acceptDeclaration.
 | ||||||
|  |     type.shallowCopy(blockType); | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // struct_declaration_list
 | // struct_declaration_list
 | ||||||
| //      : struct_declaration SEMI_COLON struct_declaration SEMI_COLON ...
 | //      : struct_declaration SEMI_COLON struct_declaration SEMI_COLON ...
 | ||||||
| //
 | //
 | ||||||
|  | |||||||
| @ -83,6 +83,7 @@ namespace glslang { | |||||||
|         bool acceptAnnotations(TQualifier&); |         bool acceptAnnotations(TQualifier&); | ||||||
|         bool acceptSamplerType(TType&); |         bool acceptSamplerType(TType&); | ||||||
|         bool acceptTextureType(TType&); |         bool acceptTextureType(TType&); | ||||||
|  |         bool acceptStructBufferType(TType&); | ||||||
|         bool acceptStruct(TType&); |         bool acceptStruct(TType&); | ||||||
|         bool acceptStructDeclarationList(TTypeList*&); |         bool acceptStructDeclarationList(TTypeList*&); | ||||||
|         bool acceptFunctionParameters(TFunction&); |         bool acceptFunctionParameters(TFunction&); | ||||||
|  | |||||||
| @ -790,6 +790,61 @@ TIntermTyped* HlslParseContext::handleUnaryMath(const TSourceLoc& loc, const cha | |||||||
|     return childNode; |     return childNode; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //
 | ||||||
|  | // Return true if the name is a sampler method
 | ||||||
|  | //
 | ||||||
|  | bool HlslParseContext::isSamplerMethod(const TString& name) const | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         name == "CalculateLevelOfDetail"          || | ||||||
|  |         name == "CalculateLevelOfDetailUnclamped" || | ||||||
|  |         name == "Gather"                          || | ||||||
|  |         name == "GatherRed"                       || | ||||||
|  |         name == "GatherGreen"                     || | ||||||
|  |         name == "GatherBlue"                      || | ||||||
|  |         name == "GatherAlpha"                     || | ||||||
|  |         name == "GatherCmp"                       || | ||||||
|  |         name == "GatherCmpRed"                    || | ||||||
|  |         name == "GatherCmpGreen"                  || | ||||||
|  |         name == "GatherCmpBlue"                   || | ||||||
|  |         name == "GatherCmpAlpha"                  || | ||||||
|  |         name == "GetDimensions"                   || | ||||||
|  |         name == "GetSamplePosition"               || | ||||||
|  |         name == "Load"                            || | ||||||
|  |         name == "Sample"                          || | ||||||
|  |         name == "SampleBias"                      || | ||||||
|  |         name == "SampleCmp"                       || | ||||||
|  |         name == "SampleCmpLevelZero"              || | ||||||
|  |         name == "SampleGrad"                      || | ||||||
|  |         name == "SampleLevel"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | // Return true if the name is a struct buffer method
 | ||||||
|  | //
 | ||||||
|  | bool HlslParseContext::isStructBufferMethod(const TString& name) const | ||||||
|  | { | ||||||
|  |     return | ||||||
|  |         name == "GetDimensions"              || | ||||||
|  |         name == "Load"                       || | ||||||
|  |         name == "Load2"                      || | ||||||
|  |         name == "Load3"                      || | ||||||
|  |         name == "Load4"                      || | ||||||
|  |         name == "Store"                      || | ||||||
|  |         name == "Store2"                     || | ||||||
|  |         name == "Store3"                     || | ||||||
|  |         name == "Store4"                     || | ||||||
|  |         name == "InterlockedAdd"             || | ||||||
|  |         name == "InterlockedAnd"             || | ||||||
|  |         name == "InterlockedCompareExchange" || | ||||||
|  |         name == "InterlockedCompareStore"    || | ||||||
|  |         name == "InterlockedExchange"        || | ||||||
|  |         name == "InterlockedMax"             || | ||||||
|  |         name == "InterlockedMin"             || | ||||||
|  |         name == "InterlockedOr"              || | ||||||
|  |         name == "InterlockedXor"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| //
 | //
 | ||||||
| // Handle seeing a base.field dereference in the grammar.
 | // Handle seeing a base.field dereference in the grammar.
 | ||||||
| //
 | //
 | ||||||
| @ -804,35 +859,18 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt | |||||||
|     //
 |     //
 | ||||||
|     if (field == "length") { |     if (field == "length") { | ||||||
|         return intermediate.addMethod(base, TType(EbtInt), &field, loc); |         return intermediate.addMethod(base, TType(EbtInt), &field, loc); | ||||||
|     } else if (field == "CalculateLevelOfDetail"          || |     } else if (isSamplerMethod(field) && base->getType().getBasicType() == EbtSampler) { | ||||||
|                field == "CalculateLevelOfDetailUnclamped" || |         // If it's not a method on a sampler object, we fall through to let other objects have a go.
 | ||||||
|                field == "Gather"                          || |         const TSampler& sampler = base->getType().getSampler(); | ||||||
|                field == "GatherRed"                       || |         if (! sampler.isPureSampler()) { | ||||||
|                field == "GatherGreen"                     || |             const int vecSize = sampler.isShadow() ? 1 : 4; // TODO: handle arbitrary sample return sizes
 | ||||||
|                field == "GatherBlue"                      || |             return intermediate.addMethod(base, TType(sampler.type, EvqTemporary, vecSize), &field, loc); | ||||||
|                field == "GatherAlpha"                     || |  | ||||||
|                field == "GatherCmp"                       || |  | ||||||
|                field == "GatherCmpRed"                    || |  | ||||||
|                field == "GatherCmpGreen"                  || |  | ||||||
|                field == "GatherCmpBlue"                   || |  | ||||||
|                field == "GatherCmpAlpha"                  || |  | ||||||
|                field == "GetDimensions"                   || |  | ||||||
|                field == "GetSamplePosition"               || |  | ||||||
|                field == "Load"                            || |  | ||||||
|                field == "Sample"                          || |  | ||||||
|                field == "SampleBias"                      || |  | ||||||
|                field == "SampleCmp"                       || |  | ||||||
|                field == "SampleCmpLevelZero"              || |  | ||||||
|                field == "SampleGrad"                      || |  | ||||||
|                field == "SampleLevel") { |  | ||||||
|         // If it's not a method on a sampler object, we fall through in case it is a struct member.
 |  | ||||||
|         if (base->getType().getBasicType() == EbtSampler) { |  | ||||||
|             const TSampler& sampler = base->getType().getSampler(); |  | ||||||
|             if (! sampler.isPureSampler()) { |  | ||||||
|                 const int vecSize = sampler.isShadow() ? 1 : 4; // TODO: handle arbitrary sample return sizes
 |  | ||||||
|                 return intermediate.addMethod(base, TType(sampler.type, EvqTemporary, vecSize), &field, loc); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|  |     } else if (isStructBufferMethod(field) &&  | ||||||
|  |                base->getType().isRuntimeSizedArray() && | ||||||
|  |                (base->getQualifier().storage == EvqUniform || base->getQualifier().storage == EvqBuffer)) { | ||||||
|  |         TType retType(base->getType(), 0); | ||||||
|  |         return intermediate.addMethod(base, retType, &field, loc); | ||||||
|     } else if (field == "Append" || |     } else if (field == "Append" || | ||||||
|                field == "RestartStrip") { |                field == "RestartStrip") { | ||||||
|         // We cannot check the type here: it may be sanitized if we're not compiling a geometry shader, but
 |         // We cannot check the type here: it may be sanitized if we're not compiling a geometry shader, but
 | ||||||
| @ -2236,6 +2274,236 @@ TIntermAggregate* HlslParseContext::handleSamplerTextureCombine(const TSourceLoc | |||||||
|     return txcombine; |     return txcombine; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //
 | ||||||
|  | // Decompose structure buffer methods into AST
 | ||||||
|  | //
 | ||||||
|  | void HlslParseContext::decomposeStructBufferMethods(const TSourceLoc& loc, TIntermTyped*& node, TIntermNode* arguments) | ||||||
|  | { | ||||||
|  |     if (!node || !node->getAsOperator()) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     const TOperator op  = node->getAsOperator()->getOp(); | ||||||
|  |     TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr; | ||||||
|  | 
 | ||||||
|  |     TIntermTyped* argArray = argAggregate ? argAggregate->getSequence()[0]->getAsTyped() : nullptr;  // array
 | ||||||
|  | 
 | ||||||
|  |     // Bail out if not a block method
 | ||||||
|  |     if (argArray == nullptr || !argArray->getType().isRuntimeSizedArray()) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     switch (op) { | ||||||
|  |     case EOpMethodLoad: | ||||||
|  |         { | ||||||
|  |             TIntermTyped* argIndex = argAggregate->getSequence()[1]->getAsTyped();  // index
 | ||||||
|  | 
 | ||||||
|  |             // Byte address buffers index in bytes (only multiples of 4 permitted... not so much a byte address
 | ||||||
|  |             // buffer then, but that's what it calls itself.
 | ||||||
|  |             const bool isByteAddressBuffer = (argArray->getBasicType() == EbtUint); | ||||||
|  |             if (isByteAddressBuffer) | ||||||
|  |                 argIndex = intermediate.addBinaryNode(EOpRightShift, argIndex, intermediate.addConstantUnion(2, loc, true), | ||||||
|  |                                                       loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |             // Index into the array to find the item being loaded.
 | ||||||
|  |             const TOperator idxOp = (argIndex->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect; | ||||||
|  | 
 | ||||||
|  |             node = intermediate.addIndex(idxOp, argArray, argIndex, loc); | ||||||
|  | 
 | ||||||
|  |             const TType derefType(argArray->getType(), 0); | ||||||
|  |             node->setType(derefType); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case EOpMethodLoad2: | ||||||
|  |     case EOpMethodLoad3: | ||||||
|  |     case EOpMethodLoad4: | ||||||
|  |         { | ||||||
|  |             TIntermTyped* argIndex = argAggregate->getSequence()[1]->getAsTyped();  // index
 | ||||||
|  | 
 | ||||||
|  |             TOperator constructOp = EOpNull; | ||||||
|  |             int size = 0; | ||||||
|  | 
 | ||||||
|  |             switch (op) { | ||||||
|  |             case EOpMethodLoad2: size = 2; constructOp = EOpConstructVec2; break; | ||||||
|  |             case EOpMethodLoad3: size = 3; constructOp = EOpConstructVec3; break; | ||||||
|  |             case EOpMethodLoad4: size = 4; constructOp = EOpConstructVec4; break; | ||||||
|  |             default: assert(0); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             TIntermTyped* body = nullptr; | ||||||
|  | 
 | ||||||
|  |             // First, we'll store the address in a variable to avoid multiple shifts
 | ||||||
|  |             // (we must convert the byte address to an item address)
 | ||||||
|  |             TIntermTyped* byteAddrIdx = intermediate.addBinaryNode(EOpRightShift, argIndex, | ||||||
|  |                                                                    intermediate.addConstantUnion(2, loc, true), loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |             TVariable* byteAddrSym = makeInternalVariable("byteAddrTemp", TType(EbtInt, EvqTemporary)); | ||||||
|  |             TIntermTyped* byteAddrIdxVar = intermediate.addSymbol(*byteAddrSym, loc); | ||||||
|  | 
 | ||||||
|  |             body = intermediate.growAggregate(body, intermediate.addAssign(EOpAssign, byteAddrIdxVar, byteAddrIdx, loc)); | ||||||
|  | 
 | ||||||
|  |             TIntermTyped* vec = nullptr; | ||||||
|  | 
 | ||||||
|  |             // These are only valid on (rw)byteaddressbuffers, so we can always perform the >>2
 | ||||||
|  |             // address conversion.
 | ||||||
|  |             for (int idx=0; idx<size; ++idx) { | ||||||
|  |                 TIntermTyped* offsetIdx = byteAddrIdxVar; | ||||||
|  | 
 | ||||||
|  |                 // add index offset
 | ||||||
|  |                 if (idx != 0) | ||||||
|  |                     offsetIdx = intermediate.addBinaryNode(EOpAdd, offsetIdx, intermediate.addConstantUnion(idx, loc, true), | ||||||
|  |                                                            loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |                 const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect; | ||||||
|  | 
 | ||||||
|  |                 vec = intermediate.growAggregate(vec, intermediate.addIndex(idxOp, argArray, offsetIdx, loc)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             vec->setType(TType(argArray->getBasicType(), EvqTemporary, size)); | ||||||
|  |             vec->getAsAggregate()->setOperator(constructOp); | ||||||
|  | 
 | ||||||
|  |             body = intermediate.growAggregate(body, vec); | ||||||
|  |             body->setType(vec->getType()); | ||||||
|  |             body->getAsAggregate()->setOperator(EOpSequence); | ||||||
|  | 
 | ||||||
|  |             node = body; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case EOpMethodStore: | ||||||
|  |     case EOpMethodStore2: | ||||||
|  |     case EOpMethodStore3: | ||||||
|  |     case EOpMethodStore4: | ||||||
|  |         { | ||||||
|  |             TIntermTyped* argIndex = argAggregate->getSequence()[1]->getAsTyped();  // address
 | ||||||
|  |             TIntermTyped* argValue = argAggregate->getSequence()[2]->getAsTyped();  // value
 | ||||||
|  | 
 | ||||||
|  |             // Index into the array to find the item being loaded.
 | ||||||
|  |             // Byte address buffers index in bytes (only multiples of 4 permitted... not so much a byte address
 | ||||||
|  |             // buffer then, but that's what it calls itself.
 | ||||||
|  | 
 | ||||||
|  |             int size = 0; | ||||||
|  | 
 | ||||||
|  |             switch (op) { | ||||||
|  |             case EOpMethodStore:  size = 1; break; | ||||||
|  |             case EOpMethodStore2: size = 2; break; | ||||||
|  |             case EOpMethodStore3: size = 3; break; | ||||||
|  |             case EOpMethodStore4: size = 4; break; | ||||||
|  |             default: assert(0); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             TIntermAggregate* body = nullptr; | ||||||
|  | 
 | ||||||
|  |             // First, we'll store the address in a variable to avoid multiple shifts
 | ||||||
|  |             // (we must convert the byte address to an item address)
 | ||||||
|  |             TIntermTyped* byteAddrIdx = intermediate.addBinaryNode(EOpRightShift, argIndex, | ||||||
|  |                                                                    intermediate.addConstantUnion(2, loc, true), loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |             TVariable* byteAddrSym = makeInternalVariable("byteAddrTemp", TType(EbtInt, EvqTemporary)); | ||||||
|  |             TIntermTyped* byteAddrIdxVar = intermediate.addSymbol(*byteAddrSym, loc); | ||||||
|  | 
 | ||||||
|  |             body = intermediate.growAggregate(body, intermediate.addAssign(EOpAssign, byteAddrIdxVar, byteAddrIdx, loc)); | ||||||
|  | 
 | ||||||
|  |             for (int idx=0; idx<size; ++idx) { | ||||||
|  |                 TIntermTyped* offsetIdx = byteAddrIdxVar; | ||||||
|  |                 TIntermTyped* idxConst = intermediate.addConstantUnion(idx, loc, true); | ||||||
|  | 
 | ||||||
|  |                 // add index offset
 | ||||||
|  |                 if (idx != 0) | ||||||
|  |                     offsetIdx = intermediate.addBinaryNode(EOpAdd, offsetIdx, idxConst, loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |                 const TOperator idxOp = (offsetIdx->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect; | ||||||
|  | 
 | ||||||
|  |                 TIntermTyped* lValue = intermediate.addIndex(idxOp, argArray, offsetIdx, loc); | ||||||
|  |                 TIntermTyped* rValue = (size == 1) ? argValue : | ||||||
|  |                     intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc); | ||||||
|  |                      | ||||||
|  |                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, lValue, rValue, loc);  | ||||||
|  | 
 | ||||||
|  |                 body = intermediate.growAggregate(body, assign); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             body->setOperator(EOpSequence); | ||||||
|  |             node = body; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case EOpMethodGetDimensions: | ||||||
|  |         { | ||||||
|  |             const int numArgs = argAggregate->getSequence().size(); | ||||||
|  |             TIntermTyped* argNumItems = argAggregate->getSequence()[1]->getAsTyped();  // out num items
 | ||||||
|  |             TIntermTyped* argStride   = numArgs > 2 ? argAggregate->getSequence()[2]->getAsTyped() : nullptr;  // out stride
 | ||||||
|  | 
 | ||||||
|  |             TIntermAggregate* body = nullptr; | ||||||
|  | 
 | ||||||
|  |             // Length output:
 | ||||||
|  |             if (argArray->getType().isRuntimeSizedArray()) { | ||||||
|  |                 TIntermTyped* lengthCall = intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, argArray, | ||||||
|  |                                                                                argNumItems->getType()); | ||||||
|  |                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, lengthCall, loc); | ||||||
|  |                 body = intermediate.growAggregate(body, assign, loc); | ||||||
|  |             } else { | ||||||
|  |                 const int length = argArray->getType().getOuterArraySize(); | ||||||
|  |                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, argNumItems, intermediate.addConstantUnion(length, loc, true), loc); | ||||||
|  |                 body = intermediate.growAggregate(body, assign, loc); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // Stride output:
 | ||||||
|  |             if (argStride != nullptr) { | ||||||
|  |                 int size; | ||||||
|  |                 int stride; | ||||||
|  |                 intermediate.getBaseAlignment(argArray->getType(), size, stride, false, | ||||||
|  |                                               argArray->getType().getQualifier().layoutMatrix == ElmRowMajor); | ||||||
|  | 
 | ||||||
|  |                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, argStride, intermediate.addConstantUnion(stride, loc, true), loc); | ||||||
|  | 
 | ||||||
|  |                 body = intermediate.growAggregate(body, assign); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             body->setOperator(EOpSequence); | ||||||
|  |             node = body; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     case EOpInterlockedAdd: | ||||||
|  |     case EOpInterlockedAnd: | ||||||
|  |     case EOpInterlockedExchange: | ||||||
|  |     case EOpInterlockedMax: | ||||||
|  |     case EOpInterlockedMin: | ||||||
|  |     case EOpInterlockedOr: | ||||||
|  |     case EOpInterlockedXor: | ||||||
|  |     case EOpInterlockedCompareExchange: | ||||||
|  |     case EOpInterlockedCompareStore: | ||||||
|  |         { | ||||||
|  |             // We'll replace the first argument with the block dereference, and let
 | ||||||
|  |             // downstream decomposition handle the rest.
 | ||||||
|  | 
 | ||||||
|  |             TIntermSequence& sequence = argAggregate->getSequence(); | ||||||
|  | 
 | ||||||
|  |             TIntermTyped* argIndex     = sequence[1]->getAsTyped();  // index
 | ||||||
|  |             argIndex = intermediate.addBinaryNode(EOpRightShift, argIndex, intermediate.addConstantUnion(2, loc, true), | ||||||
|  |                                                   loc, TType(EbtInt)); | ||||||
|  | 
 | ||||||
|  |             const TOperator idxOp = (argIndex->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect; | ||||||
|  |             TIntermTyped* element = intermediate.addIndex(idxOp, argArray, argIndex, loc); | ||||||
|  | 
 | ||||||
|  |             const TType derefType(argArray->getType(), 0); | ||||||
|  |             element->setType(derefType); | ||||||
|  | 
 | ||||||
|  |             // Replace the numeric byte offset parameter with array reference.
 | ||||||
|  |             sequence[1] = element; | ||||||
|  |             sequence.erase(sequence.begin(), sequence.begin()+1); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |     default: | ||||||
|  |         break; // most pass through unchanged
 | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |      | ||||||
| //
 | //
 | ||||||
| // Decompose DX9 and DX10 sample intrinsics & object methods into AST
 | // Decompose DX9 and DX10 sample intrinsics & object methods into AST
 | ||||||
| //
 | //
 | ||||||
| @ -2264,6 +2532,15 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType | |||||||
|     const TOperator op  = node->getAsOperator()->getOp(); |     const TOperator op  = node->getAsOperator()->getOp(); | ||||||
|     const TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr; |     const TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr; | ||||||
| 
 | 
 | ||||||
|  |     // Bail out if not a sampler method
 | ||||||
|  |     if (arguments != nullptr) { | ||||||
|  |         if ((argAggregate != nullptr && argAggregate->getSequence()[0]->getAsTyped()->getBasicType() != EbtSampler)) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         if (argAggregate == nullptr && arguments->getAsTyped()->getBasicType() != EbtSampler) | ||||||
|  |             return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     switch (op) { |     switch (op) { | ||||||
|     // **** DX9 intrinsics: ****
 |     // **** DX9 intrinsics: ****
 | ||||||
|     case EOpTexture: |     case EOpTexture: | ||||||
| @ -3359,9 +3636,27 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct | |||||||
|         //
 |         //
 | ||||||
|         // Find it in the symbol table.
 |         // Find it in the symbol table.
 | ||||||
|         //
 |         //
 | ||||||
|         const TFunction* fnCandidate; |         const TFunction* fnCandidate = nullptr; | ||||||
|         bool builtIn; |         bool builtIn; | ||||||
|         fnCandidate = findFunction(loc, *function, builtIn, arguments); | 
 | ||||||
|  |         // TODO: this needs improvement: there's no way at present to look up a signature in
 | ||||||
|  |         // the symbol table for an arbitrary type.  This is a temporary hack until that ability exists.
 | ||||||
|  |         // It will have false positives, since it doesn't check arg counts or types.
 | ||||||
|  |         if (arguments && arguments->getAsAggregate()) { | ||||||
|  |             if (arguments->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().isRuntimeSizedArray()) { | ||||||
|  |                 if (isStructBufferMethod(function->getName())) { | ||||||
|  |                     const TString mangle = function->getName() + "("; | ||||||
|  |                     TSymbol* symbol = symbolTable.find(mangle, &builtIn); | ||||||
|  | 
 | ||||||
|  |                     if (symbol) | ||||||
|  |                         fnCandidate = symbol->getAsFunction(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (fnCandidate == nullptr) | ||||||
|  |             fnCandidate = findFunction(loc, *function, builtIn, arguments); | ||||||
|  | 
 | ||||||
|         if (fnCandidate) { |         if (fnCandidate) { | ||||||
|             // This is a declared function that might map to
 |             // This is a declared function that might map to
 | ||||||
|             //  - a built-in operator,
 |             //  - a built-in operator,
 | ||||||
| @ -3407,9 +3702,10 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct | |||||||
|             // output conversions.
 |             // output conversions.
 | ||||||
|             const TIntermTyped* fnNode = result; |             const TIntermTyped* fnNode = result; | ||||||
| 
 | 
 | ||||||
|             decomposeIntrinsic(loc, result, arguments);       // HLSL->AST intrinsic decompositions
 |             decomposeStructBufferMethods(loc, result, arguments); // HLSL->AST struct buffer method decompositions
 | ||||||
|             decomposeSampleMethods(loc, result, arguments);   // HLSL->AST sample method decompositions
 |             decomposeIntrinsic(loc, result, arguments);           // HLSL->AST intrinsic decompositions
 | ||||||
|             decomposeGeometryMethods(loc, result, arguments); // HLSL->AST geometry method decompositions
 |             decomposeSampleMethods(loc, result, arguments);       // HLSL->AST sample method decompositions
 | ||||||
|  |             decomposeGeometryMethods(loc, result, arguments);     // HLSL->AST geometry method decompositions
 | ||||||
| 
 | 
 | ||||||
|             // Convert 'out' arguments.  If it was a constant folded built-in, it won't be an aggregate anymore.
 |             // Convert 'out' arguments.  If it was a constant folded built-in, it won't be an aggregate anymore.
 | ||||||
|             // Built-ins with a single argument aren't called with an aggregate, but they also don't have an output.
 |             // Built-ins with a single argument aren't called with an aggregate, but they also don't have an output.
 | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ public: | |||||||
|     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); |     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); | ||||||
|     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|  |     void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|     void decomposeGeometryMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeGeometryMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|     TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*); |     TIntermTyped* handleLengthMethod(const TSourceLoc&, TFunction*, TIntermNode*); | ||||||
|     void addInputArgumentConversions(const TFunction&, TIntermTyped*&); |     void addInputArgumentConversions(const TFunction&, TIntermTyped*&); | ||||||
| @ -243,6 +244,10 @@ protected: | |||||||
|     void correctUniform(TQualifier& qualifier); |     void correctUniform(TQualifier& qualifier); | ||||||
|     void clearUniformInputOutput(TQualifier& qualifier); |     void clearUniformInputOutput(TQualifier& qualifier); | ||||||
| 
 | 
 | ||||||
|  |     // Test method names
 | ||||||
|  |     bool isSamplerMethod(const TString& name) const; | ||||||
|  |     bool isStructBufferMethod(const TString& name) const; | ||||||
|  | 
 | ||||||
|     // Pass through to base class after remembering builtin mappings.
 |     // Pass through to base class after remembering builtin mappings.
 | ||||||
|     using TParseContextBase::trackLinkage; |     using TParseContextBase::trackLinkage; | ||||||
|     void trackLinkage(TSymbol& variable) override; |     void trackLinkage(TSymbol& variable) override; | ||||||
|  | |||||||
| @ -850,6 +850,26 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c | |||||||
|         { "Append",                           "-",     "-",       "-",              "-",              EShLangGS  }, |         { "Append",                           "-",     "-",       "-",              "-",              EShLangGS  }, | ||||||
|         { "RestartStrip",                     "-",     "-",       "-",              "-",              EShLangGS  }, |         { "RestartStrip",                     "-",     "-",       "-",              "-",              EShLangGS  }, | ||||||
| 
 | 
 | ||||||
|  |         // Methods for structurebuffers.  TODO: wildcard type matching.
 | ||||||
|  |         { "Load",                             nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Load2",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Load3",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Load4",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Store",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Store2",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Store3",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "Store4",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "GetDimensions",                    nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedAdd",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedAnd",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedCompareExchange",       nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedCompareStore",          nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedExchange",              nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedMax",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedMin",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedOr",                    nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  |         { "InterlockedXor",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, | ||||||
|  | 
 | ||||||
|         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
 |         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
 | ||||||
|         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0 }, |         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0 }, | ||||||
|     }; |     }; | ||||||
| @ -1144,6 +1164,15 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil | |||||||
|     symbolTable.relateToOperator("CalculateLevelOfDetail",      EOpMethodCalculateLevelOfDetail); |     symbolTable.relateToOperator("CalculateLevelOfDetail",      EOpMethodCalculateLevelOfDetail); | ||||||
|     symbolTable.relateToOperator("CalculateLevelOfDetailUnclamped", EOpMethodCalculateLevelOfDetailUnclamped); |     symbolTable.relateToOperator("CalculateLevelOfDetailUnclamped", EOpMethodCalculateLevelOfDetailUnclamped); | ||||||
| 
 | 
 | ||||||
|  |     // Structure buffer methods (excluding associations already made above for texture methods w/ same name)
 | ||||||
|  |     symbolTable.relateToOperator("Load2",                       EOpMethodLoad2); | ||||||
|  |     symbolTable.relateToOperator("Load3",                       EOpMethodLoad3); | ||||||
|  |     symbolTable.relateToOperator("Load4",                       EOpMethodLoad4); | ||||||
|  |     symbolTable.relateToOperator("Store",                       EOpMethodStore); | ||||||
|  |     symbolTable.relateToOperator("Store2",                      EOpMethodStore2); | ||||||
|  |     symbolTable.relateToOperator("Store3",                      EOpMethodStore3); | ||||||
|  |     symbolTable.relateToOperator("Store4",                      EOpMethodStore4); | ||||||
|  | 
 | ||||||
|     // SM5 Texture methods
 |     // SM5 Texture methods
 | ||||||
|     symbolTable.relateToOperator("GatherRed",                   EOpMethodGatherRed); |     symbolTable.relateToOperator("GatherRed",                   EOpMethodGatherRed); | ||||||
|     symbolTable.relateToOperator("GatherGreen",                 EOpMethodGatherGreen); |     symbolTable.relateToOperator("GatherGreen",                 EOpMethodGatherGreen); | ||||||
|  | |||||||
| @ -118,6 +118,7 @@ void HlslScanContext::fillInKeywordMap() | |||||||
|     (*KeywordMap)["out"] =                     EHTokOut; |     (*KeywordMap)["out"] =                     EHTokOut; | ||||||
|     (*KeywordMap)["inout"] =                   EHTokInOut; |     (*KeywordMap)["inout"] =                   EHTokInOut; | ||||||
|     (*KeywordMap)["layout"] =                  EHTokLayout; |     (*KeywordMap)["layout"] =                  EHTokLayout; | ||||||
|  |     (*KeywordMap)["globallycoherent"] =        EHTokGloballyCoherent; | ||||||
| 
 | 
 | ||||||
|     (*KeywordMap)["point"] =                   EHTokPoint; |     (*KeywordMap)["point"] =                   EHTokPoint; | ||||||
|     (*KeywordMap)["line"] =                    EHTokLine; |     (*KeywordMap)["line"] =                    EHTokLine; | ||||||
| @ -319,6 +320,13 @@ void HlslScanContext::fillInKeywordMap() | |||||||
|     (*KeywordMap)["RWTexture3D"] =             EHTokRWTexture3d; |     (*KeywordMap)["RWTexture3D"] =             EHTokRWTexture3d; | ||||||
|     (*KeywordMap)["RWBuffer"] =                EHTokRWBuffer; |     (*KeywordMap)["RWBuffer"] =                EHTokRWBuffer; | ||||||
| 
 | 
 | ||||||
|  |     (*KeywordMap)["AppendStructuredBuffer"] =  EHTokAppendStructuredBuffer; | ||||||
|  |     (*KeywordMap)["ByteAddressBuffer"] =       EHTokByteAddressBuffer; | ||||||
|  |     (*KeywordMap)["ConsumeStructuredBuffer"] = EHTokConsumeStructuredBuffer; | ||||||
|  |     (*KeywordMap)["RWByteAddressBuffer"] =     EHTokRWByteAddressBuffer; | ||||||
|  |     (*KeywordMap)["RWStructuredBuffer"] =      EHTokRWStructuredBuffer; | ||||||
|  |     (*KeywordMap)["StructuredBuffer"] =        EHTokStructuredBuffer; | ||||||
|  | 
 | ||||||
|     (*KeywordMap)["struct"] =                  EHTokStruct; |     (*KeywordMap)["struct"] =                  EHTokStruct; | ||||||
|     (*KeywordMap)["cbuffer"] =                 EHTokCBuffer; |     (*KeywordMap)["cbuffer"] =                 EHTokCBuffer; | ||||||
|     (*KeywordMap)["tbuffer"] =                 EHTokTBuffer; |     (*KeywordMap)["tbuffer"] =                 EHTokTBuffer; | ||||||
| @ -527,6 +535,7 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier() | |||||||
|     case EHTokInOut: |     case EHTokInOut: | ||||||
|     case EHTokPrecise: |     case EHTokPrecise: | ||||||
|     case EHTokLayout: |     case EHTokLayout: | ||||||
|  |     case EHTokGloballyCoherent: | ||||||
|         return keyword; |         return keyword; | ||||||
| 
 | 
 | ||||||
|     // primitive types
 |     // primitive types
 | ||||||
| @ -722,6 +731,12 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier() | |||||||
|     case EHTokRWTexture2darray: |     case EHTokRWTexture2darray: | ||||||
|     case EHTokRWTexture3d: |     case EHTokRWTexture3d: | ||||||
|     case EHTokRWBuffer: |     case EHTokRWBuffer: | ||||||
|  |     case EHTokAppendStructuredBuffer: | ||||||
|  |     case EHTokByteAddressBuffer: | ||||||
|  |     case EHTokConsumeStructuredBuffer: | ||||||
|  |     case EHTokRWByteAddressBuffer: | ||||||
|  |     case EHTokRWStructuredBuffer: | ||||||
|  |     case EHTokStructuredBuffer: | ||||||
|         return keyword; |         return keyword; | ||||||
| 
 | 
 | ||||||
|     // variable, user type, ...
 |     // variable, user type, ...
 | ||||||
|  | |||||||
| @ -65,6 +65,7 @@ enum EHlslTokenClass { | |||||||
|     EHTokOut, |     EHTokOut, | ||||||
|     EHTokInOut, |     EHTokInOut, | ||||||
|     EHTokLayout, |     EHTokLayout, | ||||||
|  |     EHTokGloballyCoherent, | ||||||
| 
 | 
 | ||||||
|     // primitive types
 |     // primitive types
 | ||||||
|     EHTokPoint, |     EHTokPoint, | ||||||
| @ -256,6 +257,14 @@ enum EHlslTokenClass { | |||||||
|     EHTokRWTexture3d, |     EHTokRWTexture3d, | ||||||
|     EHTokRWBuffer, |     EHTokRWBuffer, | ||||||
| 
 | 
 | ||||||
|  |     // Structure buffer variants
 | ||||||
|  |     EHTokAppendStructuredBuffer, | ||||||
|  |     EHTokByteAddressBuffer, | ||||||
|  |     EHTokConsumeStructuredBuffer, | ||||||
|  |     EHTokRWByteAddressBuffer, | ||||||
|  |     EHTokRWStructuredBuffer, | ||||||
|  |     EHTokStructuredBuffer, | ||||||
|  | 
 | ||||||
|     // variable, user type, ...
 |     // variable, user type, ...
 | ||||||
|     EHTokIdentifier, |     EHTokIdentifier, | ||||||
|     EHTokTypeName, |     EHTokTypeName, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Kessenich
						John Kessenich