spirv.interface.ps.hlsl 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Run: %dxc -T ps_6_0 -E main -fspv-reflect
  2. // CHECK: OpCapability ClipDistance
  3. // CHECK: OpCapability CullDistance
  4. // CHECK: OpExtension "SPV_GOOGLE_hlsl_functionality1"
  5. struct Inner {
  6. float2 cull2 : SV_CullDistance2; // Builtin CullDistance
  7. float3 foo : FOO; // Input variable
  8. };
  9. struct PsIn {
  10. float4 pos : SV_Position; // Builtin FragCoord
  11. float2 clip0 : SV_ClipDistance0; // Builtin ClipDistance
  12. Inner s;
  13. };
  14. // CHECK: OpEntryPoint Fragment %main "main" %gl_ClipDistance %gl_CullDistance %gl_FragCoord %in_var_FOO %in_var_BAR %out_var_SV_Target
  15. // CHECK: OpDecorate %gl_ClipDistance BuiltIn ClipDistance
  16. // CHECK: OpDecorateStringGOOGLE %gl_ClipDistance HlslSemanticGOOGLE "SV_ClipDistance"
  17. // CHECK: OpDecorate %gl_CullDistance BuiltIn CullDistance
  18. // CHECK: OpDecorateStringGOOGLE %gl_CullDistance HlslSemanticGOOGLE "SV_CullDistance"
  19. // CHECK: OpDecorate %gl_FragCoord BuiltIn FragCoord
  20. // CHECK: OpDecorateStringGOOGLE %gl_FragCoord HlslSemanticGOOGLE "SV_Position"
  21. // CHECK: OpDecorateStringGOOGLE %in_var_FOO HlslSemanticGOOGLE "FOO"
  22. // CHECK: OpDecorateStringGOOGLE %in_var_BAR HlslSemanticGOOGLE "BAR"
  23. // CHECK: OpDecorateStringGOOGLE %out_var_SV_Target HlslSemanticGOOGLE "SV_Target"
  24. // CHECK: OpDecorate %in_var_FOO Location 0
  25. // CHECK: OpDecorate %in_var_BAR Location 1
  26. // CHECK: OpDecorate %out_var_SV_Target Location 0
  27. // Input : clip0 + clip1 : 3 floats
  28. // Input : cull1 + cull2 : 5 floats
  29. // CHECK: %gl_ClipDistance = OpVariable %_ptr_Input__arr_float_uint_3 Input
  30. // CHECK: %gl_CullDistance = OpVariable %_ptr_Input__arr_float_uint_5 Input
  31. // CHECK: %gl_FragCoord = OpVariable %_ptr_Input_v4float Input
  32. // CHECK: %in_var_FOO = OpVariable %_ptr_Input_v3float Input
  33. // CHECK: %in_var_BAR = OpVariable %_ptr_Input_float Input
  34. // CHECK: %out_var_SV_Target = OpVariable %_ptr_Output_v4float Output
  35. float4 main( PsIn psIn,
  36. float clip1 : SV_ClipDistance1, // Builtin ClipDistance
  37. float3 cull1 : SV_CullDistance1, // Builtin CullDistance
  38. in float bar : BAR // Input variable
  39. ) : SV_Target { // Output variable
  40. return psIn.pos + float4(clip1 + bar, cull1);
  41. // Layout of input ClipDistance array:
  42. // clip0: 2 floats, offset 0
  43. // clip1: 1 floats, offset 2
  44. // Layout of input CullDistance array:
  45. // cull1: 3 floats, offset 0
  46. // cull2: 2 floats, offset 3
  47. // CHECK: [[pos:%\d+]] = OpLoad %v4float %gl_FragCoord
  48. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_ClipDistance %uint_0
  49. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  50. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_ClipDistance %uint_1
  51. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  52. // CHECK-NEXT: [[clip0:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  53. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_CullDistance %uint_3
  54. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  55. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_CullDistance %uint_4
  56. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  57. // CHECK-NEXT: [[cull2:%\d+]] = OpCompositeConstruct %v2float [[val0]] [[val1]]
  58. // CHECK-NEXT: [[foo:%\d+]] = OpLoad %v3float %in_var_FOO
  59. // CHECK-NEXT: [[inner:%\d+]] = OpCompositeConstruct %Inner [[cull2]] [[foo]]
  60. // CHECK-NEXT: [[psin:%\d+]] = OpCompositeConstruct %PsIn [[pos]] [[clip0]] [[inner]]
  61. // CHECK-NEXT: OpStore %param_var_psIn [[psin]]
  62. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Input_float %gl_ClipDistance %uint_2
  63. // CHECK-NEXT: [[clip1:%\d+]] = OpLoad %float [[ptr]]
  64. // CHECK-NEXT: OpStore %param_var_clip1 [[clip1]]
  65. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Input_float %gl_CullDistance %uint_0
  66. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %float [[ptr0]]
  67. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Input_float %gl_CullDistance %uint_1
  68. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %float [[ptr1]]
  69. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Input_float %gl_CullDistance %uint_2
  70. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %float [[ptr2]]
  71. // CHECK-NEXT: [[cull1:%\d+]] = OpCompositeConstruct %v3float [[val0]] [[val1]] [[val2]]
  72. // CHECK-NEXT: OpStore %param_var_cull1 [[cull1]]
  73. // CHECK-NEXT: [[bar:%\d+]] = OpLoad %float %in_var_BAR
  74. // CHECK-NEXT: OpStore %param_var_bar [[bar]]
  75. // CHECK-NEXT: [[ret:%\d+]] = OpFunctionCall %v4float %src_main %param_var_psIn %param_var_clip1 %param_var_cull1 %param_var_bar
  76. // CHECK-NEXT: OpStore %out_var_SV_Target [[ret]]
  77. }