spirv.interface.hs.hlsl 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. // Run: %dxc -T hs_6_0 -E main
  2. #define NumOutPoints 2
  3. // CHECK: OpCapability ClipDistance
  4. // CHECK: OpCapability CullDistance
  5. // CHECK: OpCapability Tessellation
  6. // Input control point
  7. struct HsCpIn
  8. {
  9. float4 pos : SV_Position; // Builtin Position
  10. float2 clip0 : SV_ClipDistance0; // Builtin ClipDistance
  11. float cull5 : SV_CullDistance5; // Builtin CullDistance
  12. float1 clip2 : SV_ClipDistance2; // Builtin ClipDistance
  13. float3 cull3 : SV_CullDistance3; // Builtin CullDistance
  14. float3 baz : BAZ; // Input variable
  15. [[vk::builtin("PointSize")]]
  16. float ptSize : PSIZE; // Builtin PointSize
  17. };
  18. struct CpInner2 {
  19. float1 clip8 : SV_ClipDistance8; // Builtin ClipDistance
  20. float2 cull6 : SV_CullDistance6; // Builtin CullDistance
  21. float3 foo : FOO; // Output variable
  22. [[vk::builtin("PointSize")]]
  23. float ptSize : PSIZE; // Builtin PointSize
  24. };
  25. struct CpInner1 {
  26. float4 pos : SV_Position; // Builtin Position
  27. CpInner2 s;
  28. float clip6 : SV_ClipDistance6; // Builtin ClipDistance
  29. float4 bar : BAR; // Output variable
  30. };
  31. // Output control point
  32. struct HsCpOut
  33. {
  34. float3 cull9 : SV_CullDistance9; // Builtin CullDistance
  35. CpInner1 s;
  36. float1 clip7 : SV_ClipDistance7; // Builtin ClipDistance
  37. };
  38. // Output patch constant data.
  39. struct HsPcfOut
  40. {
  41. float tessOuter[4] : SV_TessFactor;
  42. float tessInner[2] : SV_InsideTessFactor;
  43. float2 texCoord[4] : TEXCOORD;
  44. float4 weight : WEIGHT;
  45. };
  46. // Per-vertex input builtin : gl_PerVertex (Position, ClipDistance, CullDistance), InvocationID
  47. // Per-vertex output builtin : gl_PerVertex (Position, ClipDistance, CullDistance)
  48. // Per-vertex input variable: BAZ
  49. // Per-vertex output variable: FOO, BAR
  50. // Per-primitive input builtin : PrimitiveID
  51. // Per-primitive output builtin : TessLevelInner, TessLevelOuter
  52. // Per-primitive output variable: TEXCOORD, WEIGHT
  53. // CHECK: OpEntryPoint TessellationControl %main "main" %gl_PerVertexIn %gl_PerVertexOut %in_var_BAZ %gl_InvocationID %gl_PrimitiveID %out_var_FOO %out_var_BAR %gl_TessLevelOuter %gl_TessLevelInner %out_var_TEXCOORD %out_var_WEIGHT
  54. // CHECK: OpMemberDecorate %type_gl_PerVertex 0 BuiltIn Position
  55. // CHECK: OpMemberDecorate %type_gl_PerVertex 1 BuiltIn PointSize
  56. // CHECK: OpMemberDecorate %type_gl_PerVertex 2 BuiltIn ClipDistance
  57. // CHECK: OpMemberDecorate %type_gl_PerVertex 3 BuiltIn CullDistance
  58. // CHECK: OpDecorate %type_gl_PerVertex Block
  59. // CHECK: OpMemberDecorate %type_gl_PerVertex_0 0 BuiltIn Position
  60. // CHECK: OpMemberDecorate %type_gl_PerVertex_0 1 BuiltIn PointSize
  61. // CHECK: OpMemberDecorate %type_gl_PerVertex_0 2 BuiltIn ClipDistance
  62. // CHECK: OpMemberDecorate %type_gl_PerVertex_0 3 BuiltIn CullDistance
  63. // CHECK: OpDecorate %type_gl_PerVertex_0 Block
  64. // CHECK: OpDecorate %gl_InvocationID BuiltIn InvocationId
  65. // CHECK: OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  66. // CHECK: OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
  67. // CHECK: OpDecorate %gl_TessLevelOuter Patch
  68. // CHECK: OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
  69. // CHECK: OpDecorate %gl_TessLevelInner Patch
  70. // CHECK: OpDecorate %out_var_TEXCOORD Patch
  71. // CHECK: OpDecorate %out_var_WEIGHT Patch
  72. // CHECK: OpDecorate %in_var_BAZ Location 0
  73. // CHECK: OpDecorate %out_var_BAR Location 0
  74. // CHECK: OpDecorate %out_var_FOO Location 1
  75. // CHECK: OpDecorate %out_var_TEXCOORD Location 2
  76. // CHECK: OpDecorate %out_var_WEIGHT Location 3
  77. // Input : clip0 + clip2 : 3 floats
  78. // Input : cull3 + cull5 : 4 floats
  79. // CHECK: %type_gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_3 %_arr_float_uint_4
  80. // Output: clip6 + clip7 + clip8 : 3 floats
  81. // Output: cull6 + cull9 : 5 floats
  82. // CHECK: %type_gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_3 %_arr_float_uint_5
  83. // CHECK: %gl_PerVertexIn = OpVariable %_ptr_Input__arr_type_gl_PerVertex_uint_2 Input
  84. // CHECK: %gl_PerVertexOut = OpVariable %_ptr_Output__arr_type_gl_PerVertex_0_uint_2 Output
  85. // CHECK: %in_var_BAZ = OpVariable %_ptr_Input__arr_v3float_uint_2 Input
  86. // CHECK: %gl_InvocationID = OpVariable %_ptr_Input_uint Input
  87. // CHECK: %gl_PrimitiveID = OpVariable %_ptr_Input_uint Input
  88. // CHECK: %out_var_FOO = OpVariable %_ptr_Output__arr_v3float_uint_2 Output
  89. // CHECK: %out_var_BAR = OpVariable %_ptr_Output__arr_v4float_uint_2 Output
  90. // CHECK: %gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
  91. // CHECK: %gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
  92. // CHECK: %out_var_TEXCOORD = OpVariable %_ptr_Output__arr_v2float_uint_4 Output
  93. // CHECK: %out_var_WEIGHT = OpVariable %_ptr_Output_v4float Output
  94. // Patch Constant Function
  95. HsPcfOut pcf(InputPatch<HsCpIn, NumOutPoints> patch, uint patchId : SV_PrimitiveID) {
  96. HsPcfOut output;
  97. output = (HsPcfOut)0;
  98. return output;
  99. }
  100. // Layout of input ClipDistance array:
  101. // clip0: 2 floats, offset 0
  102. // clip2: 1 floats, offset 2
  103. // Layout of input CullDistance array:
  104. // cull3: 3 floats, offset 0
  105. // cull5: 1 floats, offset 3
  106. // Layout of output ClipDistance array:
  107. // clip6: 1 floats, offset 0
  108. // clip7: 1 floats, offset 1
  109. // clip8: 1 floats, offset 2
  110. // Layout of output CullDistance array:
  111. // cull6: 2 floats, offset 0
  112. // cull9: 3 floats, offset 2
  113. [domain("quad")]
  114. [partitioning("fractional_odd")]
  115. [outputtopology("triangle_ccw")]
  116. [outputcontrolpoints(NumOutPoints)]
  117. [patchconstantfunc("pcf")]
  118. HsCpOut main(InputPatch<HsCpIn, NumOutPoints> patch, uint cpId : SV_OutputControlPointID, uint patchId : SV_PrimitiveID) {
  119. HsCpOut output;
  120. output = (HsCpOut)0;
  121. return output;
  122. // Read gl_PerVertex[].gl_Postion and compose a new array for HsCpIn::pos
  123. // CHECK: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_v4float %gl_PerVertexIn %uint_0 %uint_0
  124. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %v4float [[ptr0]]
  125. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_v4float %gl_PerVertexIn %uint_1 %uint_0
  126. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %v4float [[ptr1]]
  127. // CHECK-NEXT: [[inPosArr:%\d+]] = OpCompositeConstruct %_arr_v4float_uint_2 [[val0]] [[val1]]
  128. // Read gl_PerVertex[].gl_ClipDistance[] to compose a new array for HsCpIn::clip0
  129. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_0
  130. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  131. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_1
  132. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  133. // CHECK-NEXT: [[clip00:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  134. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_0
  135. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  136. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_1
  137. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  138. // CHECK-NEXT: [[clip01:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  139. // CHECK-NEXT: [[inClip0Arr:%\d+]] = OpCompositeConstruct %_arr_v2float_uint_2 [[clip00]] [[clip01]]
  140. // Read gl_PerVertex[].gl_CullDistance[] to compose a new array for HsCpIn::cull5
  141. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_3 %uint_3
  142. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  143. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_3 %uint_3
  144. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  145. // CHECK-NEXT: [[inCull5Arr:%\d+]] = OpCompositeConstruct %_arr_float_uint_2 [[val0]] [[val1]]
  146. // Read gl_PerVertex[].gl_ClipDistance[] to compose a new array for HsCpIn::clip2
  147. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_2
  148. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  149. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_2
  150. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  151. // CHECK-NEXT: [[inClip2Arr:%\d+]] = OpCompositeConstruct %_arr_float_uint_2 [[val0]] [[val1]]
  152. // Read gl_PerVertex[].gl_CullDistance[] to compose a new array for HsCpIn::cull3
  153. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_3 %uint_0
  154. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  155. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_3 %uint_1
  156. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  157. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_3 %uint_2
  158. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %float [[ptr2]]
  159. // CHECK-NEXT: [[cull30:%\d+]] = OpCompositeConstruct %v3float [[val0]] [[val1]] [[val2]]
  160. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_3 %uint_0
  161. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  162. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_3 %uint_1
  163. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  164. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_3 %uint_2
  165. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %float [[ptr2]]
  166. // CHECK-NEXT: [[cull31:%\d+]] = OpCompositeConstruct %v3float [[val0]] [[val1]] [[val2]]
  167. // CHECK-NEXT: [[inCull3Arr:%\d+]] = OpCompositeConstruct %_arr_v3float_uint_2 [[cull30]] [[cull31]]
  168. // CHECK-NEXT: [[inBazArr:%\d+]] = OpLoad %_arr_v3float_uint_2 %in_var_BAZ
  169. // Read gl_PerVertex[].gl_PointSize[] to compose a new array for HsCpIn::ptSize
  170. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_1
  171. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  172. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_1
  173. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  174. // CHECK-NEXT: [[inPtSzArr:%\d+]] = OpCompositeConstruct %_arr_float_uint_2 [[val0]] [[val1]]
  175. // Compose a temporary HsCpIn value out of the temporary arrays constructed before
  176. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %v4float [[inPosArr]] 0
  177. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %v2float [[inClip0Arr]] 0
  178. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeExtract %float [[inCull5Arr]] 0
  179. // CHECK-NEXT: [[val3:%\d+]] = OpCompositeExtract %float [[inClip2Arr]] 0
  180. // CHECK-NEXT: [[val4:%\d+]] = OpCompositeExtract %v3float [[inCull3Arr]] 0
  181. // CHECK-NEXT: [[val5:%\d+]] = OpCompositeExtract %v3float [[inBazArr]] 0
  182. // CHECK-NEXT: [[val6:%\d+]] = OpCompositeExtract %float [[inPtSzArr]] 0
  183. // CHECK-NEXT: [[hscpin0:%\d+]] = OpCompositeConstruct %HsCpIn [[val0]] [[val1]] [[val2]] [[val3]] [[val4]] [[val5]] [[val6]]
  184. // Compose a temporary HsCpIn value out of the temporary arrays constructed before
  185. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %v4float [[inPosArr]] 1
  186. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %v2float [[inClip0Arr]] 1
  187. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeExtract %float [[inCull5Arr]] 1
  188. // CHECK-NEXT: [[val3:%\d+]] = OpCompositeExtract %float [[inClip2Arr]] 1
  189. // CHECK-NEXT: [[val4:%\d+]] = OpCompositeExtract %v3float [[inCull3Arr]] 1
  190. // CHECK-NEXT: [[val5:%\d+]] = OpCompositeExtract %v3float [[inBazArr]] 1
  191. // CHECK-NEXT: [[val6:%\d+]] = OpCompositeExtract %float [[inPtSzArr]] 1
  192. // CHECK-NEXT: [[hscpin1:%\d+]] = OpCompositeConstruct %HsCpIn [[val0]] [[val1]] [[val2]] [[val3]] [[val4]] [[val5]] [[val6]]
  193. // Populate the temporary variables for function call
  194. // CHECK-NEXT: [[patch:%\d+]] = OpCompositeConstruct %_arr_HsCpIn_uint_2 [[hscpin0]] [[hscpin1]]
  195. // CHECK-NEXT: OpStore %param_var_patch [[patch]]
  196. // CHECK-NEXT: [[invoId:%\d+]] = OpLoad %uint %gl_InvocationID
  197. // CHECK-NEXT: OpStore %param_var_cpId [[invoId]]
  198. // CHECK-NEXT: [[primId:%\d+]] = OpLoad %uint %gl_PrimitiveID
  199. // CHECK-NEXT: OpStore %param_var_patchId [[primId]]
  200. // CHECK-NEXT: [[ret:%\d+]] = OpFunctionCall %HsCpOut %src_main %param_var_patch %param_var_cpId %param_var_patchId
  201. // Write out HsCpOut::cull9 into gl_PerVertex[].gl_CullDistance[]
  202. // CHECK-NEXT: [[cull9:%\d+]] = OpCompositeExtract %v3float [[ret]] 0
  203. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_3 %uint_2
  204. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %float [[cull9]] 0
  205. // CHECK-NEXT: OpStore [[ptr0]] [[val0]]
  206. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_3 %uint_3
  207. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %float [[cull9]] 1
  208. // CHECK-NEXT: OpStore [[ptr1]] [[val1]]
  209. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_3 %uint_4
  210. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeExtract %float [[cull9]] 2
  211. // CHECK-NEXT: OpStore [[ptr2]] [[val2]]
  212. // CHECK-NEXT: [[outInner1:%\d+]] = OpCompositeExtract %CpInner1 [[ret]] 1
  213. // Write out HsCpOut::CpInner1::pos to gl_PerVertex[].gl_Position
  214. // CHECK-NEXT: [[outPos:%\d+]] = OpCompositeExtract %v4float [[outInner1]] 0
  215. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_v4float %gl_PerVertexOut [[invoId]] %uint_0
  216. // CHECK-NEXT: OpStore [[ptr]] [[outPos:%\d+]]
  217. // Write out HsCpOut::CpInner1::CpInner2::clip8 to gl_PerVertex[].gl_ClipDistance
  218. // CHECK-NEXT: [[outInner2:%\d+]] = OpCompositeExtract %CpInner2 [[outInner1]] 1
  219. // CHECK-NEXT: [[outClip8:%\d+]] = OpCompositeExtract %float [[outInner2]] 0
  220. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_2 %uint_2
  221. // CHECK-NEXT: OpStore [[ptr]] [[outClip8]]
  222. // Write out HsCpOut::CpInner1::CpInner2::cull6 to gl_PerVertex[].gl_CullDistance
  223. // CHECK-NEXT: [[outCull6:%\d+]] = OpCompositeExtract %v2float [[outInner2]] 1
  224. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_3 %uint_0
  225. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %float [[outCull6]] 0
  226. // CHECK-NEXT: OpStore [[ptr0]] [[val0]]
  227. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_3 %uint_1
  228. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %float [[outCull6]] 1
  229. // CHECK-NEXT: OpStore [[ptr1]] [[val1]]
  230. // Write out HsCpOut::CpInner1::CpInner2::foo to out_var_FOO
  231. // CHECK-NEXT: [[foo:%\d+]] = OpCompositeExtract %v3float [[outInner2]] 2
  232. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_v3float %out_var_FOO [[invoId]]
  233. // CHECK-NEXT: OpStore [[ptr]] [[foo]]
  234. // Write out HsCpOut::CpInner1::CpInner2::PointSize to gl_PerVertex[].gl_PointSize
  235. // CHECK-NEXT: [[ptSize:%\d+]] = OpCompositeExtract %float [[outInner2]] 3
  236. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_1
  237. // CHECK-NEXT: OpStore [[ptr]] [[ptSize]]
  238. // Write out HsCpOut::CpInner1::clip6 to gl_PerVertex[].gl_ClipDistance
  239. // CHECK-NEXT: [[clip6:%\d+]] = OpCompositeExtract %float [[outInner1]] 2
  240. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_2 %uint_0
  241. // CHECK-NEXT: OpStore [[ptr]] [[clip6]]
  242. // Write out HsCpOut::CpInner1::bar to out_var_BAR
  243. // CHECK-NEXT: [[bar:%\d+]] = OpCompositeExtract %v4float [[outInner1]] 3
  244. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_v4float %out_var_BAR [[invoId]]
  245. // CHECK-NEXT: OpStore [[ptr]] [[bar]]
  246. // Write out HsCpOut::clip7 to gl_PerVertex[].gl_ClipDistance
  247. // CHECK-NEXT: [[clip7:%\d+]] = OpCompositeExtract %float [[ret]] 2
  248. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut [[invoId]] %uint_2 %uint_1
  249. // CHECK-NEXT: OpStore [[ptr]] [[clip7]]
  250. // Call PCF
  251. // CHECK: [[ret:%\d+]] = OpFunctionCall %HsPcfOut %pcf %param_var_patch %param_var_patchId
  252. // Write out PCF output
  253. // CHECK-NEXT: [[tlo:%\d+]] = OpCompositeExtract %_arr_float_uint_4 [[ret]] 0
  254. // CHECK-NEXT: OpStore %gl_TessLevelOuter [[tlo]]
  255. // CHECK-NEXT: [[tli:%\d+]] = OpCompositeExtract %_arr_float_uint_2 [[ret]] 1
  256. // CHECK-NEXT: OpStore %gl_TessLevelInner [[tli]]
  257. // CHECK-NEXT: [[texcord:%\d+]] = OpCompositeExtract %_arr_v2float_uint_4 [[ret]] 2
  258. // CHECK-NEXT: OpStore %out_var_TEXCOORD [[texcord]]
  259. // CHECK-NEXT: [[weight:%\d+]] = OpCompositeExtract %v4float [[ret]] 3
  260. // CHECK-NEXT: OpStore %out_var_WEIGHT [[weight]]
  261. }