// *** // 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 i , uint cpid : SV_OutputControlPointID) { hs_out_t o; o.val = cpid; return o; } hs_pcf_t PCF( const OutputPatch 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; }