spirv.interface.hs.hlsl 17 KB

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