binary-op.assign.composite.hlsl 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. // CHECK-NEXT: [[lbuf_a:%\d+]] = OpCompositeExtract %float [[lbuf]] 0
  26. // CHECK-NEXT: [[lbuf_b:%\d+]] = OpCompositeExtract %v3float [[lbuf]] 1
  27. // CHECK-NEXT: [[lbuf_c:%\d+]] = OpCompositeExtract %mat3v2float [[lbuf]] 2
  28. // Get lbuf.d[0]
  29. // CHECK-NEXT: [[lbuf_d:%\d+]] = OpCompositeExtract %_arr_SubBuffer_1_uint_1 [[lbuf]] 3
  30. // CHECK-NEXT: [[lbuf_d0:%\d+]] = OpCompositeExtract %SubBuffer_1 [[lbuf_d]] 0
  31. // Reconstruct lbuf.d[0].a
  32. // CHECK-NEXT: [[lbuf_d0_a:%\d+]] = OpCompositeExtract %_arr_float_uint_1_1 [[lbuf_d0]] 0
  33. // CHECK-NEXT: [[lbuf_d0_a0:%\d+]] = OpCompositeExtract %float [[lbuf_d0_a]] 0
  34. // CHECK-NEXT: [[sbuf_d0_a:%\d+]] = OpCompositeConstruct %_arr_float_uint_1 [[lbuf_d0_a0]]
  35. // Reconstruct lbuf.d[0].b
  36. // CHECK-NEXT: [[lbuf_d0_b:%\d+]] = OpCompositeExtract %_arr_v2float_uint_1_1 [[lbuf_d0]] 1
  37. // CHECK-NEXT: [[lbuf_d0_b0:%\d+]] = OpCompositeExtract %v2float [[lbuf_d0_b]] 0
  38. // CHECK-NEXT: [[sbuf_d0_b:%\d+]] = OpCompositeConstruct %_arr_v2float_uint_1 [[lbuf_d0_b0]]
  39. // Reconstruct lbuf.d[0].c
  40. // CHECK-NEXT: [[lbuf_d0_c:%\d+]] = OpCompositeExtract %_arr_mat2v3float_uint_1_1 [[lbuf_d0]] 2
  41. // CHECK-NEXT: [[lbuf_d0_c0:%\d+]] = OpCompositeExtract %mat2v3float [[lbuf_d0_c]] 0
  42. // CHECK-NEXT: [[sbuf_d0_c:%\d+]] = OpCompositeConstruct %_arr_mat2v3float_uint_1 [[lbuf_d0_c0]]
  43. // CHECK-NEXT: [[sbuf_d0:%\d+]] = OpCompositeConstruct %SubBuffer [[sbuf_d0_a]] [[sbuf_d0_b]] [[sbuf_d0_c]]
  44. // CHECK-NEXT: [[sbuf_d:%\d+]] = OpCompositeConstruct %_arr_SubBuffer_uint_1 [[sbuf_d0]]
  45. // CHECK-NEXT: [[sbuf_val:%\d+]] = OpCompositeConstruct %BufferType [[lbuf_a]] [[lbuf_b]] [[lbuf_c]] [[sbuf_d]]
  46. // CHECK-NEXT: OpStore [[sbuf5]] [[sbuf_val]]
  47. BufferType lbuf; // %BufferType_0 & %SubBuffer_1
  48. sbuf[5] = lbuf; // %BufferType <- %BufferType_0
  49. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_SubBuffer_0 %cbuf %int_3 %int_0
  50. // CHECK-NEXT: [[cbuf_d0:%\d+]] = OpLoad %SubBuffer_0 [[ptr]]
  51. // Reconstruct lbuf.d[0].a
  52. // CHECK-NEXT: [[cbuf_d0_a:%\d+]] = OpCompositeExtract %_arr_float_uint_1_0 [[cbuf_d0]] 0
  53. // CHECK-NEXT: [[cbuf_d0_a0:%\d+]] = OpCompositeExtract %float [[cbuf_d0_a]] 0
  54. // CHECK-NEXT: [[sub_a:%\d+]] = OpCompositeConstruct %_arr_float_uint_1_1 [[cbuf_d0_a0]]
  55. // Reconstruct lbuf.d[0].b
  56. // CHECK-NEXT: [[cbuf_d0_b:%\d+]] = OpCompositeExtract %_arr_v2float_uint_1_0 [[cbuf_d0]] 1
  57. // CHECK-NEXT: [[cbuf_d0_b0:%\d+]] = OpCompositeExtract %v2float [[cbuf_d0_b]] 0
  58. // CHECK-NEXT: [[sub_b:%\d+]] = OpCompositeConstruct %_arr_v2float_uint_1_1 [[cbuf_d0_b0]]
  59. // Reconstruct lbuf.d[0].c
  60. // CHECK-NEXT: [[cbuf_d0_c:%\d+]] = OpCompositeExtract %_arr_mat2v3float_uint_1_0 [[cbuf_d0]] 2
  61. // CHECK-NEXT: [[cbuf_d0_c0:%\d+]] = OpCompositeExtract %mat2v3float [[cbuf_d0_c]] 0
  62. // CHECK-NEXT: [[sub_c:%\d+]] = OpCompositeConstruct %_arr_mat2v3float_uint_1_1 [[cbuf_d0_c0]]
  63. // CHECK-NEXT: [[sub_val:%\d+]] = OpCompositeConstruct %SubBuffer_1 [[sub_a]] [[sub_b]] [[sub_c]]
  64. // CHECK-NEXT: OpStore %sub [[sub_val]]
  65. SubBuffer sub = cbuf.d[0]; // %SubBuffer_1 <- %SubBuffer_0
  66. }