summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/hlsl-intrinsic/atomic/atomic-intrinsics.slang277
1 files changed, 277 insertions, 0 deletions
diff --git a/tests/hlsl-intrinsic/atomic/atomic-intrinsics.slang b/tests/hlsl-intrinsic/atomic/atomic-intrinsics.slang
new file mode 100644
index 000000000..9ba89ac54
--- /dev/null
+++ b/tests/hlsl-intrinsic/atomic/atomic-intrinsics.slang
@@ -0,0 +1,277 @@
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX12):-slang -compute -dx12 -profile cs_6_0 -use-dxil -shaderobj -output-using-type -xslang -DDX12
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=VK):-vk -emit-spirv-directly -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK
+//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
+
+
+//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=uintBuffer
+RWStructuredBuffer<uint> uintBuffer;
+//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=intBuffer
+RWStructuredBuffer<int> intBuffer;
+
+groupshared uint shareMemUI[4] = { 0, 0, 0, 0 };
+groupshared int shareMemI[4] = { 0, 0, 0, 0 };
+
+//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint groupIndex : SV_GroupIndex, int3 dispatchThreadID: SV_DispatchThreadID)
+{
+ int idx = dispatchThreadID.x;
+ float val = 0.0f;
+
+ // InterlockedAdd
+ InterlockedAdd(shareMemUI[idx], 1);
+ val += shareMemUI[idx];
+
+ InterlockedAdd(shareMemI[idx], 2);
+ val += shareMemI[idx];
+
+ InterlockedAdd(uintBuffer[idx], 1);
+ val += uintBuffer[idx];
+
+ InterlockedAdd(intBuffer[idx], 2);
+ val += intBuffer[idx];
+
+ InterlockedAdd(shareMemI[idx], -1);
+ val += shareMemI[idx];
+
+ InterlockedAdd(intBuffer[idx], -1);
+ val += intBuffer[idx];
+
+ // InterlockedAdd - original_value
+ uint origui = 0;
+ InterlockedAdd(shareMemUI[idx], 1, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ int origi = 0;
+ InterlockedAdd(shareMemI[idx], 2, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedAdd(uintBuffer[idx], 1, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedAdd(intBuffer[idx], 2, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ InterlockedAdd(shareMemI[idx], -1, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedAdd(intBuffer[idx], -1, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedAnd
+ InterlockedAnd(shareMemUI[idx], 255);
+ val += shareMemUI[idx];
+
+ InterlockedAnd(shareMemI[idx], 255);
+ val += shareMemI[idx];
+
+ InterlockedAnd(uintBuffer[idx], 255);
+ val += uintBuffer[idx];
+
+ InterlockedAnd(intBuffer[idx], 255);
+ val += intBuffer[idx];
+
+ // InterlockedAnd - original_value
+ InterlockedAnd(shareMemUI[idx], 255, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedAnd(shareMemI[idx], 255, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedAnd(uintBuffer[idx], 255, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedAnd(intBuffer[idx], 255, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedCompareExchange
+ InterlockedCompareExchange(shareMemUI[idx], 1, 0, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedCompareExchange(shareMemI[idx], 1, 0, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedCompareExchange(uintBuffer[idx], 1, 0, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedCompareExchange(intBuffer[idx], 1, 0, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedCompareStore
+ InterlockedCompareStore(shareMemUI[idx], 255, 0);
+ val += shareMemUI[idx];
+
+ InterlockedCompareStore(shareMemI[idx], 255, 0);
+ val += shareMemI[idx];
+
+ InterlockedCompareStore(uintBuffer[idx], 255, 0);
+ val += uintBuffer[idx];
+
+ InterlockedCompareStore(intBuffer[idx], 255, 0);
+ val += intBuffer[idx];
+
+ // InterlockedExchange
+ InterlockedExchange(shareMemUI[idx], 1, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedExchange(shareMemI[idx], 1, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedExchange(uintBuffer[idx], 1, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedExchange(intBuffer[idx], 1, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedMax
+ InterlockedMax(shareMemUI[idx], 0);
+ val += shareMemUI[idx];
+
+ InterlockedMax(shareMemI[idx], 0);
+ val += shareMemI[idx];
+
+ InterlockedMax(uintBuffer[idx], 0);
+ val += uintBuffer[idx];
+
+ InterlockedMax(intBuffer[idx], 0);
+ val += intBuffer[idx];
+
+ // InterlockedMax - original_value
+ InterlockedMax(shareMemUI[idx], 0, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedMax(shareMemI[idx], 0, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedMax(uintBuffer[idx], 0, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedMax(intBuffer[idx], 0, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedMin
+ InterlockedMin(shareMemUI[idx], 0);
+ val += shareMemUI[idx];
+
+ InterlockedMin(shareMemI[idx], 0);
+ val += shareMemI[idx];
+
+ InterlockedMin(uintBuffer[idx], 0);
+ val += uintBuffer[idx];
+
+ InterlockedMin(intBuffer[idx], 0);
+ val += intBuffer[idx];
+
+ // InterlockedMin - original_value
+ InterlockedMin(shareMemUI[idx], 0, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedMin(shareMemI[idx], 0, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedMin(uintBuffer[idx], 0, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedMin(intBuffer[idx], 0, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedOr
+ InterlockedOr(shareMemUI[idx], 2);
+ val += shareMemUI[idx];
+
+ InterlockedOr(shareMemI[idx], 4);
+ val += shareMemI[idx];
+
+ InterlockedOr(uintBuffer[idx], 6);
+ val += uintBuffer[idx];
+
+ InterlockedOr(intBuffer[idx], 8);
+ val += intBuffer[idx];
+
+ // InterlockedOr - original_value
+ InterlockedOr(shareMemUI[idx], 2, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedOr(shareMemI[idx], 4, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedOr(uintBuffer[idx], 6, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedOr(intBuffer[idx], 8, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ // InterlockedXor
+ InterlockedXor(shareMemUI[idx], 2);
+ val += shareMemUI[idx];
+
+ InterlockedXor(shareMemI[idx], 4);
+ val += shareMemI[idx];
+
+ InterlockedXor(uintBuffer[idx], 6);
+ val += uintBuffer[idx];
+
+ InterlockedXor(intBuffer[idx], 8);
+ val += intBuffer[idx];
+
+ // InterlockedXor - original_value
+ InterlockedXor(shareMemUI[idx], 2, origui);
+ val += shareMemUI[idx];
+ val += origui;
+
+ InterlockedXor(shareMemI[idx], 4, origi);
+ val += shareMemI[idx];
+ val += origi;
+
+ InterlockedXor(uintBuffer[idx], 6, origui);
+ val += uintBuffer[idx];
+ val += origui;
+
+ InterlockedXor(intBuffer[idx], 8, origi);
+ val += intBuffer[idx];
+ val += origi;
+
+ outputBuffer[idx] = val;
+}
+
+// DX12: 184
+// DX12: 207
+// DX12: 230
+// DX12: 253
+// VK: 184
+// VK: 207
+// VK: 230
+// VK: 253 \ No newline at end of file