1// ***
2// per-control-point invocation of PCF from entry point return value with
3// both OutputPatch and InputPatch given to PCF.
4// ***
5
6struct hs_in_t
7{
8    float3 val : TEXCOORD0;
9};
10
11struct hs_pcf_t
12{
13    float tfactor[3] : SV_TessFactor; // must turn into a size 4 array in SPIR-V
14    float flInFactor : SV_InsideTessFactor; // must turn into a size 2 array in SPIR-V
15};
16
17struct hs_out_t
18{
19    float3 val : TEXCOORD0;
20};
21
22[ domain ("tri") ]
23[ partitioning ("fractional_odd") ]
24[ outputtopology ("triangle_cw") ]
25[ outputcontrolpoints (3) ]
26[ patchconstantfunc ( "PCF" ) ]
27hs_out_t main (InputPatch <hs_in_t, 3> i , uint cpid : SV_OutputControlPointID)
28{
29    i[0].val;
30
31    hs_out_t o;
32    o.val = cpid;
33    return o;
34}
35
36hs_pcf_t PCF( const OutputPatch <hs_out_t, 3> pcf_out,
37              const InputPatch <hs_in_t, 3> pcf_in)
38{
39    hs_pcf_t o;
40
41    o.tfactor[0] = pcf_out[0].val.x;
42    o.tfactor[1] = pcf_out[1].val.x;
43    o.tfactor[2] = pcf_out[2].val.x;
44    o.flInFactor = 4;
45
46    return o;
47}
48