spirv.interface.ps.hlsl 4.0 KB

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