op.array.access.hlsl 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Run: %dxc -T vs_6_0 -E main
  2. // TODO: collect consecutive OpAccessChains into one
  3. struct S {
  4. float f[4]; // nested array
  5. float g[4]; // nested array
  6. };
  7. // CHECK-LABLE: %src_main
  8. float main(float val: A, uint index: B) : C {
  9. float r;
  10. S var[8][16]; // struct element
  11. float4 vecvar[4]; // vector element
  12. float2x3 matvar[4]; // matrix element
  13. // CHECK: [[val:%\d+]] = OpLoad %float %val
  14. // CHECK-NEXT: [[idx:%\d+]] = OpLoad %uint %index
  15. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_float %var [[idx]] %int_1 %int_0 %int_2
  16. // CHECK-NEXT: OpStore [[ptr0]] [[val]]
  17. var[index][1].f[2] = val;
  18. // CHECK-NEXT: [[idx0:%\d+]] = OpLoad %uint %index
  19. // CHECK-NEXT: [[idx1:%\d+]] = OpLoad %uint %index
  20. // CHECK: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_float %var %int_0 [[idx0]] %int_1 [[idx1]]
  21. // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr0]]
  22. // CHECK-NEXT: OpStore %r [[load]]
  23. r = var[0][index].g[index];
  24. // CHECK: [[val:%\d+]] = OpLoad %float %val
  25. // CHECK-NEXT: [[vec2:%\d+]] = OpCompositeConstruct %v2float [[val]] [[val]]
  26. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_v4float %vecvar %int_3
  27. // CHECK-NEXT: [[vec4:%\d+]] = OpLoad %v4float [[ptr0]]
  28. // CHECK-NEXT: [[res:%\d+]] = OpVectorShuffle %v4float [[vec4]] [[vec2]] 0 1 5 4
  29. // CHECK-NEXT: OpStore [[ptr0]] [[res]]
  30. vecvar[3].ab = val;
  31. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Function_float %vecvar %int_2 %uint_1
  32. // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr2]]
  33. // CHECK-NEXT: OpStore %r [[load]]
  34. r = vecvar[2][1];
  35. // CHECK: [[val:%\d+]] = OpLoad %float %val
  36. // CHECK-NEXT: [[vec2:%\d+]] = OpCompositeConstruct %v2float [[val]] [[val]]
  37. // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %matvar %int_2
  38. // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %float [[vec2]] 0
  39. // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Function_float [[ptr0]] %int_0 %int_1
  40. // CHECK-NEXT: OpStore [[ptr1]] [[val0]]
  41. // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %float [[vec2]] 1
  42. // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Function_float [[ptr0]] %int_1 %int_2
  43. // CHECK-NEXT: OpStore [[ptr2]] [[val1]]
  44. matvar[2]._12_23 = val;
  45. // CHECK-NEXT: [[ptr4:%\d+]] = OpAccessChain %_ptr_Function_float %matvar %int_0 %uint_1 %uint_2
  46. // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr4]]
  47. // CHECK-NEXT: OpStore %r [[load]]
  48. r = matvar[0][1][2];
  49. return r;
  50. }