 194f0f39ec
			
		
	
	
		194f0f39ec
		
	
	
	
	
		
			
			SPIR-V requires that tessellation factor arrays be size 4 (outer) or 2 (inner). HLSL allows other sizes such as 3, or even scalars. This commit converts between them by forcing the IO types to be the SPIR-V size, and allowing copies between the internal and IO types to handle these cases.
		
			
				
	
	
		
			44 lines
		
	
	
		
			883 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			883 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| // *** 
 | |
| // per-control-point invocation of PCF from entry point return value
 | |
| // ***
 | |
| 
 | |
| 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)
 | |
| {
 | |
|     hs_out_t o;
 | |
|     o.val = cpid;
 | |
|     return o;
 | |
| }
 | |
| 
 | |
| hs_pcf_t PCF( const OutputPatch <hs_out_t, 3> pcf_out)
 | |
| {
 | |
|     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;
 | |
| }
 |