spirv.interface.vs.hlsl 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Run: %dxc -T vs_6_0 -E main
  2. // CHECK: OpCapability ClipDistance
  3. // CHECK: OpCapability CullDistance
  4. // CHECK: OpEntryPoint Vertex %main "main" %gl_PerVertexOut %in_var_TEXCOORD %in_var_SV_Position %in_var_SV_ClipDistance %in_var_SV_CullDistance0 %out_var_COLOR %out_var_TEXCOORD
  5. // CHECK: OpMemberDecorate %type_gl_PerVertex 0 BuiltIn Position
  6. // CHECK: OpMemberDecorate %type_gl_PerVertex 1 BuiltIn PointSize
  7. // CHECK: OpMemberDecorate %type_gl_PerVertex 2 BuiltIn ClipDistance
  8. // CHECK: OpMemberDecorate %type_gl_PerVertex 3 BuiltIn CullDistance
  9. // CHECK: OpDecorate %type_gl_PerVertex Block
  10. // CHECK: OpDecorate %in_var_TEXCOORD Location 0
  11. // CHECK: OpDecorate %in_var_SV_Position Location 1
  12. // CHECK: OpDecorate %in_var_SV_ClipDistance Location 2
  13. // CHECK: OpDecorate %in_var_SV_CullDistance0 Location 3
  14. // CHECK: OpDecorate %out_var_COLOR Location 0
  15. // CHECK: OpDecorate %out_var_TEXCOORD Location 1
  16. // clipdis0 + clipdis1 : 5 floats
  17. // culldis3 + culldis5 + culldis6 : 3 floats
  18. // CHECK: %type_gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_5 %_arr_float_uint_3
  19. // CHECK: %gl_PerVertexOut = OpVariable %_ptr_Output_type_gl_PerVertex Output
  20. // CHECK: %in_var_TEXCOORD = OpVariable %_ptr_Input_v4float Input
  21. // CHECK: %in_var_SV_Position = OpVariable %_ptr_Input_v4float Input
  22. // CHECK: %in_var_SV_ClipDistance = OpVariable %_ptr_Input_v2float Input
  23. // CHECK: %in_var_SV_CullDistance0 = OpVariable %_ptr_Input_v3float Input
  24. // CHECK: %out_var_COLOR = OpVariable %_ptr_Output_v4float Output
  25. // CHECK: %out_var_TEXCOORD = OpVariable %_ptr_Output_v4float Output
  26. struct InnerInnerStruct {
  27. float4 position : SV_Position; // -> BuiltIn Position in gl_Pervertex
  28. };
  29. struct InnerStruct {
  30. float2 clipdis1 : SV_ClipDistance1; // -> BuiltIn ClipDistance in gl_PerVertex
  31. InnerInnerStruct s;
  32. };
  33. struct VSOut {
  34. float4 color : COLOR; // -> Output variable
  35. InnerStruct s;
  36. };
  37. [[vk::builtin("PointSize")]]
  38. float main(out VSOut vsOut,
  39. out float3 clipdis0 : SV_ClipDistance0, // -> BuiltIn ClipDistance in gl_PerVertex
  40. inout float4 coord : TEXCOORD, // -> Input & output variable
  41. out float culldis5 : SV_CullDistance5, // -> BuiltIn CullDistance in gl_PerVertex
  42. out float culldis3 : SV_CullDistance3, // -> BuiltIn CullDistance in gl_PerVertex
  43. out float culldis6 : SV_CullDistance6, // -> BuiltIn CullDistance in gl_PerVertex
  44. in float4 inPos : SV_Position, // -> Input variable
  45. in float2 inClip : SV_ClipDistance, // -> Input variable
  46. in float3 inCull : SV_CullDistance0 // -> Input variable
  47. ) : PSize { // -> Builtin PointSize
  48. vsOut = (VSOut)0;
  49. clipdis0 = 1.;
  50. coord = 2.;
  51. culldis5 = 3.;
  52. culldis3 = 4.;
  53. culldis6 = 5.;
  54. inPos = 6.;
  55. return 7.;
  56. // Layout of ClipDistance array:
  57. // clipdis0: 3 floats, offset 0
  58. // clipdis1: 2 floats, offset 3
  59. // Layout of CullDistance array:
  60. // culldis3: 1 floats, offset 0
  61. // culldis5: 1 floats, offset 1
  62. // culldis6: 1 floats, offset 2
  63. // CHECK: [[texcoord:%\d+]] = OpLoad %v4float %in_var_TEXCOORD
  64. // CHECK-NEXT: OpStore %param_var_coord [[texcoord]]
  65. // CHECK-NEXT: [[pos:%\d+]] = OpLoad %v4float %in_var_SV_Position
  66. // CHECK-NEXT: OpStore %param_var_inPos [[pos]]
  67. // CHECK-NEXT: [[inClip:%\d+]] = OpLoad %v2float %in_var_SV_ClipDistance
  68. // CHECK-NEXT: OpStore %param_var_inClip [[inClip]]
  69. // CHECK-NEXT: [[inCull:%\d+]] = OpLoad %v3float %in_var_SV_CullDistance0
  70. // CHECK-NEXT: OpStore %param_var_inCull [[inCull]]
  71. // CHECK-NEXT: [[ptSize:%\d+]] = OpFunctionCall %float %src_main
  72. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_1
  73. // CHECK-NEXT: OpStore [[ptr]] [[ptSize]]
  74. // Write out COLOR
  75. // CHECK-NEXT: [[vsOut:%\d+]] = OpLoad %VSOut %param_var_vsOut
  76. // CHECK-NEXT: [[outColor:%\d+]] = OpCompositeExtract %v4float [[vsOut]] 0
  77. // CHECK-NEXT: OpStore %out_var_COLOR [[outColor]]
  78. // CHECK-NEXT: [[innerS:%\d+]] = OpCompositeExtract %InnerStruct [[vsOut]] 1
  79. // Write out SV_ClipDistance1
  80. // CHECK-NEXT: [[clip1:%\d+]] = OpCompositeExtract %v2float [[innerS]] 0
  81. // CHECK-NEXT: [[clipArr3:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_2 %uint_3
  82. // CHECK-NEXT: [[clip10:%\d+]] = OpCompositeExtract %float [[clip1]] 0
  83. // CHECK-NEXT: OpStore [[clipArr3]] [[clip10]]
  84. // CHECK-NEXT: [[clipArr4:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_2 %uint_4
  85. // CHECK-NEXT: [[clip11:%\d+]] = OpCompositeExtract %float [[clip1]] 1
  86. // CHECK-NEXT: OpStore [[clipArr4]] [[clip11]]
  87. // CHECK-NEXT: [[inner2S:%\d+]] = OpCompositeExtract %InnerInnerStruct [[innerS]] 1
  88. // Write out SV_Position
  89. // CHECK-NEXT: [[pos:%\d+]] = OpCompositeExtract %v4float [[inner2S]] 0
  90. // CHECK-NEXT: [[outPos:%\d+]] = OpAccessChain %_ptr_Output_v4float %gl_PerVertexOut %uint_0
  91. // CHECK-NEXT: OpStore [[outPos]] [[pos]]
  92. // Write out SV_ClipDistance0
  93. // CHECK-NEXT: [[clip0:%\d+]] = OpLoad %v3float %param_var_clipdis0
  94. // CHECK-NEXT: [[clipArr0:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_2 %uint_0
  95. // CHECK-NEXT: [[clip00:%\d+]] = OpCompositeExtract %float [[clip0]] 0
  96. // CHECK-NEXT: OpStore [[clipArr0]] [[clip00]]
  97. // CHECK-NEXT: [[clipArr1:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_2 %uint_1
  98. // CHECK-NEXT: [[clip01:%\d+]] = OpCompositeExtract %float [[clip0]] 1
  99. // CHECK-NEXT: OpStore [[clipArr1]] [[clip01]]
  100. // CHECK-NEXT: [[clipArr2:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_2 %uint_2
  101. // CHECK-NEXT: [[clip02:%\d+]] = OpCompositeExtract %float [[clip0]] 2
  102. // CHECK-NEXT: OpStore [[clipArr2]] [[clip02]]
  103. // Write out TEXCOORD
  104. // CHECK-NEXT: [[texcord:%\d+]] = OpLoad %v4float %param_var_coord
  105. // CHECK-NEXT: OpStore %out_var_TEXCOORD [[texcord]]
  106. // Write out SV_CullDistance5
  107. // CHECK-NEXT: [[cull5:%\d+]] = OpLoad %float %param_var_culldis5
  108. // CHECK-NEXT: [[cullArr1:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_3 %uint_1
  109. // CHECK-NEXT: OpStore [[cullArr1]] [[cull5]]
  110. // Write out SV_CullDistance3
  111. // CHECK-NEXT: [[cull3:%\d+]] = OpLoad %float %param_var_culldis3
  112. // CHECK-NEXT: [[cullArr0:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_3 %uint_0
  113. // CHECK-NEXT: OpStore [[cullArr0]] [[cull3]]
  114. // Write out SV_CullDistance6
  115. // CHECK-NEXT: [[cull6:%\d+]] = OpLoad %float %param_var_culldis6
  116. // CHECK-NEXT: [[cullArr2:%\d+]] = OpAccessChain %_ptr_Output_float %gl_PerVertexOut %uint_3 %uint_2
  117. // CHECK-NEXT: OpStore [[cullArr2]] [[cull6]]
  118. }