method.consume-structured-buffer.consume.hlsl 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Run: %dxc -T vs_6_0 -E main
  2. struct S {
  3. float a;
  4. float3 b;
  5. float2x3 c;
  6. };
  7. struct T {
  8. S s[5];
  9. };
  10. ConsumeStructuredBuffer<float4> buffer1;
  11. ConsumeStructuredBuffer<S> buffer2;
  12. ConsumeStructuredBuffer<T> buffer3;
  13. float4 main() : A {
  14. // CHECK: [[counter:%\d+]] = OpAccessChain %_ptr_Uniform_int %counter_var_buffer1 %uint_0
  15. // CHECK-NEXT: [[prev:%\d+]] = OpAtomicISub %int [[counter]] %uint_1 %uint_0 %int_1
  16. // CHECK-NEXT: [[index:%\d+]] = OpISub %int [[prev]] %int_1
  17. // CHECK-NEXT: [[buffer1:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %buffer1 %uint_0 [[index]]
  18. // CHECK-NEXT: [[val:%\d+]] = OpLoad %v4float [[buffer1]]
  19. // CHECK-NEXT: OpStore %v [[val]]
  20. float4 v = buffer1.Consume();
  21. S s; // Will use a separate S type without layout decorations
  22. // CHECK-NEXT: [[counter:%\d+]] = OpAccessChain %_ptr_Uniform_int %counter_var_buffer2 %uint_0
  23. // CHECK-NEXT: [[prev:%\d+]] = OpAtomicISub %int [[counter]] %uint_1 %uint_0 %int_1
  24. // CHECK-NEXT: [[index:%\d+]] = OpISub %int [[prev]] %int_1
  25. // CHECK-NEXT: [[buffer2:%\d+]] = OpAccessChain %_ptr_Uniform_S %buffer2 %uint_0 [[index]]
  26. // CHECK-NEXT: [[val:%\d+]] = OpLoad %S [[buffer2]]
  27. // CHECK-NEXT: [[buffer20:%\d+]] = OpCompositeExtract %float [[val]] 0
  28. // CHECK-NEXT: [[s0:%\d+]] = OpAccessChain %_ptr_Function_float %s %uint_0
  29. // CHECK-NEXT: OpStore [[s0]] [[buffer20]]
  30. // CHECK-NEXT: [[buffer21:%\d+]] = OpCompositeExtract %v3float [[val]] 1
  31. // CHECK-NEXT: [[s1:%\d+]] = OpAccessChain %_ptr_Function_v3float %s %uint_1
  32. // CHECK-NEXT: OpStore [[s1]] [[buffer21]]
  33. // CHECK-NEXT: [[buffer22:%\d+]] = OpCompositeExtract %mat2v3float [[val]] 2
  34. // CHECK-NEXT: [[s2:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %s %uint_2
  35. // CHECK-NEXT: OpStore [[s2]] [[buffer22]]
  36. s = buffer2.Consume();
  37. // CHECK: [[counter:%\d+]] = OpAccessChain %_ptr_Uniform_int %counter_var_buffer3 %uint_0
  38. // CHECK-NEXT: [[prev:%\d+]] = OpAtomicISub %int [[counter]] %uint_1 %uint_0 %int_1
  39. // CHECK-NEXT: [[index:%\d+]] = OpISub %int [[prev]] %int_1
  40. // CHECK-NEXT: [[buffer3:%\d+]] = OpAccessChain %_ptr_Uniform_T %buffer3 %uint_0 [[index]]
  41. // CHECK-NEXT: [[ac:%\d+]] = OpAccessChain %_ptr_Uniform_v3float [[buffer3]] %int_0 %int_3 %int_1
  42. // CHECK-NEXT: [[val:%\d+]] = OpLoad %v3float [[ac]]
  43. // CHECK-NEXT: OpStore %val [[val]]
  44. float3 val = buffer3.Consume().s[3].b;
  45. return v;
  46. }