binary-op.assign.composite.hlsl 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Run: %dxc -T ps_6_0 -E main
  2. struct SubBuffer {
  3. float a[1];
  4. float2 b[1];
  5. float2x3 c[1];
  6. };
  7. struct BufferType {
  8. float a;
  9. float3 b;
  10. float3x2 c;
  11. SubBuffer d[1];
  12. };
  13. RWStructuredBuffer<BufferType> sbuf; // %BufferType & %SubBuffer
  14. ConstantBuffer<BufferType> cbuf; // %type_ConstantBuffer_BufferType & %SubBuffer_0
  15. void main(uint index: A) {
  16. // Same storage class
  17. // CHECK: [[sbuf0:%\d+]] = OpAccessChain %_ptr_Uniform_BufferType %sbuf %int_0 %uint_0
  18. // CHECK-NEXT: [[val:%\d+]] = OpLoad %BufferType [[sbuf0]]
  19. // CHECK-NEXT: [[sbuf8:%\d+]] = OpAccessChain %_ptr_Uniform_BufferType %sbuf %int_0 %uint_8
  20. // CHECK-NEXT: OpStore [[sbuf8]] [[val]]
  21. sbuf[8] = sbuf[0];
  22. // Different storage class
  23. // CHECK-NEXT: [[lbuf:%\d+]] = OpLoad %BufferType_0 %lbuf
  24. // CHECK-NEXT: [[sbuf5:%\d+]] = OpAccessChain %_ptr_Uniform_BufferType %sbuf %int_0 %uint_5
  25. // sbuf[5].a <- lbuf.a
  26. // CHECK-NEXT: [[val:%\d+]] = OpCompositeExtract %float [[lbuf]] 0
  27. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_float [[sbuf5]] %uint_0
  28. // CHECK-NEXT: OpStore [[ptr]] [[val]]
  29. // sbuf[5].b <- lbuf.b
  30. // CHECK-NEXT: [[val:%\d+]] = OpCompositeExtract %v3float [[lbuf]] 1
  31. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_v3float [[sbuf5]] %uint_1
  32. // CHECK-NEXT: OpStore [[ptr]] [[val]]
  33. // sbuf[5].c <- lbuf.c
  34. // CHECK-NEXT: [[val:%\d+]] = OpCompositeExtract %mat3v2float [[lbuf]] 2
  35. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_mat3v2float [[sbuf5]] %uint_2
  36. // CHECK-NEXT: OpStore [[ptr]] [[val]]
  37. // CHECK-NEXT: [[lbuf_d:%\d+]] = OpCompositeExtract %_arr_SubBuffer_1_uint_1 [[lbuf]] 3
  38. // CHECK-NEXT: [[sbuf_d:%\d+]] = OpAccessChain %_ptr_Uniform__arr_SubBuffer_uint_1 [[sbuf5]] %uint_3
  39. // CHECK-NEXT: [[lbuf_d0:%\d+]] = OpCompositeExtract %SubBuffer_1 [[lbuf_d]] 0
  40. // CHECK-NEXT: [[sbuf_d0:%\d+]] = OpAccessChain %_ptr_Uniform_SubBuffer [[sbuf_d]] %uint_0
  41. // sbuf[5].d[0].a[0] <- lbuf.a[0]
  42. // CHECK-NEXT: [[lbuf_d0_a:%\d+]] = OpCompositeExtract %_arr_float_uint_1_1 [[lbuf_d0]] 0
  43. // CHECK-NEXT: [[sbuf_d0_a:%\d+]] = OpAccessChain %_ptr_Uniform__arr_float_uint_1 [[sbuf_d0]] %uint_0
  44. // CHECK-NEXT: [[lbuf_d0_a0:%\d+]] = OpCompositeExtract %float [[lbuf_d0_a]] 0
  45. // CHECK-NEXT: [[sbuf_d0_a0:%\d+]] = OpAccessChain %_ptr_Uniform_float [[sbuf_d0_a]] %uint_0
  46. // CHECK-NEXT: OpStore [[sbuf_d0_a0]] [[lbuf_d0_a0]]
  47. // sbuf[5].d[0].b[0] <- lbuf.b[0]
  48. // CHECK-NEXT: [[lbuf_d0_b:%\d+]] = OpCompositeExtract %_arr_v2float_uint_1_1 [[lbuf_d0]] 1
  49. // CHECK-NEXT: [[sbuf_d0_b:%\d+]] = OpAccessChain %_ptr_Uniform__arr_v2float_uint_1 [[sbuf_d0]] %uint_1
  50. // CHECK-NEXT: [[lbuf_d0_b0:%\d+]] = OpCompositeExtract %v2float [[lbuf_d0_b]] 0
  51. // CHECK-NEXT: [[sbuf_d0_b0:%\d+]] = OpAccessChain %_ptr_Uniform_v2float [[sbuf_d0_b]] %uint_0
  52. // CHECK-NEXT: OpStore [[sbuf_d0_b0]] [[lbuf_d0_b0]]
  53. // sbuf[5].d[0].c[0] <- lbuf.c[0]
  54. // CHECK-NEXT: [[lbuf_d0_c:%\d+]] = OpCompositeExtract %_arr_mat2v3float_uint_1_1 [[lbuf_d0]] 2
  55. // CHECK-NEXT: [[sbuf_d0_c:%\d+]] = OpAccessChain %_ptr_Uniform__arr_mat2v3float_uint_1 [[sbuf_d0]] %uint_2
  56. // CHECK-NEXT: [[lbuf_d0_c0:%\d+]] = OpCompositeExtract %mat2v3float [[lbuf_d0_c]] 0
  57. // CHECK-NEXT: [[sbuf_d0_c0:%\d+]] = OpAccessChain %_ptr_Uniform_mat2v3float [[sbuf_d0_c]] %uint_0
  58. // CHECK-NEXT: OpStore [[sbuf_d0_c0]] [[lbuf_d0_c0]]
  59. BufferType lbuf; // %BufferType_0 & %SubBuffer_1
  60. sbuf[5] = lbuf; // %BufferType <- %BufferType_0
  61. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_SubBuffer_0 %cbuf %int_3 %int_0
  62. // CHECK-NEXT: [[cbuf_d0:%\d+]] = OpLoad %SubBuffer_0 [[ptr]]
  63. // sub.a[0] <- cbuf.d[0].a[0]
  64. // CHECK-NEXT: [[cbuf_d0_a:%\d+]] = OpCompositeExtract %_arr_float_uint_1_0 [[cbuf_d0]] 0
  65. // CHECK-NEXT: [[sub_a:%\d+]] = OpAccessChain %_ptr_Function__arr_float_uint_1_1 %sub %uint_0
  66. // CHECK-NEXT: [[cbuf_d0_a0:%\d+]] = OpCompositeExtract %float [[cbuf_d0_a]] 0
  67. // CHECK-NEXT: [[sub_a0:%\d+]] = OpAccessChain %_ptr_Function_float [[sub_a]] %uint_0
  68. // CHECK-NEXT: OpStore [[sub_a0]] [[cbuf_d0_a0]]
  69. // sub.b[0] <- cbuf.d[0].b[0]
  70. // CHECK-NEXT: [[cbuf_d0_b:%\d+]] = OpCompositeExtract %_arr_v2float_uint_1_0 [[cbuf_d0]] 1
  71. // CHECK-NEXT: [[sub_b:%\d+]] = OpAccessChain %_ptr_Function__arr_v2float_uint_1_1 %sub %uint_1
  72. // CHECK-NEXT: [[cbuf_d0_b0:%\d+]] = OpCompositeExtract %v2float [[cbuf_d0_b]] 0
  73. // CHECK-NEXT: [[sub_b0:%\d+]] = OpAccessChain %_ptr_Function_v2float [[sub_b]] %uint_0
  74. // CHECK-NEXT: OpStore [[sub_b0]] [[cbuf_d0_b0]]
  75. // sub.c[0] <- cbuf.d[0].c[0]
  76. // CHECK-NEXT: [[cbuf_d0_c:%\d+]] = OpCompositeExtract %_arr_mat2v3float_uint_1_0 [[cbuf_d0]] 2
  77. // CHECK-NEXT: [[sub_c:%\d+]] = OpAccessChain %_ptr_Function__arr_mat2v3float_uint_1_1 %sub %uint_2
  78. // CHECK-NEXT: [[cbuf_d0_c0:%\d+]] = OpCompositeExtract %mat2v3float [[cbuf_d0_c]] 0
  79. // CHECK-NEXT: [[sub_c0:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float [[sub_c]] %uint_0
  80. // CHECK-NEXT: OpStore [[sub_c0]] [[cbuf_d0_c0]]
  81. SubBuffer sub = cbuf.d[0]; // %SubBuffer_1 <- %SubBuffer_0
  82. }