method.rw-byte-address-buffer.atomic.hlsl 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Run: %dxc -T ps_6_0 -E main
  2. // Note: According to HLSL reference (https://msdn.microsoft.com/en-us/library/windows/desktop/ff471475(v=vs.85).aspx),
  3. // all RWByteAddressBuffer atomic methods must take unsigned integers as parameters.
  4. RWByteAddressBuffer myBuffer;
  5. float4 main() : SV_Target
  6. {
  7. uint originalVal;
  8. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  9. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  10. // CHECK-NEXT: {{%\d+}} = OpAtomicIAdd %uint [[ptr]] %uint_1 %uint_0 %uint_42
  11. myBuffer.InterlockedAdd(16, 42);
  12. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  13. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  14. // CHECK-NEXT: [[val:%\d+]] = OpAtomicIAdd %uint [[ptr]] %uint_1 %uint_0 %uint_42
  15. // CHECK-NEXT: OpStore %originalVal [[val]]
  16. myBuffer.InterlockedAdd(16, 42, originalVal);
  17. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  18. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  19. // CHECK-NEXT: {{%\d+}} = OpAtomicAnd %uint [[ptr]] %uint_1 %uint_0 %uint_42
  20. myBuffer.InterlockedAnd(16, 42);
  21. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  22. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  23. // CHECK-NEXT: [[val:%\d+]] = OpAtomicAnd %uint [[ptr]] %uint_1 %uint_0 %uint_42
  24. // CHECK-NEXT: OpStore %originalVal [[val]]
  25. myBuffer.InterlockedAnd(16, 42, originalVal);
  26. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  27. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  28. // CHECK-NEXT: {{%\d+}} = OpAtomicOr %uint [[ptr]] %uint_1 %uint_0 %uint_42
  29. myBuffer.InterlockedOr(16, 42);
  30. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  31. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  32. // CHECK-NEXT: [[val:%\d+]] = OpAtomicOr %uint [[ptr]] %uint_1 %uint_0 %uint_42
  33. // CHECK-NEXT: OpStore %originalVal [[val]]
  34. myBuffer.InterlockedOr(16, 42, originalVal);
  35. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  36. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  37. // CHECK-NEXT: {{%\d+}} = OpAtomicXor %uint [[ptr]] %uint_1 %uint_0 %uint_42
  38. myBuffer.InterlockedXor(16, 42);
  39. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  40. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  41. // CHECK-NEXT: [[val:%\d+]] = OpAtomicXor %uint [[ptr]] %uint_1 %uint_0 %uint_42
  42. // CHECK-NEXT: OpStore %originalVal [[val]]
  43. myBuffer.InterlockedXor(16, 42, originalVal);
  44. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  45. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  46. // CHECK-NEXT: {{%\d+}} = OpAtomicUMax %uint [[ptr]] %uint_1 %uint_0 %uint_42
  47. myBuffer.InterlockedMax(16, 42);
  48. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  49. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  50. // CHECK-NEXT: [[val:%\d+]] = OpAtomicUMax %uint [[ptr]] %uint_1 %uint_0 %uint_42
  51. // CHECK-NEXT: OpStore %originalVal [[val]]
  52. myBuffer.InterlockedMax(16, 42, originalVal);
  53. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  54. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  55. // CHECK-NEXT: {{%\d+}} = OpAtomicUMax %uint [[ptr]] %uint_1 %uint_0 %uint_42
  56. myBuffer.InterlockedMax(16, 42);
  57. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  58. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  59. // CHECK-NEXT: [[val:%\d+]] = OpAtomicUMax %uint [[ptr]] %uint_1 %uint_0 %uint_42
  60. // CHECK-NEXT: OpStore %originalVal [[val]]
  61. myBuffer.InterlockedMax(16, 42, originalVal);
  62. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  63. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  64. // CHECK-NEXT: {{%\d+}} = OpAtomicUMin %uint [[ptr]] %uint_1 %uint_0 %uint_42
  65. myBuffer.InterlockedMin(16, 42);
  66. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  67. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  68. // CHECK-NEXT: [[val:%\d+]] = OpAtomicUMin %uint [[ptr]] %uint_1 %uint_0 %uint_42
  69. // CHECK-NEXT: OpStore %originalVal [[val]]
  70. myBuffer.InterlockedMin(16, 42, originalVal);
  71. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  72. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  73. // CHECK-NEXT: {{%\d+}} = OpAtomicUMin %uint [[ptr]] %uint_1 %uint_0 %uint_42
  74. myBuffer.InterlockedMin(16, 42);
  75. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  76. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  77. // CHECK-NEXT: [[val:%\d+]] = OpAtomicUMin %uint [[ptr]] %uint_1 %uint_0 %uint_42
  78. // CHECK-NEXT: OpStore %originalVal [[val]]
  79. myBuffer.InterlockedMin(16, 42, originalVal);
  80. // .InterlockedExchnage() has no two-parameter overload.
  81. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  82. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  83. // CHECK-NEXT: [[val:%\d+]] = OpAtomicExchange %uint [[ptr]] %uint_1 %uint_0 %uint_42
  84. // CHECK-NEXT: OpStore %originalVal [[val]]
  85. myBuffer.InterlockedExchange(16, 42, originalVal);
  86. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  87. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  88. // CHECK-NEXT: [[val:%\d+]] = OpAtomicCompareExchange %uint [[ptr]] %uint_1 %uint_0 %uint_0 %uint_42 %uint_30
  89. // CHECK-NEXT: OpStore %originalVal [[val]]
  90. myBuffer.InterlockedCompareExchange(/*offset=*/16, /*compare_value=*/30, /*value=*/42, originalVal);
  91. // CHECK: [[offset:%\d+]] = OpShiftRightLogical %uint %uint_16 %uint_2
  92. // CHECK-NEXT: [[ptr:%\d+]] = OpAccessChain %_ptr_Uniform_uint %myBuffer %uint_0 [[offset]]
  93. // CHECK-NEXT: [[val:%\d+]] = OpAtomicCompareExchange %uint [[ptr]] %uint_1 %uint_0 %uint_0 %uint_42 %uint_30
  94. // CHECK-NOT: [[val]]
  95. myBuffer.InterlockedCompareStore(/*offset=*/16, /*compare_value=*/30, /*value=*/42);
  96. return 1.0;
  97. }