2
0

spirv.interface.gs.hlsl 8.5 KB

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