method.structured-buffer.load.hlsl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. // Run: %dxc -T ps_6_0 -E main
  2. struct SBuffer {
  3. float4 f1;
  4. float2x3 f2[3];
  5. };
  6. StructuredBuffer<SBuffer> mySBuffer1;
  7. RWStructuredBuffer<SBuffer> mySBuffer2;
  8. float4 main(int index: A) : SV_Target {
  9. // b1 and b2's type does not need layout decorations. So it's a different
  10. // SBuffer definition.
  11. // CHECK-NOT: OpMemberDecorate %SBuffer_0 0 Offset 0
  12. // CHECK: %_ptr_Function_SBuffer_0 = OpTypePointer Function %SBuffer_0
  13. // CHECK: %b1 = OpVariable %_ptr_Function_SBuffer_0 Function
  14. // CHECK-NEXT: %b2 = OpVariable %_ptr_Function_SBuffer_0 Function
  15. // CHECK: [[index:%\d+]] = OpLoad %int %index
  16. // CHECK: [[sb1:%\d+]] = OpAccessChain %_ptr_Uniform_SBuffer %mySBuffer1 %int_0 [[index]]
  17. // CHECK: {{%\d+}} = OpLoad %SBuffer [[sb1]]
  18. // CHECK: [[sb2:%\d+]] = OpAccessChain %_ptr_Uniform_SBuffer %mySBuffer2 %int_0 %int_0
  19. // CHECK: {{%\d+}} = OpLoad %SBuffer [[sb2]]
  20. SBuffer b1 = mySBuffer1.Load(index);
  21. SBuffer b2;
  22. b2 = mySBuffer2.Load(0);
  23. // CHECK: [[f1:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %mySBuffer1 %int_0 %int_5 %int_0
  24. // CHECK-NEXT: [[x:%\d+]] = OpAccessChain %_ptr_Uniform_float [[f1]] %int_0
  25. // CHECK-NEXT: {{%\d+}} = OpLoad %float [[x]]
  26. // CHECK: [[index:%\d+]] = OpLoad %int %index
  27. // CHECK-NEXT: [[f012:%\d+]] = OpAccessChain %_ptr_Uniform_float %mySBuffer2 %int_0 [[index]] %int_1 %int_0 %uint_1 %uint_2
  28. // CHECK-NEXT: {{%\d+}} = OpLoad %float [[f012]]
  29. return mySBuffer1.Load(5).f1.x + mySBuffer2.Load(index).f2[0][1][2];
  30. }