op.struct.access.hlsl 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Run: %dxc -T ps_6_0 -E main
  2. struct S {
  3. bool a;
  4. uint2 b;
  5. float2x3 c;
  6. float4 d;
  7. float4 e[1];
  8. float f[4];
  9. int g;
  10. };
  11. struct T {
  12. int h; // Nested struct
  13. S i;
  14. };
  15. T foo() {
  16. T ret = (T)0;
  17. return ret;
  18. }
  19. S bar() {
  20. S ret = (S)0;
  21. return ret;
  22. }
  23. ConstantBuffer<S> MyBuffer;
  24. S baz() {
  25. return MyBuffer;
  26. }
  27. float4 main() : SV_Target {
  28. T t;
  29. // CHECK: [[h:%\d+]] = OpAccessChain %_ptr_Function_int %t %int_0
  30. // CHECK-NEXT: {{%\d+}} = OpLoad %int [[h]]
  31. int v1 = t.h;
  32. // CHECK: [[a:%\d+]] = OpAccessChain %_ptr_Function_bool %t %int_1 %int_0
  33. // CHECK-NEXT: {{%\d+}} = OpLoad %bool [[a]]
  34. bool v2 = t.i.a;
  35. // CHECK: [[b0:%\d+]] = OpAccessChain %_ptr_Function_uint %t %int_1 %int_1 %uint_0
  36. // CHECK-NEXT: {{%\d+}} = OpLoad %uint [[b0]]
  37. uint v3 = t.i.b[0];
  38. // CHECK: [[b:%\d+]] = OpAccessChain %_ptr_Function_v2uint %t %int_1 %int_1
  39. // CHECK-NEXT: {{%\d+}} = OpLoad %v2uint [[b]]
  40. uint2 v4 = t.i.b.rg;
  41. // CHECK: [[c:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %t %int_1 %int_2
  42. // CHECK-NEXT: [[c00p:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_0 %int_0
  43. // CHECK-NEXT: [[c00v:%\d+]] = OpLoad %float [[c00p]]
  44. // CHECK-NEXT: [[c11p:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_1 %int_1
  45. // CHECK-NEXT: [[c11v:%\d+]] = OpLoad %float [[c11p]]
  46. // CHECK-NEXT: {{%\d+}} = OpCompositeConstruct %v2float [[c00v]] [[c11v]]
  47. float2 v5 = t.i.c._11_22;
  48. // CHECK: [[c1:%\d+]] = OpAccessChain %_ptr_Function_v3float %t %int_1 %int_2 %uint_1
  49. // CHECK-NEXT: {{%\d+}} = OpLoad %v3float [[c1]]
  50. float3 v6 = t.i.c[1];
  51. // CHECK: [[h:%\d+]] = OpAccessChain %_ptr_Function_int %t %int_0
  52. // CHECK-NEXT: OpStore [[h]] {{%\d+}}
  53. t.h = v1;
  54. // CHECK: [[a:%\d+]] = OpAccessChain %_ptr_Function_bool %t %int_1 %int_0
  55. // CHECK-NEXT: OpStore [[a]] {{%\d+}}
  56. t.i.a = v2;
  57. // CHECK: [[b1:%\d+]] = OpAccessChain %_ptr_Function_uint %t %int_1 %int_1 %uint_1
  58. // CHECK-NEXT: OpStore [[b1]] {{%\d+}}
  59. t.i.b[1] = v3;
  60. // CHECK: [[v4:%\d+]] = OpLoad %v2uint %v4
  61. // CHECK-NEXT: [[b:%\d+]] = OpAccessChain %_ptr_Function_v2uint %t %int_1 %int_1
  62. // CHECK-NEXT: [[bv:%\d+]] = OpLoad %v2uint [[b]]
  63. // CHECK-NEXT: [[gr:%\d+]] = OpVectorShuffle %v2uint [[bv]] [[v4]] 3 2
  64. // CHECK-NEXT: OpStore [[b]] [[gr]]
  65. t.i.b.gr = v4;
  66. // CHECK: [[v5:%\d+]] = OpLoad %v2float %v5
  67. // CHECK-NEXT: [[c:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %t %int_1 %int_2
  68. // CHECK-NEXT: [[v50:%\d+]] = OpCompositeExtract %float [[v5]] 0
  69. // CHECK-NEXT: [[c11:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_1 %int_1
  70. // CHECK-NEXT: OpStore [[c11]] [[v50]]
  71. // CHECK-NEXT: [[v51:%\d+]] = OpCompositeExtract %float [[v5]] 1
  72. // CHECK-NEXT: [[c00:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_0 %int_0
  73. // CHECK-NEXT: OpStore [[c00]] [[v51]]
  74. t.i.c._22_11 = v5;
  75. // CHECK: [[c0:%\d+]] = OpAccessChain %_ptr_Function_v3float %t %int_1 %int_2 %uint_0
  76. // CHECK-NEXT: OpStore [[c0]] {{%\d+}}
  77. t.i.c[0] = v6;
  78. // CHECK: [[baz:%\d+]] = OpFunctionCall %S %baz
  79. // CHECK-NEXT: OpStore %temp_var_S [[baz]]
  80. // CHECK-NEXT: OpAccessChain %_ptr_Function_v4float %temp_var_S %int_4 %int_0
  81. // CHECK: [[bar:%\d+]] = OpFunctionCall %S %bar
  82. // CHECK-NEXT: OpStore %temp_var_S_0 [[bar]]
  83. // CHECK-NEXT: OpAccessChain %_ptr_Function_float %temp_var_S_0 %int_5 %int_1
  84. float4 val1 = bar().f[1] * baz().e[0];
  85. // CHECK: [[ac:%\d+]] = OpAccessChain %_ptr_Function_int %temp_var_S_1 %int_6
  86. // CHECK-NEXT: OpLoad %int [[ac]]
  87. bool val2 = bar().g; // Need cast on rvalue function return
  88. // CHECK: [[ret:%\d+]] = OpFunctionCall %T %foo
  89. // CHECK-NEXT: OpStore %temp_var_T [[ret]]
  90. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Function_v4float %temp_var_T %int_1 %int_3
  91. // CHECK-NEXT: [[val:%\d+]] = OpLoad %v4float [[ptr]]
  92. // CHECK-NEXT: OpReturnValue [[val]]
  93. return foo().i.d;
  94. }