var.init.array.hlsl 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Run: %dxc -T vs_6_0 -E main
  2. struct S1 {
  3. float2 a;
  4. };
  5. struct S2 {
  6. float2 b[2];
  7. };
  8. struct T1 {
  9. S2 c; // Need to split to match T2.f1 & T2.f2
  10. S2 d; // Match T2.f3 exactly
  11. };
  12. struct T2 {
  13. S1 e;
  14. S1 f;
  15. S2 g;
  16. };
  17. // Flattend T2: need to split all fields in T2
  18. struct T3 {
  19. float2 h;
  20. float2 i;
  21. float2 j;
  22. float2 k;
  23. };
  24. void main() {
  25. T1 val1[2];
  26. // val2[0]: Construct T2.e from T1.c.b[0]
  27. // CHECK: [[b_0:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %uint_0 %int_0 %int_0 %uint_0
  28. // CHECK-NEXT: [[b_0_val:%\d+]] = OpLoad %v2float [[b_0]]
  29. // CHECK-NEXT: [[e_val:%\d+]] = OpCompositeConstruct %S1 [[b_0_val]]
  30. // val2[0]: Construct T2.f from T1.c.b[1]
  31. // CHECK-NEXT: [[b_1:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %uint_0 %int_0 %int_0 %uint_1
  32. // CHECK-NEXT: [[b_1_val:%\d+]] = OpLoad %v2float [[b_1]]
  33. // CHECK-NEXT: [[f_val:%\d+]] = OpCompositeConstruct %S1 [[b_1_val]]
  34. // val2[0]: Read T1.d as T2.g
  35. // CHECK-NEXT: [[T1_d:%\d+]] = OpAccessChain %_ptr_Function_S2 %val1 %uint_0 %int_1
  36. // CHECK-NEXT: [[d_val:%\d+]] = OpLoad %S2 [[T1_d]]
  37. // CHECK-NEXT: [[val2_0:%\d+]] = OpCompositeConstruct %T2 [[e_val]] [[f_val]] [[d_val]]
  38. // val2[1]: Construct T2.e from T1.c.b[0]
  39. // CHECK-NEXT: [[b_0:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %uint_1 %int_0 %int_0 %uint_0
  40. // CHECK-NEXT: [[b_0_val:%\d+]] = OpLoad %v2float [[b_0]]
  41. // CHECK-NEXT: [[e_val:%\d+]] = OpCompositeConstruct %S1 [[b_0_val]]
  42. // val2[1]: Construct T2.f from T1.c.b[1]
  43. // CHECK-NEXT: [[b_1:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %uint_1 %int_0 %int_0 %uint_1
  44. // CHECK-NEXT: [[b_1_val:%\d+]] = OpLoad %v2float [[b_1]]
  45. // CHECK-NEXT: [[f_val:%\d+]] = OpCompositeConstruct %S1 [[b_1_val]]
  46. // val2[1]: Read T1.d as T2.g
  47. // CHECK-NEXT: [[T1_d:%\d+]] = OpAccessChain %_ptr_Function_S2 %val1 %uint_1 %int_1
  48. // CHECK-NEXT: [[d_val:%\d+]] = OpLoad %S2 [[T1_d]]
  49. // CHECK-NEXT: [[val2_1:%\d+]] = OpCompositeConstruct %T2 [[e_val]] [[f_val]] [[d_val]]
  50. // CHECK-NEXT: [[val2:%\d+]] = OpCompositeConstruct %_arr_T2_uint_2 [[val2_0]] [[val2_1]]
  51. // CHECK-NEXT: OpStore %val2 [[val2]]
  52. T2 val2[2] = {val1};
  53. // val3[0]: Construct T3.h from T1.c.b[0]
  54. // CHECK-NEXT: [[b_0:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %int_0 %int_0 %int_0 %uint_0
  55. // CHECK-NEXT: [[h_val:%\d+]] = OpLoad %v2float [[b_0]]
  56. // val3[0]: Construct T3.i from T1.c.b[1]
  57. // CHECK-NEXT: [[b_1:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %int_0 %int_0 %int_0 %uint_1
  58. // CHECK-NEXT: [[i_val:%\d+]] = OpLoad %v2float [[b_1]]
  59. // val3[0]: Construct T3.j from T1.d.b[0]
  60. // CHECK-NEXT: [[b_0:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %int_0 %int_1 %int_0 %uint_0
  61. // CHECK-NEXT: [[j_val:%\d+]] = OpLoad %v2float [[b_0]]
  62. // val3[0]: Construct T3.k from T1.d.b[1]
  63. // CHECK-NEXT: [[b_1:%\d+]] = OpAccessChain %_ptr_Function_v2float %val1 %int_0 %int_1 %int_0 %uint_1
  64. // CHECK-NEXT: [[k_val:%\d+]] = OpLoad %v2float [[b_1]]
  65. // CHECK-NEXT: [[val3_0:%\d+]] = OpCompositeConstruct %T3 [[h_val]] [[i_val]] [[j_val]] [[k_val]]
  66. // val3[1]
  67. // CHECK-NEXT: [[t3_val:%\d+]] = OpLoad %T3 %t3
  68. // val3[2]: Construct T3.h from S1.a
  69. // CHECK-NEXT: [[s1_a:%\d+]] = OpAccessChain %_ptr_Function_v2float %s1 %int_0
  70. // CHECK-NEXT: [[h_val:%\d+]] = OpLoad %v2float [[s1_a]]
  71. // val3[2]: Construct T3.i from S2.b[0]
  72. // CHECK-NEXT: [[s2_b_0:%\d+]] = OpAccessChain %_ptr_Function_v2float %s2 %int_0 %uint_0
  73. // CHECK-NEXT: [[i_val:%\d+]] = OpLoad %v2float [[s2_b_0]]
  74. // val3[2]: Construct T3.j from S2.b[1]
  75. // CHECK-NEXT: [[s2_b_1:%\d+]] = OpAccessChain %_ptr_Function_v2float %s2 %int_0 %uint_1
  76. // CHECK-NEXT: [[j_val:%\d+]] = OpLoad %v2float [[s2_b_1]]
  77. // val3[2]: Construct T3.k from S1.a
  78. // CHECK-NEXT: [[s1_a:%\d+]] = OpAccessChain %_ptr_Function_v2float %s1 %int_0
  79. // CHECK-NEXT: [[k_val:%\d+]] = OpLoad %v2float [[s1_a]]
  80. // CHECK-NEXT: [[val3_2:%\d+]] = OpCompositeConstruct %T3 [[h_val]] [[i_val]] [[j_val]] [[k_val]]
  81. // CHECK-NEXT: [[val3:%\d+]] = OpCompositeConstruct %_arr_T3_uint_3 [[val3_0]] [[t3_val]]
  82. // CHECK-NEXT: OpStore %val3 [[val3]]
  83. S1 s1;
  84. S2 s2;
  85. T3 t3;
  86. T3 val3[3] = {val1[0],
  87. t3,
  88. s1, s2, s1};
  89. }