spirv.interface.gs.hlsl 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Run: %dxc -T gs_6_0 -E main
  2. // CHECK: OpCapability ClipDistance
  3. // CHECK: OpCapability CullDistance
  4. // CHECK: OpCapability Geometry
  5. struct GsPerVertexIn {
  6. float4 pos : SV_Position; // Builtin Position
  7. float3 clip2 : SV_ClipDistance2; // Builtin ClipDistance
  8. float2 clip0 : SV_ClipDistance0; // Builtin ClipDistance
  9. float3 foo : FOO; // Input variable
  10. [[vk::builtin("PointSize")]]
  11. float ptSize : PSIZE; // Builtin PointSize
  12. };
  13. struct GsInnerOut {
  14. float4 pos : SV_Position; // Builtion Position
  15. float2 foo : FOO; // Output variable
  16. float2 cull3 : SV_CullDistance3; // Builtin CullDistance
  17. [[vk::builtin("PointSize")]]
  18. float ptSize : PSIZE; // Builtin PointSize
  19. };
  20. struct GsPerVertexOut {
  21. GsInnerOut s;
  22. float cull2 : SV_CullDistance2; // Builtin CullDistance
  23. float4 clip : SV_ClipDistance; // Builtin ClipDistance
  24. float4 bar : BAR; // Output variable
  25. };
  26. // Input builtin : gl_PerVertex (Position, ClipDistance)
  27. // Output builtin : Position, ClipDistance, CullDistance
  28. // Input variable: FOO, BAR
  29. // Output variable: FOO, BAR
  30. // CHECK: OpEntryPoint Geometry %main "main" %gl_PerVertexIn %gl_ClipDistance %gl_CullDistance %in_var_BAR %in_var_FOO %gl_Position %out_var_FOO %gl_PointSize %out_var_BAR
  31. // CHECK: OpMemberDecorate %type_gl_PerVertex 0 BuiltIn Position
  32. // CHECK: OpMemberDecorate %type_gl_PerVertex 1 BuiltIn PointSize
  33. // CHECK: OpMemberDecorate %type_gl_PerVertex 2 BuiltIn ClipDistance
  34. // CHECK: OpMemberDecorate %type_gl_PerVertex 3 BuiltIn CullDistance
  35. // CHECK: OpDecorate %type_gl_PerVertex Block
  36. // CHECK: OpDecorate %gl_ClipDistance BuiltIn ClipDistance
  37. // CHECK: OpDecorate %gl_CullDistance BuiltIn CullDistance
  38. // CHECK: OpDecorate %gl_Position BuiltIn Position
  39. // CHECK: OpDecorate %gl_PointSize BuiltIn PointSize
  40. // CHECK: OpDecorate %in_var_BAR Location 0
  41. // CHECK: OpDecorate %in_var_FOO Location 1
  42. // CHECK: OpDecorate %out_var_FOO Location 0
  43. // CHECK: OpDecorate %out_var_BAR Location 1
  44. // Input : clip0 + clip2 : 5 floats
  45. // Input : no cull : 1 floats (default)
  46. // CHECK: %type_gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_5 %_arr_float_uint_1
  47. // CHECK: %gl_PerVertexIn = OpVariable %_ptr_Input__arr_type_gl_PerVertex_uint_2 Input
  48. // Input : clip : 4 floats
  49. // Input : cull2 + cull3 : 3 floats (default)
  50. // CHECK: %gl_ClipDistance = OpVariable %_ptr_Output__arr_float_uint_4 Output
  51. // CHECK: %gl_CullDistance = OpVariable %_ptr_Output__arr_float_uint_3 Output
  52. // CHECK: %in_var_BAR = OpVariable %_ptr_Input__arr_v2float_uint_2 Input
  53. // CHECK: %in_var_FOO = OpVariable %_ptr_Input__arr_v3float_uint_2 Input
  54. // CHECK: %gl_Position = OpVariable %_ptr_Output_v4float Output
  55. // CHECK: %out_var_FOO = OpVariable %_ptr_Output_v2float Output
  56. // CHECK: %gl_PointSize = OpVariable %_ptr_Output_float Output
  57. // CHECK: %out_var_BAR = OpVariable %_ptr_Output_v4float Output
  58. [maxvertexcount(2)]
  59. void main(in line float2 bar [2] : BAR,
  60. in line GsPerVertexIn inData[2],
  61. inout LineStream<GsPerVertexOut> outData)
  62. {
  63. // Layout of input ClipDistance array:
  64. // clip0: 2 floats, offset 0
  65. // clip2: 3 floats, offset 2
  66. // Layout of output ClipDistance array:
  67. // clip : 4 floats, offset 0
  68. // Layout of output CullDistance array:
  69. // cull2: 1 floats, offset 0
  70. // cull3: 2 floats, offset 1
  71. GsPerVertexOut vertex;
  72. vertex = (GsPerVertexOut)0;
  73. outData.Append(vertex);
  74. outData.RestartStrip();
  75. // CHECK: [[bar:%\d+]] = OpLoad %_arr_v2float_uint_2 %in_var_BAR
  76. // CHECK-NEXT: OpStore %param_var_bar [[bar]]
  77. // Compose an array for GsPerVertexIn::pos
  78. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_v4float %gl_PerVertexIn %uint_0 %uint_0
  79. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %v4float [[ptr0]]
  80. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_v4float %gl_PerVertexIn %uint_1 %uint_0
  81. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %v4float [[ptr1]]
  82. // CHECK-NEXT: [[inPosArr:%\d+]] = OpCompositeConstruct %_arr_v4float_uint_2 [[val0]] [[val1]]
  83. // Compose an array for GsPerVertexIn::clip2
  84. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_2
  85. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  86. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_3
  87. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  88. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_4
  89. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %float [[ptr2]]
  90. // CHECK-NEXT: [[clip20:%\d+]] = OpCompositeConstruct %v3float [[val0]] [[val1]] [[val2]]
  91. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_2
  92. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  93. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_3
  94. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  95. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_4
  96. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %float [[ptr2]]
  97. // CHECK-NEXT: [[clip21:%\d+]] = OpCompositeConstruct %v3float [[val0]] [[val1]] [[val2]]
  98. // CHECK-NEXT: [[inClip2Arr:%\d+]] = OpCompositeConstruct %_arr_v3float_uint_2 [[clip20]] [[clip21]]
  99. // Compose an array for GsPerVertexIn::clip0
  100. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_0
  101. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  102. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_2 %uint_1
  103. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  104. // CHECK-NEXT: [[clip00:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  105. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_0
  106. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  107. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_2 %uint_1
  108. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  109. // CHECK-NEXT: [[clip01:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  110. // CHECK-NEXT: [[inClip0Arr:%\d+]] = OpCompositeConstruct %_arr_v2float_uint_2 [[clip00]] [[clip01]]
  111. // CHECK-NEXT: [[inFooArr:%\d+]] = OpLoad %_arr_v3float_uint_2 %in_var_FOO
  112. // Compose an array for GsPerVertexIn::ptSize
  113. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_0 %uint_1
  114. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  115. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_PerVertexIn %uint_1 %uint_1
  116. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  117. // CHECK-NEXT: [[inPtSzArr:%\d+]] = OpCompositeConstruct %_arr_float_uint_2 [[val0]] [[val1]]
  118. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %v4float [[inPosArr]] 0
  119. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %v3float [[inClip2Arr]] 0
  120. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeExtract %v2float [[inClip0Arr]] 0
  121. // CHECK-NEXT: [[val3:%\d+]] = OpCompositeExtract %v3float [[inFooArr]] 0
  122. // CHECK-NEXT: [[val4:%\d+]] = OpCompositeExtract %float [[inPtSzArr]] 0
  123. // CHECK-NEXT: [[inData0:%\d+]] = OpCompositeConstruct %GsPerVertexIn [[val0]] [[val1]] [[val2]] [[val3]] [[val4]]
  124. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %v4float [[inPosArr]] 1
  125. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %v3float [[inClip2Arr]] 1
  126. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeExtract %v2float [[inClip0Arr]] 1
  127. // CHECK-NEXT: [[val3:%\d+]] = OpCompositeExtract %v3float [[inFooArr]] 1
  128. // CHECK-NEXT: [[val4:%\d+]] = OpCompositeExtract %float [[inPtSzArr]] 1
  129. // CHECK-NEXT: [[inData1:%\d+]] = OpCompositeConstruct %GsPerVertexIn [[val0]] [[val1]] [[val2]] [[val3]] [[val4]]
  130. // CHECK-NEXT: [[inData:%\d+]] = OpCompositeConstruct %_arr_GsPerVertexIn_uint_2 [[inData0]] [[inData1]]
  131. // CHECK-NEXT: OpStore %param_var_inData [[inData]]
  132. // CHECK-NEXT: {{%\d+}} = OpFunctionCall %void %src_main %param_var_bar %param_var_inData %param_var_outData
  133. // No write back after the call
  134. // CHECK-NEXT: OpReturn
  135. }