summaryrefslogtreecommitdiff
path: root/tests/metal/atomic-texture-buffer.slang
diff options
context:
space:
mode:
Diffstat (limited to 'tests/metal/atomic-texture-buffer.slang')
-rw-r--r--tests/metal/atomic-texture-buffer.slang97
1 files changed, 97 insertions, 0 deletions
diff --git a/tests/metal/atomic-texture-buffer.slang b/tests/metal/atomic-texture-buffer.slang
new file mode 100644
index 000000000..b1a5bcf25
--- /dev/null
+++ b/tests/metal/atomic-texture-buffer.slang
@@ -0,0 +1,97 @@
+//TEST:SIMPLE(filecheck=METAL): -target metal -stage compute -entry computeMain
+//TEST:SIMPLE(filecheck=METAL_FLOAT): -target metal -stage compute -entry computeMain -DFLOAT
+//TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage compute -entry computeMain
+
+// METAL_FLOAT: 'float' atomic texture operations are disallowed with Metal target's
+
+//METALLIB: @computeMain
+
+RWBuffer<uint> uintBuffer;
+RWBuffer<int> intBuffer;
+RWBuffer<float> floatBuffer;
+
+void test()
+{
+ int valInt = 1;
+ int originalValueInt;
+ int compareValueInt = 1;
+
+ uint valUInt = 1;
+ uint originalValueUInt;
+ int compareValueUInt = 1;
+
+ float valFloat = 1.0f;
+ float originalValueFloat;
+
+#ifdef FLOAT
+ //float
+ InterlockedExchange(floatBuffer[0], valFloat);
+ InterlockedExchange(floatBuffer[0], valFloat, originalValueFloat);
+#endif //FLOAT
+
+ // buffer
+// METAL: .atomic_fetch_add
+// METAL: .atomic_fetch_and
+// METAL: .atomic_fetch_max
+// METAL: .atomic_fetch_min
+// METAL: .atomic_fetch_or
+// METAL: .atomic_fetch_xor
+// METAL: .atomic_fetch_add
+// METAL: .atomic_fetch_and
+// METAL: .atomic_fetch_max
+// METAL: .atomic_fetch_min
+// METAL: .atomic_fetch_or
+// METAL: .atomic_fetch_xor
+// METAL: .atomic_exchange
+// METAL: .atomic_compare_exchange_weak
+
+// METAL: .atomic_fetch_add
+// METAL: .atomic_fetch_and
+// METAL: .atomic_fetch_max
+// METAL: .atomic_fetch_min
+// METAL: .atomic_fetch_or
+// METAL: .atomic_fetch_xor
+// METAL: .atomic_fetch_add
+// METAL: .atomic_fetch_and
+// METAL: .atomic_fetch_max
+// METAL: .atomic_fetch_min
+// METAL: .atomic_fetch_or
+// METAL: .atomic_fetch_xor
+// METAL: .atomic_exchange
+// METAL: .atomic_compare_exchange_weak
+ InterlockedAdd(intBuffer[0], valInt);
+ InterlockedAnd(intBuffer[0], valInt);
+ InterlockedMax(intBuffer[0], valInt);
+ InterlockedMin(intBuffer[0], valInt);
+ InterlockedOr(intBuffer[0], valInt);
+ InterlockedXor(intBuffer[0], valInt);
+ InterlockedAdd(intBuffer[0], valInt, originalValueInt);
+ InterlockedAnd(intBuffer[0], valInt, originalValueInt);
+ InterlockedMax(intBuffer[0], valInt, originalValueInt);
+ InterlockedMin(intBuffer[0], valInt, originalValueInt);
+ InterlockedOr(intBuffer[0], valInt, originalValueInt);
+ InterlockedXor(intBuffer[0], valInt, originalValueInt);
+ InterlockedExchange(intBuffer[0], valInt, originalValueInt);
+ InterlockedCompareExchange(intBuffer[0], valInt, compareValueInt, originalValueInt);
+
+ InterlockedAdd(uintBuffer[0], valUInt);
+ InterlockedAnd(uintBuffer[0], valUInt);
+ InterlockedMax(uintBuffer[0], valUInt);
+ InterlockedMin(uintBuffer[0], valUInt);
+ InterlockedOr(uintBuffer[0], valUInt);
+ InterlockedXor(uintBuffer[0], valUInt);
+ InterlockedAdd(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedAnd(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedMax(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedMin(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedOr(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedXor(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedExchange(uintBuffer[0], valUInt, originalValueUInt);
+ InterlockedCompareExchange(uintBuffer[0], valUInt, compareValueUInt, originalValueUInt);
+}
+
+[numthreads(1, 1, 1)]
+void computeMain()
+{
+ test();
+}