diff options
Diffstat (limited to 'tests/metal/atomic-texture-buffer.slang')
| -rw-r--r-- | tests/metal/atomic-texture-buffer.slang | 97 |
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(); +} |
