method.append-structured-buffer.append.hlsl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Run: %dxc -T vs_6_0 -E main
  2. struct S {
  3. float a;
  4. float3 b;
  5. float2x3 c;
  6. };
  7. AppendStructuredBuffer<float4> buffer1;
  8. AppendStructuredBuffer<S> buffer2;
  9. // Use this to test appending a consumed value.
  10. ConsumeStructuredBuffer<float4> buffer3;
  11. void main(float4 vec: A) {
  12. // CHECK: [[counter:%\d+]] = OpAccessChain %_ptr_Uniform_int %counter_var_buffer1 %uint_0
  13. // CHECK-NEXT: [[index:%\d+]] = OpAtomicIAdd %int [[counter]] %uint_1 %uint_0 %int_1
  14. // CHECK-NEXT: [[buffer1:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %buffer1 %uint_0 [[index]]
  15. // CHECK-NEXT: [[vec:%\d+]] = OpLoad %v4float %vec
  16. // CHECK-NEXT: OpStore [[buffer1]] [[vec]]
  17. buffer1.Append(vec);
  18. S s; // Will use a separate S type without layout decorations
  19. // CHECK-NEXT: [[counter:%\d+]] = OpAccessChain %_ptr_Uniform_int %counter_var_buffer2 %uint_0
  20. // CHECK-NEXT: [[index:%\d+]] = OpAtomicIAdd %int [[counter]] %uint_1 %uint_0 %int_1
  21. // CHECK-NEXT: [[buffer2:%\d+]] = OpAccessChain %_ptr_Uniform_S %buffer2 %uint_0 [[index]]
  22. // CHECK-NEXT: [[s:%\d+]] = OpLoad %S_0 %s
  23. // CHECK-NEXT: [[s_a:%\d+]] = OpCompositeExtract %float [[s]] 0
  24. // CHECK-NEXT: [[s_b:%\d+]] = OpCompositeExtract %v3float [[s]] 1
  25. // CHECK-NEXT: [[s_c:%\d+]] = OpCompositeExtract %mat2v3float [[s]] 2
  26. // CHECK-NEXT: [[val:%\d+]] = OpCompositeConstruct %S [[s_a]] [[s_b]] [[s_c]]
  27. // CHECK-NEXT: OpStore [[buffer2]] [[val]]
  28. buffer2.Append(s);
  29. // CHECK: [[buffer1:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %buffer1 %uint_0 {{%\d+}}
  30. // CHECK: [[consumed_ptr:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %buffer3 %uint_0 {{%\d+}}
  31. // CHECK-NEXT: [[consumed:%\d+]] = OpLoad %v4float [[consumed_ptr]]
  32. // CHECK-NEXT: OpStore [[buffer1]] [[consumed]]
  33. buffer1.Append(buffer3.Consume());
  34. }