Merge pull request #812 from steve-lunarg/PatchIO
HLSL: Support InputPatch variables in patch constant functions
This commit is contained in:
		
						commit
						8df9a48698
					
				
							
								
								
									
										633
									
								
								Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										633
									
								
								Test/baseResults/hlsl.hull.ctrlpt-2.tesc.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,633 @@ | |||||||
|  | hlsl.hull.ctrlpt-2.tesc | ||||||
|  | Shader version: 450 | ||||||
|  | vertices = 3 | ||||||
|  | vertex spacing = fractional_odd_spacing | ||||||
|  | triangle order = cw | ||||||
|  | 0:? Sequence | ||||||
|  | 0:28  Function Definition: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28    Function Parameters:  | ||||||
|  | 0:28      'i' ( in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28      'cpid' ( in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:29      val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:29        direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:29          'i' ( in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:29          Constant: | ||||||
|  | 0:29            0 (const int) | ||||||
|  | 0:29        Constant: | ||||||
|  | 0:29          0 (const int) | ||||||
|  | 0:32      move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:32        val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:32          'o' ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:32          Constant: | ||||||
|  | 0:32            0 (const int) | ||||||
|  | 0:32        Construct vec3 ( temp 3-component vector of float) | ||||||
|  | 0:32          Convert uint to float ( temp float) | ||||||
|  | 0:32            'cpid' ( in uint) | ||||||
|  | 0:33      Branch: Return with expression | ||||||
|  | 0:33        'o' ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28  Function Definition: main( ( temp void) | ||||||
|  | 0:28    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:28      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28      move second child to first child ( temp uint) | ||||||
|  | 0:?         'cpid' ( temp uint) | ||||||
|  | 0:?         'cpid' ( in uint InvocationID) | ||||||
|  | 0:28      move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28        indirect index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'cpid' ( in uint InvocationID) | ||||||
|  | 0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'cpid' ( temp uint) | ||||||
|  | 0:?       Barrier ( temp void) | ||||||
|  | 0:?       Test condition and select ( temp void) | ||||||
|  | 0:?         Condition | ||||||
|  | 0:?         Compare Equal ( temp bool) | ||||||
|  | 0:?           'cpid' ( in uint InvocationID) | ||||||
|  | 0:?           Constant: | ||||||
|  | 0:?             0 (const int) | ||||||
|  | 0:?         true case | ||||||
|  | 0:?         Sequence | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 0 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 0 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 1 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 1 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 2 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 2 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?             Function Call: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           Sequence | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   2 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   2 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelInner) | ||||||
|  | 0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?               flInFactor: direct index for structure ( temp float) | ||||||
|  | 0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:38  Function Definition: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:38    Function Parameters:  | ||||||
|  | 0:38      'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:38      'pcf_in' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:41      move second child to first child ( temp float) | ||||||
|  | 0:41        direct index ( temp float) | ||||||
|  | 0:41          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:41            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:41            Constant: | ||||||
|  | 0:41              0 (const int) | ||||||
|  | 0:41          Constant: | ||||||
|  | 0:41            0 (const int) | ||||||
|  | 0:41        direct index ( temp float) | ||||||
|  | 0:41          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:41            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:41              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:41              Constant: | ||||||
|  | 0:41                0 (const int) | ||||||
|  | 0:41            Constant: | ||||||
|  | 0:41              0 (const int) | ||||||
|  | 0:41          Constant: | ||||||
|  | 0:41            0 (const int) | ||||||
|  | 0:42      move second child to first child ( temp float) | ||||||
|  | 0:42        direct index ( temp float) | ||||||
|  | 0:42          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:42            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:42            Constant: | ||||||
|  | 0:42              0 (const int) | ||||||
|  | 0:42          Constant: | ||||||
|  | 0:42            1 (const int) | ||||||
|  | 0:42        direct index ( temp float) | ||||||
|  | 0:42          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:42            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:42              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:42              Constant: | ||||||
|  | 0:42                1 (const int) | ||||||
|  | 0:42            Constant: | ||||||
|  | 0:42              0 (const int) | ||||||
|  | 0:42          Constant: | ||||||
|  | 0:42            0 (const int) | ||||||
|  | 0:43      move second child to first child ( temp float) | ||||||
|  | 0:43        direct index ( temp float) | ||||||
|  | 0:43          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:43            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:43            Constant: | ||||||
|  | 0:43              0 (const int) | ||||||
|  | 0:43          Constant: | ||||||
|  | 0:43            2 (const int) | ||||||
|  | 0:43        direct index ( temp float) | ||||||
|  | 0:43          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:43            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:43              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:43              Constant: | ||||||
|  | 0:43                2 (const int) | ||||||
|  | 0:43            Constant: | ||||||
|  | 0:43              0 (const int) | ||||||
|  | 0:43          Constant: | ||||||
|  | 0:43            0 (const int) | ||||||
|  | 0:44      move second child to first child ( temp float) | ||||||
|  | 0:44        flInFactor: direct index for structure ( temp float) | ||||||
|  | 0:44          'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:44          Constant: | ||||||
|  | 0:44            1 (const int) | ||||||
|  | 0:44        Constant: | ||||||
|  | 0:44          4.000000 | ||||||
|  | 0:46      Branch: Return with expression | ||||||
|  | 0:46        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     'cpid' ( in uint InvocationID) | ||||||
|  | 0:?     '@patchConstantOutput' (layout( location=1) patch out structure{}) | ||||||
|  | 0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked tessellation control stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 450 | ||||||
|  | vertices = 3 | ||||||
|  | vertex spacing = fractional_odd_spacing | ||||||
|  | triangle order = cw | ||||||
|  | 0:? Sequence | ||||||
|  | 0:28  Function Definition: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28    Function Parameters:  | ||||||
|  | 0:28      'i' ( in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28      'cpid' ( in uint) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:29      val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:29        direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:29          'i' ( in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:29          Constant: | ||||||
|  | 0:29            0 (const int) | ||||||
|  | 0:29        Constant: | ||||||
|  | 0:29          0 (const int) | ||||||
|  | 0:32      move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:32        val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:32          'o' ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:32          Constant: | ||||||
|  | 0:32            0 (const int) | ||||||
|  | 0:32        Construct vec3 ( temp 3-component vector of float) | ||||||
|  | 0:32          Convert uint to float ( temp float) | ||||||
|  | 0:32            'cpid' ( in uint) | ||||||
|  | 0:33      Branch: Return with expression | ||||||
|  | 0:33        'o' ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28  Function Definition: main( ( temp void) | ||||||
|  | 0:28    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:28      move second child to first child ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?         'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?         'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28      move second child to first child ( temp uint) | ||||||
|  | 0:?         'cpid' ( temp uint) | ||||||
|  | 0:?         'cpid' ( in uint InvocationID) | ||||||
|  | 0:28      move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:28        indirect index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'cpid' ( in uint InvocationID) | ||||||
|  | 0:28        Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           'cpid' ( temp uint) | ||||||
|  | 0:?       Barrier ( temp void) | ||||||
|  | 0:?       Test condition and select ( temp void) | ||||||
|  | 0:?         Condition | ||||||
|  | 0:?         Compare Equal ( temp bool) | ||||||
|  | 0:?           'cpid' ( in uint InvocationID) | ||||||
|  | 0:?           Constant: | ||||||
|  | 0:?             0 (const int) | ||||||
|  | 0:?         true case | ||||||
|  | 0:?         Sequence | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 0 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 0 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 1 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 1 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?             direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 2 (const int) | ||||||
|  | 0:?             Function Call: @main(struct-hs_in_t-vf31[3];u1; ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               Constant: | ||||||
|  | 0:?                 2 (const uint) | ||||||
|  | 0:?           move second child to first child ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?             '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?             Function Call: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?               'pcf_out' ( temp 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?               'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?           Sequence | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelOuter) | ||||||
|  | 0:?                 '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   2 (const int) | ||||||
|  | 0:?               direct index ( temp float) | ||||||
|  | 0:?                 tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:?                   '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                   Constant: | ||||||
|  | 0:?                     0 (const int) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   2 (const int) | ||||||
|  | 0:?             move second child to first child ( temp float) | ||||||
|  | 0:?               direct index ( patch out float TessLevelInner) | ||||||
|  | 0:?                 '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   0 (const int) | ||||||
|  | 0:?               flInFactor: direct index for structure ( temp float) | ||||||
|  | 0:?                 '@patchConstantResult' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?                 Constant: | ||||||
|  | 0:?                   1 (const int) | ||||||
|  | 0:38  Function Definition: PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3]; ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:38    Function Parameters:  | ||||||
|  | 0:38      'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:38      'pcf_in' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:41      move second child to first child ( temp float) | ||||||
|  | 0:41        direct index ( temp float) | ||||||
|  | 0:41          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:41            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:41            Constant: | ||||||
|  | 0:41              0 (const int) | ||||||
|  | 0:41          Constant: | ||||||
|  | 0:41            0 (const int) | ||||||
|  | 0:41        direct index ( temp float) | ||||||
|  | 0:41          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:41            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:41              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:41              Constant: | ||||||
|  | 0:41                0 (const int) | ||||||
|  | 0:41            Constant: | ||||||
|  | 0:41              0 (const int) | ||||||
|  | 0:41          Constant: | ||||||
|  | 0:41            0 (const int) | ||||||
|  | 0:42      move second child to first child ( temp float) | ||||||
|  | 0:42        direct index ( temp float) | ||||||
|  | 0:42          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:42            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:42            Constant: | ||||||
|  | 0:42              0 (const int) | ||||||
|  | 0:42          Constant: | ||||||
|  | 0:42            1 (const int) | ||||||
|  | 0:42        direct index ( temp float) | ||||||
|  | 0:42          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:42            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:42              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:42              Constant: | ||||||
|  | 0:42                1 (const int) | ||||||
|  | 0:42            Constant: | ||||||
|  | 0:42              0 (const int) | ||||||
|  | 0:42          Constant: | ||||||
|  | 0:42            0 (const int) | ||||||
|  | 0:43      move second child to first child ( temp float) | ||||||
|  | 0:43        direct index ( temp float) | ||||||
|  | 0:43          tfactor: direct index for structure ( temp 3-element array of float) | ||||||
|  | 0:43            'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:43            Constant: | ||||||
|  | 0:43              0 (const int) | ||||||
|  | 0:43          Constant: | ||||||
|  | 0:43            2 (const int) | ||||||
|  | 0:43        direct index ( temp float) | ||||||
|  | 0:43          val: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:43            direct index ( temp structure{ temp 3-component vector of float val}) | ||||||
|  | 0:43              'pcf_out' ( const (read only) 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:43              Constant: | ||||||
|  | 0:43                2 (const int) | ||||||
|  | 0:43            Constant: | ||||||
|  | 0:43              0 (const int) | ||||||
|  | 0:43          Constant: | ||||||
|  | 0:43            0 (const int) | ||||||
|  | 0:44      move second child to first child ( temp float) | ||||||
|  | 0:44        flInFactor: direct index for structure ( temp float) | ||||||
|  | 0:44          'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:44          Constant: | ||||||
|  | 0:44            1 (const int) | ||||||
|  | 0:44        Constant: | ||||||
|  | 0:44          4.000000 | ||||||
|  | 0:46      Branch: Return with expression | ||||||
|  | 0:46        'o' ( temp structure{ temp 3-element array of float tfactor,  temp float flInFactor}) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     '@entryPointOutput' (layout( location=0) out 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     'i' (layout( location=0) in 3-element array of structure{ temp 3-component vector of float val}) | ||||||
|  | 0:?     'cpid' ( in uint InvocationID) | ||||||
|  | 0:?     '@patchConstantOutput' (layout( location=1) patch out structure{}) | ||||||
|  | 0:?     '@patchConstantOutput_tfactor' ( patch out 4-element array of float TessLevelOuter) | ||||||
|  | 0:?     '@patchConstantOutput_flInFactor' ( patch out 2-element array of float TessLevelInner) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 80001 | ||||||
|  | // Id's are bound by 129 | ||||||
|  | 
 | ||||||
|  |                               Capability Tessellation | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint TessellationControl 4  "main" 42 46 49 96 110 128 | ||||||
|  |                               ExecutionMode 4 OutputVertices 3 | ||||||
|  |                               ExecutionMode 4 Triangles | ||||||
|  |                               ExecutionMode 4 SpacingFractionalOdd | ||||||
|  |                               ExecutionMode 4 VertexOrderCw | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 8  "hs_in_t" | ||||||
|  |                               MemberName 8(hs_in_t) 0  "val" | ||||||
|  |                               Name 14  "hs_out_t" | ||||||
|  |                               MemberName 14(hs_out_t) 0  "val" | ||||||
|  |                               Name 18  "@main(struct-hs_in_t-vf31[3];u1;" | ||||||
|  |                               Name 16  "i" | ||||||
|  |                               Name 17  "cpid" | ||||||
|  |                               Name 22  "hs_pcf_t" | ||||||
|  |                               MemberName 22(hs_pcf_t) 0  "tfactor" | ||||||
|  |                               MemberName 22(hs_pcf_t) 1  "flInFactor" | ||||||
|  |                               Name 26  "PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];" | ||||||
|  |                               Name 24  "pcf_out" | ||||||
|  |                               Name 25  "pcf_in" | ||||||
|  |                               Name 31  "o" | ||||||
|  |                               Name 40  "i" | ||||||
|  |                               Name 42  "i" | ||||||
|  |                               Name 44  "cpid" | ||||||
|  |                               Name 46  "cpid" | ||||||
|  |                               Name 49  "@entryPointOutput" | ||||||
|  |                               Name 51  "param" | ||||||
|  |                               Name 53  "param" | ||||||
|  |                               Name 67  "pcf_out" | ||||||
|  |                               Name 68  "i" | ||||||
|  |                               Name 69  "param" | ||||||
|  |                               Name 71  "param" | ||||||
|  |                               Name 75  "i" | ||||||
|  |                               Name 76  "param" | ||||||
|  |                               Name 78  "param" | ||||||
|  |                               Name 82  "i" | ||||||
|  |                               Name 83  "param" | ||||||
|  |                               Name 85  "param" | ||||||
|  |                               Name 89  "@patchConstantResult" | ||||||
|  |                               Name 96  "@patchConstantOutput_tfactor" | ||||||
|  |                               Name 110  "@patchConstantOutput_flInFactor" | ||||||
|  |                               Name 114  "o" | ||||||
|  |                               Name 126  "hs_pcf_t" | ||||||
|  |                               Name 128  "@patchConstantOutput" | ||||||
|  |                               Decorate 42(i) Location 0 | ||||||
|  |                               Decorate 46(cpid) BuiltIn InvocationId | ||||||
|  |                               Decorate 49(@entryPointOutput) Location 0 | ||||||
|  |                               Decorate 96(@patchConstantOutput_tfactor) Patch | ||||||
|  |                               Decorate 96(@patchConstantOutput_tfactor) BuiltIn TessLevelOuter | ||||||
|  |                               Decorate 110(@patchConstantOutput_flInFactor) Patch | ||||||
|  |                               Decorate 110(@patchConstantOutput_flInFactor) BuiltIn TessLevelInner | ||||||
|  |                               Decorate 128(@patchConstantOutput) Patch | ||||||
|  |                               Decorate 128(@patchConstantOutput) Location 1 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeFloat 32 | ||||||
|  |                7:             TypeVector 6(float) 3 | ||||||
|  |       8(hs_in_t):             TypeStruct 7(fvec3) | ||||||
|  |                9:             TypeInt 32 0 | ||||||
|  |               10:      9(int) Constant 3 | ||||||
|  |               11:             TypeArray 8(hs_in_t) 10 | ||||||
|  |               12:             TypePointer Function 11 | ||||||
|  |               13:             TypePointer Function 9(int) | ||||||
|  |     14(hs_out_t):             TypeStruct 7(fvec3) | ||||||
|  |               15:             TypeFunction 14(hs_out_t) 12(ptr) 13(ptr) | ||||||
|  |               20:             TypeArray 14(hs_out_t) 10 | ||||||
|  |               21:             TypeArray 6(float) 10 | ||||||
|  |     22(hs_pcf_t):             TypeStruct 21 6(float) | ||||||
|  |               23:             TypeFunction 22(hs_pcf_t) 20 11 | ||||||
|  |               28:             TypeInt 32 1 | ||||||
|  |               29:     28(int) Constant 0 | ||||||
|  |               30:             TypePointer Function 14(hs_out_t) | ||||||
|  |               35:             TypePointer Function 7(fvec3) | ||||||
|  |               41:             TypePointer Input 11 | ||||||
|  |            42(i):     41(ptr) Variable Input | ||||||
|  |               45:             TypePointer Input 9(int) | ||||||
|  |         46(cpid):     45(ptr) Variable Input | ||||||
|  |               48:             TypePointer Output 20 | ||||||
|  | 49(@entryPointOutput):     48(ptr) Variable Output | ||||||
|  |               56:             TypePointer Output 14(hs_out_t) | ||||||
|  |               58:      9(int) Constant 2 | ||||||
|  |               59:      9(int) Constant 1 | ||||||
|  |               60:      9(int) Constant 0 | ||||||
|  |               62:             TypeBool | ||||||
|  |               66:             TypePointer Function 20 | ||||||
|  |               74:     28(int) Constant 1 | ||||||
|  |               81:     28(int) Constant 2 | ||||||
|  |               88:             TypePointer Function 22(hs_pcf_t) | ||||||
|  |               93:      9(int) Constant 4 | ||||||
|  |               94:             TypeArray 6(float) 93 | ||||||
|  |               95:             TypePointer Output 94 | ||||||
|  | 96(@patchConstantOutput_tfactor):     95(ptr) Variable Output | ||||||
|  |               97:             TypePointer Function 6(float) | ||||||
|  |              100:             TypePointer Output 6(float) | ||||||
|  |              108:             TypeArray 6(float) 58 | ||||||
|  |              109:             TypePointer Output 108 | ||||||
|  | 110(@patchConstantOutput_flInFactor):    109(ptr) Variable Output | ||||||
|  |              121:    6(float) Constant 1082130432 | ||||||
|  |    126(hs_pcf_t):             TypeStruct | ||||||
|  |              127:             TypePointer Output 126(hs_pcf_t) | ||||||
|  | 128(@patchConstantOutput):    127(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |            40(i):     12(ptr) Variable Function | ||||||
|  |         44(cpid):     13(ptr) Variable Function | ||||||
|  |        51(param):     12(ptr) Variable Function | ||||||
|  |        53(param):     13(ptr) Variable Function | ||||||
|  |      67(pcf_out):     66(ptr) Variable Function | ||||||
|  |            68(i):     12(ptr) Variable Function | ||||||
|  |        69(param):     12(ptr) Variable Function | ||||||
|  |        71(param):     13(ptr) Variable Function | ||||||
|  |            75(i):     12(ptr) Variable Function | ||||||
|  |        76(param):     12(ptr) Variable Function | ||||||
|  |        78(param):     13(ptr) Variable Function | ||||||
|  |            82(i):     12(ptr) Variable Function | ||||||
|  |        83(param):     12(ptr) Variable Function | ||||||
|  |        85(param):     13(ptr) Variable Function | ||||||
|  | 89(@patchConstantResult):     88(ptr) Variable Function | ||||||
|  |               43:          11 Load 42(i) | ||||||
|  |                               Store 40(i) 43 | ||||||
|  |               47:      9(int) Load 46(cpid) | ||||||
|  |                               Store 44(cpid) 47 | ||||||
|  |               50:      9(int) Load 46(cpid) | ||||||
|  |               52:          11 Load 40(i) | ||||||
|  |                               Store 51(param) 52 | ||||||
|  |               54:      9(int) Load 44(cpid) | ||||||
|  |                               Store 53(param) 54 | ||||||
|  |               55:14(hs_out_t) FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 51(param) 53(param) | ||||||
|  |               57:     56(ptr) AccessChain 49(@entryPointOutput) 50 | ||||||
|  |                               Store 57 55 | ||||||
|  |                               ControlBarrier 58 59 60 | ||||||
|  |               61:      9(int) Load 46(cpid) | ||||||
|  |               63:    62(bool) IEqual 61 29 | ||||||
|  |                               SelectionMerge 65 None | ||||||
|  |                               BranchConditional 63 64 65 | ||||||
|  |               64:               Label | ||||||
|  |               70:          11   Load 68(i) | ||||||
|  |                                 Store 69(param) 70 | ||||||
|  |                                 Store 71(param) 60 | ||||||
|  |               72:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 69(param) 71(param) | ||||||
|  |               73:     30(ptr)   AccessChain 67(pcf_out) 29 | ||||||
|  |                                 Store 73 72 | ||||||
|  |               77:          11   Load 75(i) | ||||||
|  |                                 Store 76(param) 77 | ||||||
|  |                                 Store 78(param) 59 | ||||||
|  |               79:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 76(param) 78(param) | ||||||
|  |               80:     30(ptr)   AccessChain 67(pcf_out) 74 | ||||||
|  |                                 Store 80 79 | ||||||
|  |               84:          11   Load 82(i) | ||||||
|  |                                 Store 83(param) 84 | ||||||
|  |                                 Store 85(param) 58 | ||||||
|  |               86:14(hs_out_t)   FunctionCall 18(@main(struct-hs_in_t-vf31[3];u1;) 83(param) 85(param) | ||||||
|  |               87:     30(ptr)   AccessChain 67(pcf_out) 81 | ||||||
|  |                                 Store 87 86 | ||||||
|  |               90:          20   Load 67(pcf_out) | ||||||
|  |               91:          11   Load 42(i) | ||||||
|  |               92:22(hs_pcf_t)   FunctionCall 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];) 90 91 | ||||||
|  |                                 Store 89(@patchConstantResult) 92 | ||||||
|  |               98:     97(ptr)   AccessChain 89(@patchConstantResult) 29 29 | ||||||
|  |               99:    6(float)   Load 98 | ||||||
|  |              101:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 29 | ||||||
|  |                                 Store 101 99 | ||||||
|  |              102:     97(ptr)   AccessChain 89(@patchConstantResult) 29 74 | ||||||
|  |              103:    6(float)   Load 102 | ||||||
|  |              104:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 74 | ||||||
|  |                                 Store 104 103 | ||||||
|  |              105:     97(ptr)   AccessChain 89(@patchConstantResult) 29 81 | ||||||
|  |              106:    6(float)   Load 105 | ||||||
|  |              107:    100(ptr)   AccessChain 96(@patchConstantOutput_tfactor) 81 | ||||||
|  |                                 Store 107 106 | ||||||
|  |              111:     97(ptr)   AccessChain 89(@patchConstantResult) 74 | ||||||
|  |              112:    6(float)   Load 111 | ||||||
|  |              113:    100(ptr)   AccessChain 110(@patchConstantOutput_flInFactor) 29 | ||||||
|  |                                 Store 113 112 | ||||||
|  |                                 Branch 65 | ||||||
|  |               65:             Label | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  | 18(@main(struct-hs_in_t-vf31[3];u1;):14(hs_out_t) Function None 15 | ||||||
|  |            16(i):     12(ptr) FunctionParameter | ||||||
|  |         17(cpid):     13(ptr) FunctionParameter | ||||||
|  |               19:             Label | ||||||
|  |            31(o):     30(ptr) Variable Function | ||||||
|  |               32:      9(int) Load 17(cpid) | ||||||
|  |               33:    6(float) ConvertUToF 32 | ||||||
|  |               34:    7(fvec3) CompositeConstruct 33 33 33 | ||||||
|  |               36:     35(ptr) AccessChain 31(o) 29 | ||||||
|  |                               Store 36 34 | ||||||
|  |               37:14(hs_out_t) Load 31(o) | ||||||
|  |                               ReturnValue 37 | ||||||
|  |                               FunctionEnd | ||||||
|  | 26(PCF(struct-hs_out_t-vf31[3];struct-hs_in_t-vf31[3];):22(hs_pcf_t) Function None 23 | ||||||
|  |      24(pcf_out):          20 FunctionParameter | ||||||
|  |       25(pcf_in):          11 FunctionParameter | ||||||
|  |               27:             Label | ||||||
|  |           114(o):     88(ptr) Variable Function | ||||||
|  |              115:    6(float) CompositeExtract 24(pcf_out) 0 0 0 | ||||||
|  |              116:     97(ptr) AccessChain 114(o) 29 29 | ||||||
|  |                               Store 116 115 | ||||||
|  |              117:    6(float) CompositeExtract 24(pcf_out) 1 0 0 | ||||||
|  |              118:     97(ptr) AccessChain 114(o) 29 74 | ||||||
|  |                               Store 118 117 | ||||||
|  |              119:    6(float) CompositeExtract 24(pcf_out) 2 0 0 | ||||||
|  |              120:     97(ptr) AccessChain 114(o) 29 81 | ||||||
|  |                               Store 120 119 | ||||||
|  |              122:     97(ptr) AccessChain 114(o) 74 | ||||||
|  |                               Store 122 121 | ||||||
|  |              123:22(hs_pcf_t) Load 114(o) | ||||||
|  |                               ReturnValue 123 | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										47
									
								
								Test/hlsl.hull.ctrlpt-2.tesc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Test/hlsl.hull.ctrlpt-2.tesc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | // ***  | ||||||
|  | // per-control-point invocation of PCF from entry point return value with | ||||||
|  | // both OutputPatch and InputPatch given to PCF. | ||||||
|  | // *** | ||||||
|  | 
 | ||||||
|  | struct hs_in_t | ||||||
|  | { | ||||||
|  |     float3 val : TEXCOORD0; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct hs_pcf_t | ||||||
|  | { | ||||||
|  |     float tfactor[3] : SV_TessFactor; // must turn into a size 4 array in SPIR-V | ||||||
|  |     float flInFactor : SV_InsideTessFactor; // must turn into a size 2 array in SPIR-V | ||||||
|  | };  | ||||||
|  | 
 | ||||||
|  | struct hs_out_t | ||||||
|  | { | ||||||
|  |     float3 val : TEXCOORD0;  | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | [ domain ("tri") ] | ||||||
|  | [ partitioning ("fractional_odd") ] | ||||||
|  | [ outputtopology ("triangle_cw") ] | ||||||
|  | [ outputcontrolpoints (3) ] | ||||||
|  | [ patchconstantfunc ( "PCF" ) ] | ||||||
|  | hs_out_t main (InputPatch <hs_in_t, 3> i , uint cpid : SV_OutputControlPointID) | ||||||
|  | { | ||||||
|  |     i[0].val; | ||||||
|  | 
 | ||||||
|  |     hs_out_t o; | ||||||
|  |     o.val = cpid; | ||||||
|  |     return o; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | hs_pcf_t PCF( const OutputPatch <hs_out_t, 3> pcf_out, | ||||||
|  |               const InputPatch <hs_in_t, 3> pcf_in) | ||||||
|  | { | ||||||
|  |     hs_pcf_t o; | ||||||
|  | 
 | ||||||
|  |     o.tfactor[0] = pcf_out[0].val.x; | ||||||
|  |     o.tfactor[1] = pcf_out[1].val.x; | ||||||
|  |     o.tfactor[2] = pcf_out[2].val.x; | ||||||
|  |     o.flInFactor = 4; | ||||||
|  | 
 | ||||||
|  |     return o; | ||||||
|  | } | ||||||
| @ -220,6 +220,8 @@ enum TBuiltInVariable { | |||||||
|     EbvFragDepthLesser, |     EbvFragDepthLesser, | ||||||
|     EbvStencilRef, |     EbvStencilRef, | ||||||
|     EbvGsOutputStream, |     EbvGsOutputStream, | ||||||
|  |     EbvOutputPatch, | ||||||
|  |     EbvInputPatch, | ||||||
| 
 | 
 | ||||||
|     EbvLast |     EbvLast | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -129,6 +129,7 @@ INSTANTIATE_TEST_CASE_P( | |||||||
|         {"hlsl.hull.2.tesc", "main"}, |         {"hlsl.hull.2.tesc", "main"}, | ||||||
|         {"hlsl.hull.void.tesc", "main"}, |         {"hlsl.hull.void.tesc", "main"}, | ||||||
|         {"hlsl.hull.ctrlpt-1.tesc", "main"}, |         {"hlsl.hull.ctrlpt-1.tesc", "main"}, | ||||||
|  |         {"hlsl.hull.ctrlpt-2.tesc", "main"}, | ||||||
|         {"hlsl.identifier.sample.frag", "main"}, |         {"hlsl.identifier.sample.frag", "main"}, | ||||||
|         {"hlsl.if.frag", "PixelShaderFunction"}, |         {"hlsl.if.frag", "PixelShaderFunction"}, | ||||||
|         {"hlsl.implicitBool.frag", "main"}, |         {"hlsl.implicitBool.frag", "main"}, | ||||||
|  | |||||||
| @ -963,14 +963,14 @@ bool HlslGrammar::acceptOutputPrimitiveGeometry(TLayoutGeometry& geometry) | |||||||
| //      : INPUTPATCH
 | //      : INPUTPATCH
 | ||||||
| //      | OUTPUTPATCH
 | //      | OUTPUTPATCH
 | ||||||
| //
 | //
 | ||||||
| bool HlslGrammar::acceptTessellationDeclType() | bool HlslGrammar::acceptTessellationDeclType(TBuiltInVariable& patchType) | ||||||
| { | { | ||||||
|     // read geometry type
 |     // read geometry type
 | ||||||
|     const EHlslTokenClass tessType = peek(); |     const EHlslTokenClass tessType = peek(); | ||||||
| 
 | 
 | ||||||
|     switch (tessType) { |     switch (tessType) { | ||||||
|     case EHTokInputPatch:    break; |     case EHTokInputPatch:    patchType = EbvInputPatch;  break; | ||||||
|     case EHTokOutputPatch:   break; |     case EHTokOutputPatch:   patchType = EbvOutputPatch; break; | ||||||
|     default: |     default: | ||||||
|         return false;  // not a tessellation decl
 |         return false;  // not a tessellation decl
 | ||||||
|     } |     } | ||||||
| @ -984,7 +984,9 @@ bool HlslGrammar::acceptTessellationDeclType() | |||||||
| //
 | //
 | ||||||
| bool HlslGrammar::acceptTessellationPatchTemplateType(TType& type) | bool HlslGrammar::acceptTessellationPatchTemplateType(TType& type) | ||||||
| { | { | ||||||
|     if (! acceptTessellationDeclType()) |     TBuiltInVariable patchType; | ||||||
|  | 
 | ||||||
|  |     if (! acceptTessellationDeclType(patchType)) | ||||||
|         return false; |         return false; | ||||||
|      |      | ||||||
|     if (! acceptTokenClass(EHTokLeftAngle)) |     if (! acceptTokenClass(EHTokLeftAngle)) | ||||||
| @ -1011,6 +1013,7 @@ bool HlslGrammar::acceptTessellationPatchTemplateType(TType& type) | |||||||
|     TArraySizes* arraySizes = new TArraySizes; |     TArraySizes* arraySizes = new TArraySizes; | ||||||
|     arraySizes->addInnerSize(size->getAsConstantUnion()->getConstArray()[0].getIConst()); |     arraySizes->addInnerSize(size->getAsConstantUnion()->getConstArray()[0].getIConst()); | ||||||
|     type.newArraySizes(*arraySizes); |     type.newArraySizes(*arraySizes); | ||||||
|  |     type.getQualifier().builtIn = patchType; | ||||||
| 
 | 
 | ||||||
|     if (! acceptTokenClass(EHTokRightAngle)) { |     if (! acceptTokenClass(EHTokRightAngle)) { | ||||||
|         expected("right angle bracket"); |         expected("right angle bracket"); | ||||||
|  | |||||||
| @ -79,7 +79,7 @@ namespace glslang { | |||||||
|         bool acceptTemplateVecMatBasicType(TBasicType&); |         bool acceptTemplateVecMatBasicType(TBasicType&); | ||||||
|         bool acceptVectorTemplateType(TType&); |         bool acceptVectorTemplateType(TType&); | ||||||
|         bool acceptMatrixTemplateType(TType&); |         bool acceptMatrixTemplateType(TType&); | ||||||
|         bool acceptTessellationDeclType(); |         bool acceptTessellationDeclType(TBuiltInVariable&); | ||||||
|         bool acceptTessellationPatchTemplateType(TType&); |         bool acceptTessellationPatchTemplateType(TType&); | ||||||
|         bool acceptStreamOutTemplateType(TType&, TLayoutGeometry&); |         bool acceptStreamOutTemplateType(TType&, TLayoutGeometry&); | ||||||
|         bool acceptOutputPrimitiveGeometry(TLayoutGeometry&); |         bool acceptOutputPrimitiveGeometry(TLayoutGeometry&); | ||||||
|  | |||||||
| @ -67,7 +67,8 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int | |||||||
|     sourceEntryPointName(sourceEntryPointName), |     sourceEntryPointName(sourceEntryPointName), | ||||||
|     entryPointFunction(nullptr), |     entryPointFunction(nullptr), | ||||||
|     entryPointFunctionBody(nullptr), |     entryPointFunctionBody(nullptr), | ||||||
|     gsStreamOutput(nullptr) |     gsStreamOutput(nullptr), | ||||||
|  |     inputPatch(nullptr) | ||||||
| { | { | ||||||
|     globalUniformDefaults.clear(); |     globalUniformDefaults.clear(); | ||||||
|     globalUniformDefaults.layoutMatrix = ElmRowMajor; |     globalUniformDefaults.layoutMatrix = ElmRowMajor; | ||||||
| @ -1377,6 +1378,7 @@ TIntermTyped* HlslParseContext::splitAccessStruct(const TSourceLoc& loc, TInterm | |||||||
| void HlslParseContext::trackLinkage(TSymbol& symbol) | void HlslParseContext::trackLinkage(TSymbol& symbol) | ||||||
| { | { | ||||||
|     TBuiltInVariable biType = symbol.getType().getQualifier().builtIn; |     TBuiltInVariable biType = symbol.getType().getQualifier().builtIn; | ||||||
|  | 
 | ||||||
|     if (biType != EbvNone) |     if (biType != EbvNone) | ||||||
|         builtInLinkageSymbols[biType] = symbol.clone(); |         builtInLinkageSymbols[biType] = symbol.clone(); | ||||||
| 
 | 
 | ||||||
| @ -1811,6 +1813,7 @@ TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunct | |||||||
|             else if (variable.getType().containsBuiltInInterstageIO(language)) |             else if (variable.getType().containsBuiltInInterstageIO(language)) | ||||||
|                 split(variable); |                 split(variable); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|         assignLocations(variable); |         assignLocations(variable); | ||||||
|     }; |     }; | ||||||
|     if (entryPointOutput) |     if (entryPointOutput) | ||||||
| @ -1988,6 +1991,7 @@ void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& return | |||||||
|             correctOutput(ioVariable->getWritableType().getQualifier()); |             correctOutput(ioVariable->getWritableType().getQualifier()); | ||||||
|         } |         } | ||||||
|         ioVariable->getWritableType().getQualifier().storage = storage; |         ioVariable->getWritableType().getQualifier().storage = storage; | ||||||
|  | 
 | ||||||
|         return ioVariable; |         return ioVariable; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| @ -2022,6 +2026,9 @@ void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& return | |||||||
|         if (paramType.getQualifier().isParamInput()) { |         if (paramType.getQualifier().isParamInput()) { | ||||||
|             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingIn); |             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingIn); | ||||||
|             inputs.push_back(argAsGlobal); |             inputs.push_back(argAsGlobal); | ||||||
|  | 
 | ||||||
|  |             if (function[i].declaredBuiltIn == EbvInputPatch) | ||||||
|  |                 inputPatch = argAsGlobal; | ||||||
|         } |         } | ||||||
|         if (paramType.getQualifier().isParamOutput()) { |         if (paramType.getQualifier().isParamOutput()) { | ||||||
|             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingOut); |             TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingOut); | ||||||
| @ -7574,7 +7581,10 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|     // Look for builtin variables in a function's parameter list.
 |     // Look for builtin variables in a function's parameter list.
 | ||||||
|     const auto findBuiltIns = [&](const TFunction& function, std::set<tInterstageIoData>& builtIns) { |     const auto findBuiltIns = [&](const TFunction& function, std::set<tInterstageIoData>& builtIns) { | ||||||
|         for (int p=0; p<function.getParamCount(); ++p) { |         for (int p=0; p<function.getParamCount(); ++p) { | ||||||
|             const TStorageQualifier storage = function[p].type->getQualifier().storage; |             TStorageQualifier storage = function[p].type->getQualifier().storage; | ||||||
|  | 
 | ||||||
|  |             if (storage == EvqConstReadOnly) // treated identically to input
 | ||||||
|  |                 storage = EvqIn; | ||||||
| 
 | 
 | ||||||
|             if (function[p].declaredBuiltIn != EbvNone) |             if (function[p].declaredBuiltIn != EbvNone) | ||||||
|                 builtIns.insert(HlslParseContext::tInterstageIoData(function[p].declaredBuiltIn, storage)); |                 builtIns.insert(HlslParseContext::tInterstageIoData(function[p].declaredBuiltIn, storage)); | ||||||
| @ -7605,9 +7615,11 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     const auto isPerCtrlPt = [this](const TType& type) { |     const auto isOutputPatch = [this](TFunction& patchConstantFunction, int param) { | ||||||
|         // TODO: this is not sufficient to reject all such cases in malformed shaders.
 |         const TType& type = *patchConstantFunction[param].type; | ||||||
|         return type.isArray() && !type.isRuntimeSizedArray(); |         const TBuiltInVariable biType = patchConstantFunction[param].declaredBuiltIn; | ||||||
|  | 
 | ||||||
|  |         return type.isArray() && !type.isRuntimeSizedArray() && biType == EbvOutputPatch; | ||||||
|     }; |     }; | ||||||
|      |      | ||||||
|     // We will perform these steps.  Each is in a scoped block for separation: they could
 |     // We will perform these steps.  Each is in a scoped block for separation: they could
 | ||||||
| @ -7636,7 +7648,7 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|     TIntermSymbol* invocationIdSym = findLinkageSymbol(EbvInvocationId); |     TIntermSymbol* invocationIdSym = findLinkageSymbol(EbvInvocationId); | ||||||
|     TIntermSequence& epBodySeq = entryPointFunctionBody->getAsAggregate()->getSequence(); |     TIntermSequence& epBodySeq = entryPointFunctionBody->getAsAggregate()->getSequence(); | ||||||
| 
 | 
 | ||||||
|     int perCtrlPtParam = -1; // -1 means there isn't one.
 |     int outPatchParam = -1; // -1 means there isn't one.
 | ||||||
| 
 | 
 | ||||||
|     // ================ Step 1A: Union Interfaces ================
 |     // ================ Step 1A: Union Interfaces ================
 | ||||||
|     // Our patch constant function.
 |     // Our patch constant function.
 | ||||||
| @ -7662,25 +7674,37 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|         // Now we'll add those to the entry and to the linkage.
 |         // Now we'll add those to the entry and to the linkage.
 | ||||||
|         for (int p=0; p<pcfParamCount; ++p) { |         for (int p=0; p<pcfParamCount; ++p) { | ||||||
|             const TBuiltInVariable biType   = patchConstantFunction[p].declaredBuiltIn; |             const TBuiltInVariable biType   = patchConstantFunction[p].declaredBuiltIn; | ||||||
|             const TStorageQualifier storage = patchConstantFunction[p].type->getQualifier().storage; |             TStorageQualifier storage = patchConstantFunction[p].type->getQualifier().storage; | ||||||
| 
 | 
 | ||||||
|             // Track whether there is any per control point input
 |             // Track whether there is an output patch param
 | ||||||
|             if (isPerCtrlPt(*patchConstantFunction[p].type)) { |             if (isOutputPatch(patchConstantFunction, p)) { | ||||||
|                 if (perCtrlPtParam >= 0) { |                 if (outPatchParam >= 0) { | ||||||
|                     // Presently we only support one per ctrl pt input. TODO: does HLSL even allow multiple?
 |                     // Presently we only support one per ctrl pt input.
 | ||||||
|                     error(loc, "unimplemented: multiple per control point inputs to patch constant function", "", ""); |                     error(loc, "unimplemented: multiple output patches in patch constant function", "", ""); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 perCtrlPtParam = p; |                 outPatchParam = p; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (biType != EbvNone) { |             if (biType != EbvNone) { | ||||||
|                 TType* paramType = patchConstantFunction[p].type->clone(); |                 TType* paramType = patchConstantFunction[p].type->clone(); | ||||||
|                 // Use the original declaration type for the linkage
 |  | ||||||
|                 paramType->getQualifier().builtIn = biType; |  | ||||||
| 
 | 
 | ||||||
|                 if (notInEntryPoint.count(tInterstageIoData(biType, storage)) == 1) |                 if (storage == EvqConstReadOnly) // treated identically to input
 | ||||||
|                     addToLinkage(*paramType, patchConstantFunction[p].name, nullptr); |                     storage = EvqIn; | ||||||
|  | 
 | ||||||
|  |                 // Presently, the only non-builtin we support is InputPatch, which is treated as
 | ||||||
|  |                 // a pseudo-builtin.
 | ||||||
|  |                 if (biType == EbvInputPatch) { | ||||||
|  |                     builtInLinkageSymbols[biType] = inputPatch; | ||||||
|  |                 } else if (biType == EbvOutputPatch) { | ||||||
|  |                     // Nothing...
 | ||||||
|  |                 } else { | ||||||
|  |                     // Use the original declaration type for the linkage
 | ||||||
|  |                     paramType->getQualifier().builtIn = biType; | ||||||
|  | 
 | ||||||
|  |                     if (notInEntryPoint.count(tInterstageIoData(biType, storage)) == 1) | ||||||
|  |                         addToLinkage(*paramType, patchConstantFunction[p].name, nullptr); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -7703,18 +7727,12 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|     // TODO: handle struct or array inputs
 |     // TODO: handle struct or array inputs
 | ||||||
|     { |     { | ||||||
|         for (int p=0; p<pcfParamCount; ++p) { |         for (int p=0; p<pcfParamCount; ++p) { | ||||||
|             if ((patchConstantFunction[p].type->isArray() && !isPerCtrlPt(*patchConstantFunction[p].type)) || |  | ||||||
|                 (!patchConstantFunction[p].type->isArray() && patchConstantFunction[p].type->isStruct())) { |  | ||||||
|                 error(loc, "unimplemented array or variable in patch constant function signature", "", ""); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|          |  | ||||||
|             TIntermSymbol* inputArg = nullptr; |             TIntermSymbol* inputArg = nullptr; | ||||||
| 
 | 
 | ||||||
|             if (p == perCtrlPtParam) { |             if (p == outPatchParam) { | ||||||
|                 if (perCtrlPtVar == nullptr) { |                 if (perCtrlPtVar == nullptr) { | ||||||
|                     perCtrlPtVar = makeInternalVariable(*patchConstantFunction[perCtrlPtParam].name, |                     perCtrlPtVar = makeInternalVariable(*patchConstantFunction[outPatchParam].name, | ||||||
|                                                         *patchConstantFunction[perCtrlPtParam].type); |                                                         *patchConstantFunction[outPatchParam].type); | ||||||
| 
 | 
 | ||||||
|                     perCtrlPtVar->getWritableType().getQualifier().makeTemporary(); |                     perCtrlPtVar->getWritableType().getQualifier().makeTemporary(); | ||||||
|                 } |                 } | ||||||
| @ -7724,7 +7742,7 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|                 const TBuiltInVariable biType = patchConstantFunction[p].declaredBuiltIn; |                 const TBuiltInVariable biType = patchConstantFunction[p].declaredBuiltIn; | ||||||
|                  |                  | ||||||
|                 inputArg = findLinkageSymbol(biType); |                 inputArg = findLinkageSymbol(biType); | ||||||
|          | 
 | ||||||
|                 if (inputArg == nullptr) { |                 if (inputArg == nullptr) { | ||||||
|                     error(loc, "unable to find patch constant function builtin variable", "", ""); |                     error(loc, "unable to find patch constant function builtin variable", "", ""); | ||||||
|                     return; |                     return; | ||||||
| @ -7769,9 +7787,9 @@ void HlslParseContext::addPatchConstantInvocation() | |||||||
|     // invocations of the entry point to build up an array, or (TODO:) use a yet
 |     // invocations of the entry point to build up an array, or (TODO:) use a yet
 | ||||||
|     // unavailable extension to look across the SIMD lanes.  This is the former
 |     // unavailable extension to look across the SIMD lanes.  This is the former
 | ||||||
|     // as a placeholder for the latter.
 |     // as a placeholder for the latter.
 | ||||||
|     if (perCtrlPtParam >= 0) { |     if (outPatchParam >= 0) { | ||||||
|         // We must introduce a local temp variable of the type wanted by the PCF input.
 |         // We must introduce a local temp variable of the type wanted by the PCF input.
 | ||||||
|         const int arraySize = patchConstantFunction[perCtrlPtParam].type->getOuterArraySize(); |         const int arraySize = patchConstantFunction[outPatchParam].type->getOuterArraySize(); | ||||||
| 
 | 
 | ||||||
|         if (entryPointFunction->getType().getBasicType() == EbtVoid) { |         if (entryPointFunction->getType().getBasicType() == EbtVoid) { | ||||||
|             error(loc, "entry point must return a value for use with patch constant function", "", ""); |             error(loc, "entry point must return a value for use with patch constant function", "", ""); | ||||||
|  | |||||||
| @ -386,6 +386,7 @@ protected: | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     TMap<tInterstageIoData, TVariable*> interstageBuiltInIo; // individual builtin interstage IO vars, indexed by builtin type.
 |     TMap<tInterstageIoData, TVariable*> interstageBuiltInIo; // individual builtin interstage IO vars, indexed by builtin type.
 | ||||||
|  |     TVariable* inputPatch; | ||||||
| 
 | 
 | ||||||
|     // We have to move array references to structs containing builtin interstage IO to the split variables.
 |     // We have to move array references to structs containing builtin interstage IO to the split variables.
 | ||||||
|     // This is only handled for one level.  This stores the index, because we'll need it in the future, since
 |     // This is only handled for one level.  This stores the index, because we'll need it in the future, since
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Kessenich
						John Kessenich