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: RWTexture1D(format=R32Uint, size=15, content=one):name uintTexture1D 9RWTexture1D<uint> uintTexture1D; 10//TEST_INPUT: RWTexture1D(format=R32Sint, size=15, content=one):name intTexture1D 11RWTexture1D<int> intTexture1D; 12 13//TEST_INPUT: RWTexture1D(format=R32Uint, size=15, content=one, arrayLength=2):name uintTexture1DArray 14RWTexture1DArray<uint> uintTexture1DArray; 15//TEST_INPUT: RWTexture1D(format=R32Sint, size=15, content=one, arrayLength=2):name intTexture1DArray 16RWTexture1DArray<int> intTexture1DArray; 17 18//TEST_INPUT: ubuffer(data=[0], stride=1, count=368):out,name outBuffer 19RWStructuredBuffer<int> outBuffer; 20 21void test() 22{ 23 int valInt = 3; 24 int originalValueInt = 999; 25 int compareValueInt = 1; 26 27 uint valUInt = 3; 28 uint originalValueUInt = 999; 29 int compareValueUInt = 1; 30 31 // Texture1D 32// METAL: .atomic_fetch_add 33// METAL: .atomic_fetch_and 34// METAL: .atomic_fetch_max 35// METAL: .atomic_fetch_min 36// METAL: .atomic_fetch_or 37// METAL: .atomic_fetch_xor 38// METAL: .atomic_fetch_add 39// METAL: .atomic_fetch_and 40// METAL: .atomic_fetch_max 41// METAL: .atomic_fetch_min 42// METAL: .atomic_fetch_or 43// METAL: .atomic_fetch_xor 44// METAL: .atomic_exchange 45// METAL: .atomic_compare_exchange_weak 46// METAL: .atomic_compare_exchange_weak 47 48// METAL: .atomic_fetch_add 49// METAL: .atomic_fetch_and 50// METAL: .atomic_fetch_max 51// METAL: .atomic_fetch_min 52// METAL: .atomic_fetch_or 53// METAL: .atomic_fetch_xor 54// METAL: .atomic_fetch_add 55// METAL: .atomic_fetch_and 56// METAL: .atomic_fetch_max 57// METAL: .atomic_fetch_min 58// METAL: .atomic_fetch_or 59// METAL: .atomic_fetch_xor 60// METAL: .atomic_exchange 61// METAL: .atomic_compare_exchange_weak 62// METAL: .atomic_compare_exchange_weak 63 int o = 0; 64 int i = 0; 65 InterlockedAdd(uintTexture1D[i++], valUInt); 66 InterlockedAnd(uintTexture1D[i++], valUInt); 67 InterlockedMax(uintTexture1D[i++], valUInt); 68 InterlockedMin(uintTexture1D[i++], valUInt); 69 InterlockedOr(uintTexture1D[i++], valUInt); 70 InterlockedXor(uintTexture1D[i++], valUInt); 71 InterlockedAdd(uintTexture1D[i++], valUInt, originalValueUInt); 72 outBuffer[o++] = originalValueUInt; 73 InterlockedAnd(uintTexture1D[i++], valUInt, originalValueUInt); 74 outBuffer[o++] = originalValueUInt; 75 InterlockedMax(uintTexture1D[i++], valUInt, originalValueUInt); 76 outBuffer[o++] = originalValueUInt; 77 InterlockedMin(uintTexture1D[i++], valUInt, originalValueUInt); 78 outBuffer[o++] = originalValueUInt; 79 InterlockedOr(uintTexture1D[i++], valUInt, originalValueUInt); 80 outBuffer[o++] = originalValueUInt; 81 InterlockedXor(uintTexture1D[i++], valUInt, originalValueUInt); 82 outBuffer[o++] = originalValueUInt; 83 InterlockedExchange(uintTexture1D[i++], valUInt, originalValueUInt); 84 outBuffer[o++] = originalValueUInt; 85 InterlockedCompareExchange(uintTexture1D[i++], valUInt, compareValueUInt, originalValueUInt); 86 outBuffer[o++] = originalValueUInt; 87 InterlockedCompareStore(uintTexture1D[i++], valUInt, compareValueUInt); 88 89 i = 0; 90 InterlockedAdd(intTexture1D[i++], valInt); 91 InterlockedAnd(intTexture1D[i++], valInt); 92 InterlockedMax(intTexture1D[i++], valInt); 93 InterlockedMin(intTexture1D[i++], valInt); 94 InterlockedOr(intTexture1D[i++], valInt); 95 InterlockedXor(intTexture1D[i++], valInt); 96 InterlockedAdd(intTexture1D[i++], valInt, originalValueInt); 97 outBuffer[o++] = originalValueInt; 98 InterlockedAnd(intTexture1D[i++], valInt, originalValueInt); 99 outBuffer[o++] = originalValueInt; 100 InterlockedMax(intTexture1D[i++], valInt, originalValueInt); 101 outBuffer[o++] = originalValueInt; 102 InterlockedMin(intTexture1D[i++], valInt, originalValueInt); 103 outBuffer[o++] = originalValueInt; 104 InterlockedOr(intTexture1D[i++], valInt, originalValueInt); 105 outBuffer[o++] = originalValueInt; 106 InterlockedXor(intTexture1D[i++], valInt, originalValueInt); 107 outBuffer[o++] = originalValueInt; 108 InterlockedExchange(intTexture1D[i++], valInt, originalValueInt); 109 outBuffer[o++] = originalValueInt; 110 InterlockedCompareExchange(intTexture1D[i++], valInt, compareValueInt, originalValueInt); 111 outBuffer[o++] = originalValueInt; 112 InterlockedCompareStore(intTexture1D[i++], valInt, compareValueUInt); 113 114 // Texture1DArray 115// METAL: .atomic_fetch_add 116// METAL: .atomic_fetch_and 117// METAL: .atomic_fetch_max 118// METAL: .atomic_fetch_min 119// METAL: .atomic_fetch_or 120// METAL: .atomic_fetch_xor 121// METAL: .atomic_fetch_add 122// METAL: .atomic_fetch_and 123// METAL: .atomic_fetch_max 124// METAL: .atomic_fetch_min 125// METAL: .atomic_fetch_or 126// METAL: .atomic_fetch_xor 127// METAL: .atomic_exchange 128// METAL: .atomic_compare_exchange_weak 129// METAL: .atomic_compare_exchange_weak 130 131// METAL: .atomic_fetch_add 132// METAL: .atomic_fetch_and 133// METAL: .atomic_fetch_max 134// METAL: .atomic_fetch_min 135// METAL: .atomic_fetch_or 136// METAL: .atomic_fetch_xor 137// METAL: .atomic_fetch_add 138// METAL: .atomic_fetch_and 139// METAL: .atomic_fetch_max 140// METAL: .atomic_fetch_min 141// METAL: .atomic_fetch_or 142// METAL: .atomic_fetch_xor 143// METAL: .atomic_exchange 144// METAL: .atomic_compare_exchange_weak 145// METAL: .atomic_compare_exchange_weak 146 i = 0; 147 InterlockedAdd(uintTexture1DArray[uint2(i++, 0)], valUInt); 148 InterlockedAnd(uintTexture1DArray[uint2(i++, 0)], valUInt); 149 InterlockedMax(uintTexture1DArray[uint2(i++, 0)], valUInt); 150 InterlockedMin(uintTexture1DArray[uint2(i++, 0)], valUInt); 151 InterlockedOr(uintTexture1DArray[uint2(i++, 0)], valUInt); 152 InterlockedXor(uintTexture1DArray[uint2(i++, 0)], valUInt); 153 InterlockedAdd(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 154 outBuffer[o++] = originalValueUInt; 155 InterlockedAnd(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 156 outBuffer[o++] = originalValueUInt; 157 InterlockedMax(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 158 outBuffer[o++] = originalValueUInt; 159 InterlockedMin(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 160 outBuffer[o++] = originalValueUInt; 161 InterlockedOr(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 162 outBuffer[o++] = originalValueUInt; 163 InterlockedXor(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 164 outBuffer[o++] = originalValueUInt; 165 InterlockedExchange(uintTexture1DArray[uint2(i++, 0)], valUInt, originalValueUInt); 166 outBuffer[o++] = originalValueUInt; 167 InterlockedCompareExchange(uintTexture1DArray[uint2(i++, 0)], valUInt, compareValueUInt, originalValueUInt); 168 outBuffer[o++] = originalValueUInt; 169 InterlockedCompareStore(uintTexture1DArray[uint2(i++, 0)], valUInt, compareValueUInt); 170 171 i = 0; 172 InterlockedAdd(intTexture1DArray[uint2(i++, 0)], valInt); 173 InterlockedAnd(intTexture1DArray[uint2(i++, 0)], valInt); 174 InterlockedMax(intTexture1DArray[uint2(i++, 0)], valInt); 175 InterlockedMin(intTexture1DArray[uint2(i++, 0)], valInt); 176 InterlockedOr(intTexture1DArray[uint2(i++, 0)], valInt); 177 InterlockedXor(intTexture1DArray[uint2(i++, 0)], valInt); 178 InterlockedAdd(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 179 outBuffer[o++] = originalValueInt; 180 InterlockedAnd(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 181 outBuffer[o++] = originalValueInt; 182 InterlockedMax(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 183 outBuffer[o++] = originalValueInt; 184 InterlockedMin(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 185 outBuffer[o++] = originalValueInt; 186 InterlockedOr(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 187 outBuffer[o++] = originalValueInt; 188 InterlockedXor(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 189 outBuffer[o++] = originalValueInt; 190 InterlockedExchange(intTexture1DArray[uint2(i++, 0)], valInt, originalValueInt); 191 outBuffer[o++] = originalValueInt; 192 InterlockedCompareExchange(intTexture1DArray[uint2(i++, 0)], valInt, compareValueInt, originalValueInt); 193 outBuffer[o++] = originalValueInt; 194 InterlockedCompareStore(intTexture1DArray[uint2(i++, 0)], valUInt, compareValueUInt); 195 196 // Copy to output 197 int test_count = i; 198 for (i=0; i<test_count; i++) { 199 outBuffer[o + test_count*0 + i] = uintTexture1D[i]; 200 outBuffer[o + test_count*1 + i] = intTexture1D[i]; 201 outBuffer[o + test_count*2 + i] = uintTexture1DArray[uint2(i, 0)]; 202 outBuffer[o + test_count*3 + i] = intTexture1DArray[uint2(i, 0)]; 203 } 204} 205 206[numthreads(1, 1, 1)] 207void computeMain() 208{ 209 test(); 210}