yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
8086adc90
master
1//TEST:SIMPLE(filecheck=METAL): -target metal -stage compute -entry computeMain 2//TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage compute -entry computeMain 3//TEST(compute, metal):COMPARE_COMPUTE_EX:-metal -compute -output-using-type 4//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type 5 6//METALLIB: @computeMain 7 8//TEST_INPUT: RWTexture3D(format=R32Uint, size=15, content=one):name uintTexture3D 9RWTexture3D<uint> uintTexture3D; 10//TEST_INPUT: RWTexture3D(format=R32Sint, size=15, content=one):name intTexture3D 11RWTexture3D<int> intTexture3D; 12 13//TEST_INPUT: ubuffer(data=[0], stride=1, count=184):out,name outBuffer 14RWStructuredBuffer<int> outBuffer; 15 16void test() 17{ 18 int valInt = 3; 19 int originalValueInt = 999; 20 int compareValueInt = 1; 21 22 uint valUInt = 3; 23 uint originalValueUInt = 999; 24 int compareValueUInt = 1; 25 26 // Texture3D 27// METAL: .atomic_fetch_add 28// METAL: .atomic_fetch_and 29// METAL: .atomic_fetch_max 30// METAL: .atomic_fetch_min 31// METAL: .atomic_fetch_or 32// METAL: .atomic_fetch_xor 33// METAL: .atomic_fetch_add 34// METAL: .atomic_fetch_and 35// METAL: .atomic_fetch_max 36// METAL: .atomic_fetch_min 37// METAL: .atomic_fetch_or 38// METAL: .atomic_fetch_xor 39// METAL: .atomic_exchange 40// METAL: .atomic_compare_exchange_weak 41// METAL: .atomic_compare_exchange_weak 42 43// METAL: .atomic_fetch_add 44// METAL: .atomic_fetch_and 45// METAL: .atomic_fetch_max 46// METAL: .atomic_fetch_min 47// METAL: .atomic_fetch_or 48// METAL: .atomic_fetch_xor 49// METAL: .atomic_fetch_add 50// METAL: .atomic_fetch_and 51// METAL: .atomic_fetch_max 52// METAL: .atomic_fetch_min 53// METAL: .atomic_fetch_or 54// METAL: .atomic_fetch_xor 55// METAL: .atomic_exchange 56// METAL: .atomic_compare_exchange_weak 57// METAL: .atomic_compare_exchange_weak 58 int o = 0; 59 int i = 0; 60 InterlockedAdd(uintTexture3D[uint3(i++, 0, 0)], valUInt); 61 InterlockedAnd(uintTexture3D[uint3(i++, 0, 0)], valUInt); 62 InterlockedMax(uintTexture3D[uint3(i++, 0, 0)], valUInt); 63 InterlockedMin(uintTexture3D[uint3(i++, 0, 0)], valUInt); 64 InterlockedOr(uintTexture3D[uint3(i++, 0, 0)], valUInt); 65 InterlockedXor(uintTexture3D[uint3(i++, 0, 0)], valUInt); 66 InterlockedAdd(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 67 outBuffer[o++] = originalValueUInt; 68 InterlockedAnd(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 69 outBuffer[o++] = originalValueUInt; 70 InterlockedMax(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 71 outBuffer[o++] = originalValueUInt; 72 InterlockedMin(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 73 outBuffer[o++] = originalValueUInt; 74 InterlockedOr(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 75 outBuffer[o++] = originalValueUInt; 76 InterlockedXor(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 77 outBuffer[o++] = originalValueUInt; 78 InterlockedExchange(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt); 79 outBuffer[o++] = originalValueUInt; 80 InterlockedCompareExchange(uintTexture3D[uint3(i++, 0, 0)], valUInt, compareValueUInt, originalValueUInt); 81 outBuffer[o++] = originalValueUInt; 82 InterlockedCompareStore(uintTexture3D[uint3(i++, 0, 0)], valUInt, compareValueUInt); 83 84 i = 0; 85 InterlockedAdd(intTexture3D[uint3(i++, 0, 0)], valInt); 86 InterlockedAnd(intTexture3D[uint3(i++, 0, 0)], valInt); 87 InterlockedMax(intTexture3D[uint3(i++, 0, 0)], valInt); 88 InterlockedMin(intTexture3D[uint3(i++, 0, 0)], valInt); 89 InterlockedOr(intTexture3D[uint3(i++, 0, 0)], valInt); 90 InterlockedXor(intTexture3D[uint3(i++, 0, 0)], valInt); 91 InterlockedAdd(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 92 outBuffer[o++] = originalValueInt; 93 InterlockedAnd(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 94 outBuffer[o++] = originalValueInt; 95 InterlockedMax(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 96 outBuffer[o++] = originalValueInt; 97 InterlockedMin(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 98 outBuffer[o++] = originalValueInt; 99 InterlockedOr(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 100 outBuffer[o++] = originalValueInt; 101 InterlockedXor(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 102 outBuffer[o++] = originalValueInt; 103 InterlockedExchange(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt); 104 outBuffer[o++] = originalValueInt; 105 InterlockedCompareExchange(intTexture3D[uint3(i++, 0, 0)], valInt, compareValueInt, originalValueInt); 106 outBuffer[o++] = originalValueInt; 107 InterlockedCompareStore(intTexture3D[uint3(i++, 0, 0)], valInt, compareValueUInt); 108 109 110 // Copy to output 111 int test_count = i; 112 for (i=0; i<test_count; i++) { 113 outBuffer[o + test_count*0 + i] = uintTexture3D[uint3(i, 0, 0)]; 114 outBuffer[o + test_count*1 + i] = intTexture3D[uint3(i, 0, 0)]; 115 } 116} 117 118[numthreads(1, 1, 1)] 119void computeMain() 120{ 121 test(); 122}