op.struct.access.hlsl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. };
  8. struct T {
  9. int h; // Nested struct
  10. S i;
  11. };
  12. T foo() {
  13. T ret = (T)0;
  14. return ret;
  15. }
  16. float4 main() : SV_Target {
  17. T t;
  18. // CHECK: [[h:%\d+]] = OpAccessChain %_ptr_Function_int %t %int_0
  19. // CHECK-NEXT: {{%\d+}} = OpLoad %int [[h]]
  20. int v1 = t.h;
  21. // CHECK: [[a:%\d+]] = OpAccessChain %_ptr_Function_bool %t %int_1 %int_0
  22. // CHECK-NEXT: {{%\d+}} = OpLoad %bool [[a]]
  23. bool v2 = t.i.a;
  24. // CHECK: [[b0:%\d+]] = OpAccessChain %_ptr_Function_uint %t %int_1 %int_1 %uint_0
  25. // CHECK-NEXT: {{%\d+}} = OpLoad %uint [[b0]]
  26. uint v3 = t.i.b[0];
  27. // CHECK: [[b:%\d+]] = OpAccessChain %_ptr_Function_v2uint %t %int_1 %int_1
  28. // CHECK-NEXT: {{%\d+}} = OpLoad %v2uint [[b]]
  29. uint2 v4 = t.i.b.rg;
  30. // CHECK: [[c:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %t %int_1 %int_2
  31. // CHECK-NEXT: [[c00p:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_0 %int_0
  32. // CHECK-NEXT: [[c00v:%\d+]] = OpLoad %float [[c00p]]
  33. // CHECK-NEXT: [[c11p:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_1 %int_1
  34. // CHECK-NEXT: [[c11v:%\d+]] = OpLoad %float [[c11p]]
  35. // CHECK-NEXT: {{%\d+}} = OpCompositeConstruct %v2float [[c00v]] [[c11v]]
  36. float2 v5 = t.i.c._11_22;
  37. // CHECK: [[c1:%\d+]] = OpAccessChain %_ptr_Function_v3float %t %int_1 %int_2 %uint_1
  38. // CHECK-NEXT: {{%\d+}} = OpLoad %v3float [[c1]]
  39. float3 v6 = t.i.c[1];
  40. // CHECK: [[h:%\d+]] = OpAccessChain %_ptr_Function_int %t %int_0
  41. // CHECK-NEXT: OpStore [[h]] {{%\d+}}
  42. t.h = v1;
  43. // CHECK: [[a:%\d+]] = OpAccessChain %_ptr_Function_bool %t %int_1 %int_0
  44. // CHECK-NEXT: OpStore [[a]] {{%\d+}}
  45. t.i.a = v2;
  46. // CHECK: [[b1:%\d+]] = OpAccessChain %_ptr_Function_uint %t %int_1 %int_1 %uint_1
  47. // CHECK-NEXT: OpStore [[b1]] {{%\d+}}
  48. t.i.b[1] = v3;
  49. // CHECK: [[v4:%\d+]] = OpLoad %v2uint %v4
  50. // CHECK-NEXT: [[b:%\d+]] = OpAccessChain %_ptr_Function_v2uint %t %int_1 %int_1
  51. // CHECK-NEXT: [[bv:%\d+]] = OpLoad %v2uint [[b]]
  52. // CHECK-NEXT: [[gr:%\d+]] = OpVectorShuffle %v2uint [[bv]] [[v4]] 3 2
  53. // CHECK-NEXT: OpStore [[b]] [[gr]]
  54. t.i.b.gr = v4;
  55. // CHECK: [[v5:%\d+]] = OpLoad %v2float %v5
  56. // CHECK-NEXT: [[c:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %t %int_1 %int_2
  57. // CHECK-NEXT: [[v50:%\d+]] = OpCompositeExtract %float [[v5]] 0
  58. // CHECK-NEXT: [[c11:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_1 %int_1
  59. // CHECK-NEXT: OpStore [[c11]] [[v50]]
  60. // CHECK-NEXT: [[v51:%\d+]] = OpCompositeExtract %float [[v5]] 1
  61. // CHECK-NEXT: [[c00:%\d+]] = OpAccessChain %_ptr_Function_float [[c]] %int_0 %int_0
  62. // CHECK-NEXT: OpStore [[c00]] [[v51]]
  63. t.i.c._22_11 = v5;
  64. // CHECK: [[c0:%\d+]] = OpAccessChain %_ptr_Function_v3float %t %int_1 %int_2 %uint_0
  65. // CHECK-NEXT: OpStore [[c0]] {{%\d+}}
  66. t.i.c[0] = v6;
  67. // CHECK: [[ret:%\d+]] = OpFunctionCall %T %foo
  68. // CHECK-NEXT: OpStore %temp_var_T [[ret]]
  69. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Function_v4float %temp_var_T %int_1 %int_3
  70. // CHECK-NEXT: [[val:%\d+]] = OpLoad %v4float [[ptr]]
  71. // CHECK-NEXT: OpReturnValue [[val]]
  72. return foo().i.d;
  73. }