yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
8086adc90
master
1//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type 2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -dx12 -profile cs_6_0 -shaderobj -output-using-type -xslang -DDX12 3//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -emit-spirv-directly -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK 4//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -emit-spirv-via-glsl -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK -xslang -minimum-slang-optimization 5//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -emit-spirv-via-glsl -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK 6//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cuda -compute -shaderobj -output-using-type 7//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-metal -compute -shaderobj -output-using-type 8 9 10//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=uintBuffer 11RWStructuredBuffer<uint> uintBuffer; 12//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=intBuffer 13RWStructuredBuffer<int> intBuffer; 14 15groupshared uint shareMemUI[4]; 16groupshared int shareMemI[4]; 17 18//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer 19RWStructuredBuffer<float> outputBuffer; 20 21[numthreads(4, 1, 1)] 22void computeMain(uint groupIndex : SV_GroupIndex, int3 dispatchThreadID: SV_DispatchThreadID) 23{ 24 shareMemUI = { 0, 0, 0, 0 }; 25 shareMemI = { 0, 0, 0, 0 }; 26 AllMemoryBarrierWithGroupSync(); 27 int idx = dispatchThreadID.x; 28 float val = 0.0f; 29 30 // InterlockedAdd 31 InterlockedAdd(shareMemUI[idx], 1); 32 val += shareMemUI[idx]; 33 34 InterlockedAdd(shareMemI[idx], 2); 35 val += shareMemI[idx]; 36 37 InterlockedAdd(uintBuffer[idx], 1); 38 val += uintBuffer[idx]; 39 40 InterlockedAdd(intBuffer[idx], 2); 41 val += intBuffer[idx]; 42 43 InterlockedAdd(shareMemI[idx], -1); 44 val += shareMemI[idx]; 45 46 InterlockedAdd(intBuffer[idx], -1); 47 val += intBuffer[idx]; 48 49 // InterlockedAdd - original_value 50 uint origui = 0; 51 InterlockedAdd(shareMemUI[idx], 1, origui); 52 val += shareMemUI[idx]; 53 val += origui; 54 55 int origi = 0; 56 InterlockedAdd(shareMemI[idx], 2, origi); 57 val += shareMemI[idx]; 58 val += origi; 59 60 InterlockedAdd(uintBuffer[idx], 1, origui); 61 val += uintBuffer[idx]; 62 val += origui; 63 64 InterlockedAdd(intBuffer[idx], 2, origi); 65 val += intBuffer[idx]; 66 val += origi; 67 68 InterlockedAdd(shareMemI[idx], -1, origi); 69 val += shareMemI[idx]; 70 val += origi; 71 72 InterlockedAdd(intBuffer[idx], -1, origi); 73 val += intBuffer[idx]; 74 val += origi; 75 76 // InterlockedAnd 77 InterlockedAnd(shareMemUI[idx], 255); 78 val += shareMemUI[idx]; 79 80 InterlockedAnd(shareMemI[idx], 255); 81 val += shareMemI[idx]; 82 83 InterlockedAnd(uintBuffer[idx], 255); 84 val += uintBuffer[idx]; 85 86 InterlockedAnd(intBuffer[idx], 255); 87 val += intBuffer[idx]; 88 89 // InterlockedAnd - original_value 90 InterlockedAnd(shareMemUI[idx], 255, origui); 91 val += shareMemUI[idx]; 92 val += origui; 93 94 InterlockedAnd(shareMemI[idx], 255, origi); 95 val += shareMemI[idx]; 96 val += origi; 97 98 InterlockedAnd(uintBuffer[idx], 255, origui); 99 val += uintBuffer[idx]; 100 val += origui; 101 102 InterlockedAnd(intBuffer[idx], 255, origi); 103 val += intBuffer[idx]; 104 val += origi; 105 106 // InterlockedCompareExchange 107 InterlockedCompareExchange(shareMemUI[idx], 1, 0, origui); 108 val += shareMemUI[idx]; 109 val += origui; 110 111 InterlockedCompareExchange(shareMemI[idx], 1, 0, origi); 112 val += shareMemI[idx]; 113 val += origi; 114 115 InterlockedCompareExchange(uintBuffer[idx], 1, 0, origui); 116 val += uintBuffer[idx]; 117 val += origui; 118 119 InterlockedCompareExchange(intBuffer[idx], 1, 0, origi); 120 val += intBuffer[idx]; 121 val += origi; 122 123 // InterlockedCompareStore 124 InterlockedCompareStore(shareMemUI[idx], 255, 0); 125 val += shareMemUI[idx]; 126 127 InterlockedCompareStore(shareMemI[idx], 255, 0); 128 val += shareMemI[idx]; 129 130 InterlockedCompareStore(uintBuffer[idx], 255, 0); 131 val += uintBuffer[idx]; 132 133 InterlockedCompareStore(intBuffer[idx], 255, 0); 134 val += intBuffer[idx]; 135 136 // InterlockedExchange 137 InterlockedExchange(shareMemUI[idx], 1, origui); 138 val += shareMemUI[idx]; 139 val += origui; 140 141 InterlockedExchange(shareMemI[idx], 1, origi); 142 val += shareMemI[idx]; 143 val += origi; 144 145 InterlockedExchange(uintBuffer[idx], 1, origui); 146 val += uintBuffer[idx]; 147 val += origui; 148 149 InterlockedExchange(intBuffer[idx], 1, origi); 150 val += intBuffer[idx]; 151 val += origi; 152 153 // InterlockedMax 154 InterlockedMax(shareMemUI[idx], 0); 155 val += shareMemUI[idx]; 156 157 InterlockedMax(shareMemI[idx], 0); 158 val += shareMemI[idx]; 159 160 InterlockedMax(uintBuffer[idx], 0); 161 val += uintBuffer[idx]; 162 163 InterlockedMax(intBuffer[idx], 0); 164 val += intBuffer[idx]; 165 166 // InterlockedMax - original_value 167 InterlockedMax(shareMemUI[idx], 0, origui); 168 val += shareMemUI[idx]; 169 val += origui; 170 171 InterlockedMax(shareMemI[idx], 0, origi); 172 val += shareMemI[idx]; 173 val += origi; 174 175 InterlockedMax(uintBuffer[idx], 0, origui); 176 val += uintBuffer[idx]; 177 val += origui; 178 179 InterlockedMax(intBuffer[idx], 0, origi); 180 val += intBuffer[idx]; 181 val += origi; 182 183 // InterlockedMin 184 InterlockedMin(shareMemUI[idx], 0); 185 val += shareMemUI[idx]; 186 187 InterlockedMin(shareMemI[idx], 0); 188 val += shareMemI[idx]; 189 190 InterlockedMin(uintBuffer[idx], 0); 191 val += uintBuffer[idx]; 192 193 InterlockedMin(intBuffer[idx], 0); 194 val += intBuffer[idx]; 195 196 // InterlockedMin - original_value 197 InterlockedMin(shareMemUI[idx], 0, origui); 198 val += shareMemUI[idx]; 199 val += origui; 200 201 InterlockedMin(shareMemI[idx], 0, origi); 202 val += shareMemI[idx]; 203 val += origi; 204 205 InterlockedMin(uintBuffer[idx], 0, origui); 206 val += uintBuffer[idx]; 207 val += origui; 208 209 InterlockedMin(intBuffer[idx], 0, origi); 210 val += intBuffer[idx]; 211 val += origi; 212 213 // InterlockedOr 214 InterlockedOr(shareMemUI[idx], 2); 215 val += shareMemUI[idx]; 216 217 InterlockedOr(shareMemI[idx], 4); 218 val += shareMemI[idx]; 219 220 InterlockedOr(uintBuffer[idx], 6); 221 val += uintBuffer[idx]; 222 223 InterlockedOr(intBuffer[idx], 8); 224 val += intBuffer[idx]; 225 226 // InterlockedOr - original_value 227 InterlockedOr(shareMemUI[idx], 2, origui); 228 val += shareMemUI[idx]; 229 val += origui; 230 231 InterlockedOr(shareMemI[idx], 4, origi); 232 val += shareMemI[idx]; 233 val += origi; 234 235 InterlockedOr(uintBuffer[idx], 6, origui); 236 val += uintBuffer[idx]; 237 val += origui; 238 239 InterlockedOr(intBuffer[idx], 8, origi); 240 val += intBuffer[idx]; 241 val += origi; 242 243 // InterlockedXor 244 InterlockedXor(shareMemUI[idx], 2); 245 val += shareMemUI[idx]; 246 247 InterlockedXor(shareMemI[idx], 4); 248 val += shareMemI[idx]; 249 250 InterlockedXor(uintBuffer[idx], 6); 251 val += uintBuffer[idx]; 252 253 InterlockedXor(intBuffer[idx], 8); 254 val += intBuffer[idx]; 255 256 // InterlockedXor - original_value 257 InterlockedXor(shareMemUI[idx], 2, origui); 258 val += shareMemUI[idx]; 259 val += origui; 260 261 InterlockedXor(shareMemI[idx], 4, origi); 262 val += shareMemI[idx]; 263 val += origi; 264 265 InterlockedXor(uintBuffer[idx], 6, origui); 266 val += uintBuffer[idx]; 267 val += origui; 268 269 InterlockedXor(intBuffer[idx], 8, origi); 270 val += intBuffer[idx]; 271 val += origi; 272 273 // BUF: 184 274 // BUF-NEXT: 207 275 // BUF-NEXT: 230 276 // BUF-NEXT: 253 277 outputBuffer[idx] = val; 278}