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=MTL):-target metal -entry computeMain -stage compute -DMETAL 2//TEST:SIMPLE(filecheck=LIB):-target metallib -entry computeMain -stage compute -DMETAL 3//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-slang -compute -dx12 -profile cs_6_0 -shaderobj -output-using-type 4//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -shaderobj -output-using-type 5//TEST(compute, metal):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-metal -compute -shaderobj -output-using-type 6 7//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type 8//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type 9 10 11//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=uintBuffer 12RWStructuredBuffer<uint> uintBuffer; 13//TEST_INPUT:ubuffer(data=[0 1 2 3], stride=4):name=intBuffer 14RWStructuredBuffer<int> intBuffer; 15 16groupshared uint shareMemUI[4]; 17groupshared int shareMemI[4]; 18 19//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer 20RWStructuredBuffer<float> outputBuffer; 21 22[numthreads(4, 1, 1)] 23void computeMain(uint groupIndex : SV_GroupIndex) 24{ 25 if (groupIndex == 0) 26 { 27 for (int i = 0; i < 4; ++i) 28 { 29 shareMemUI[i] = 0U; 30 shareMemI[i] = 0; 31 } 32 } 33 AllMemoryBarrierWithGroupSync(); 34 35 int idx = groupIndex; 36 float val = 0.0f; 37 38 // InterlockedAdd 39 //MTL: atomic_uint threadgroup*{{.*}}shareMemUI 40 //LIB: call {{.*}}.atomic.local.add.u.i32 41 InterlockedAdd(shareMemUI[idx], uint(1)); 42 val += shareMemUI[idx]; 43 44 //MTL: atomic_int threadgroup*{{.*}}shareMemI 45 //LIB: call {{.*}}.atomic.local.add.s.i32 46 InterlockedAdd(shareMemI[idx], 2); 47 val += shareMemI[idx]; 48 49 //MTL: atomic_uint device*{{.*}}uintBuffer 50 //LIB: call {{.*}}.atomic.global.add.u.i32 51 InterlockedAdd(uintBuffer[idx], 1); 52 val += uintBuffer[idx]; 53 54 //MTL: atomic_int device*{{.*}}intBuffer 55 //LIB: call {{.*}}.atomic.global.add.s.i32 56 InterlockedAdd(intBuffer[idx], 2); 57 val += intBuffer[idx]; 58 59 //LIB: call {{.*}}.atomic.local.add.s.i32 60 InterlockedAdd(shareMemI[idx], -1); 61 val += shareMemI[idx]; 62 63 //LIB: call {{.*}}.atomic.global.add.s.i32 64 InterlockedAdd(intBuffer[idx], -1); 65 val += intBuffer[idx]; 66 67 // InterlockedAdd - original_value 68 uint origui = 0; 69 //LIB: call {{.*}}.atomic.local.add.u.i32 70 InterlockedAdd(shareMemUI[idx], 1, origui); 71 val += shareMemUI[idx]; 72 val += origui; 73 74 int origi = 0; 75 //LIB: call {{.*}}.atomic.local.add.s.i32 76 InterlockedAdd(shareMemI[idx], 2, origi); 77 val += shareMemI[idx]; 78 val += origi; 79 80 //LIB: call {{.*}}.atomic.global.add.u.i32 81 InterlockedAdd(uintBuffer[idx], 1, origui); 82 val += uintBuffer[idx]; 83 val += origui; 84 85 //LIB: call {{.*}}.atomic.global.add.s.i32 86 InterlockedAdd(intBuffer[idx], 2, origi); 87 val += intBuffer[idx]; 88 val += origi; 89 90 //LIB: call {{.*}}.atomic.local.add.s.i32 91 InterlockedAdd(shareMemI[idx], -1, origi); 92 val += shareMemI[idx]; 93 val += origi; 94 95 //LIB: call {{.*}}.atomic.global.add.s.i32 96 InterlockedAdd(intBuffer[idx], -1, origi); 97 val += intBuffer[idx]; 98 val += origi; 99 100 // InterlockedAnd 101 //LIB: call {{.*}}.atomic.local.and.u.i32 102 InterlockedAnd(shareMemUI[idx], 255); 103 val += shareMemUI[idx]; 104 105 //LIB: call {{.*}}.atomic.local.and.s.i32 106 InterlockedAnd(shareMemI[idx], 255); 107 val += shareMemI[idx]; 108 109 //LIB: call {{.*}}.atomic.global.and.u.i32 110 InterlockedAnd(uintBuffer[idx], 255); 111 val += uintBuffer[idx]; 112 113 //LIB: call {{.*}}.atomic.global.and.s.i32 114 InterlockedAnd(intBuffer[idx], 255); 115 val += intBuffer[idx]; 116 117 // InterlockedAnd - original_value 118 //LIB: call {{.*}}.atomic.local.and.u.i32 119 InterlockedAnd(shareMemUI[idx], 255, origui); 120 val += shareMemUI[idx]; 121 val += origui; 122 123 //LIB: call {{.*}}.atomic.local.and.s.i32 124 InterlockedAnd(shareMemI[idx], 255, origi); 125 val += shareMemI[idx]; 126 val += origi; 127 128 //LIB: call {{.*}}.atomic.global.and.u.i32 129 InterlockedAnd(uintBuffer[idx], 255, origui); 130 val += uintBuffer[idx]; 131 val += origui; 132 133 //LIB: call {{.*}}.atomic.global.and.s.i32 134 InterlockedAnd(intBuffer[idx], 255, origi); 135 val += intBuffer[idx]; 136 val += origi; 137 138 // InterlockedCompareExchange 139 //LIB: call {{.*}}.atomic.local.cmpxchg.weak.i32 140 InterlockedCompareExchange(shareMemUI[idx], 1, 0, origui); 141 val += shareMemUI[idx]; 142 val += origui; 143 144 //LIB: call {{.*}}.atomic.local.cmpxchg.weak.i32 145 InterlockedCompareExchange(shareMemI[idx], 1, 0, origi); 146 val += shareMemI[idx]; 147 val += origi; 148 149 //LIB: call {{.*}}.atomic.global.cmpxchg.weak.i32 150 InterlockedCompareExchange(uintBuffer[idx], 1, 0, origui); 151 val += uintBuffer[idx]; 152 val += origui; 153 154 //LIB: call {{.*}}.atomic.global.cmpxchg.weak.i32 155 InterlockedCompareExchange(intBuffer[idx], 1, 0, origi); 156 val += intBuffer[idx]; 157 val += origi; 158 159 // InterlockedCompareStore is not supported by Metal 160#if !defined(METAL) 161 InterlockedCompareStore(shareMemUI[idx], 255, 0); 162 val += shareMemUI[idx]; 163 164 InterlockedCompareStore(shareMemI[idx], 255, 0); 165 val += shareMemI[idx]; 166 167 InterlockedCompareStore(uintBuffer[idx], 255, 0); 168 val += uintBuffer[idx]; 169 170 InterlockedCompareStore(intBuffer[idx], 255, 0); 171 val += intBuffer[idx]; 172#endif 173 174 // InterlockedExchange 175 //LIB: call {{.*}}.atomic.local.xchg.i32 176 InterlockedExchange(shareMemUI[idx], 1, origui); 177 val += shareMemUI[idx]; 178 val += origui; 179 180 //LIB: call {{.*}}.atomic.local.xchg.i32 181 InterlockedExchange(shareMemI[idx], 1, origi); 182 val += shareMemI[idx]; 183 val += origi; 184 185 //LIB: call {{.*}}.atomic.global.xchg.i32 186 InterlockedExchange(uintBuffer[idx], 1, origui); 187 val += uintBuffer[idx]; 188 val += origui; 189 190 //LIB: call {{.*}}.atomic.global.xchg.i32 191 InterlockedExchange(intBuffer[idx], 1, origi); 192 val += intBuffer[idx]; 193 val += origi; 194 195 // InterlockedMax 196 //LIB: call {{.*}}.atomic.local.max.u.i32 197 InterlockedMax(shareMemUI[idx], 0); 198 val += shareMemUI[idx]; 199 200 //LIB: call {{.*}}.atomic.local.max.s.i32 201 InterlockedMax(shareMemI[idx], 0); 202 val += shareMemI[idx]; 203 204 //LIB: call {{.*}}.atomic.global.max.u.i32 205 InterlockedMax(uintBuffer[idx], 0); 206 val += uintBuffer[idx]; 207 208 //LIB: call {{.*}}.atomic.global.max.s.i32 209 InterlockedMax(intBuffer[idx], 0); 210 val += intBuffer[idx]; 211 212 // InterlockedMax - original_value 213 //LIB: call {{.*}}.atomic.local.max.u.i32 214 InterlockedMax(shareMemUI[idx], 0, origui); 215 val += shareMemUI[idx]; 216 val += origui; 217 218 //LIB: call {{.*}}.atomic.local.max.s.i32 219 InterlockedMax(shareMemI[idx], 0, origi); 220 val += shareMemI[idx]; 221 val += origi; 222 223 //LIB: call {{.*}}.atomic.global.max.u.i32 224 InterlockedMax(uintBuffer[idx], 0, origui); 225 val += uintBuffer[idx]; 226 val += origui; 227 228 //LIB: call {{.*}}.atomic.global.max.s.i32 229 InterlockedMax(intBuffer[idx], 0, origi); 230 val += intBuffer[idx]; 231 val += origi; 232 233 // InterlockedMin 234 //LIB: call {{.*}}.atomic.local.min.u.i32 235 InterlockedMin(shareMemUI[idx], 0); 236 val += shareMemUI[idx]; 237 238 //LIB: call {{.*}}.atomic.local.min.s.i32 239 InterlockedMin(shareMemI[idx], 0); 240 val += shareMemI[idx]; 241 242 //LIB: call {{.*}}.atomic.global.min.u.i32 243 InterlockedMin(uintBuffer[idx], 0); 244 val += uintBuffer[idx]; 245 246 //LIB: call {{.*}}.atomic.global.min.s.i32 247 InterlockedMin(intBuffer[idx], 0); 248 val += intBuffer[idx]; 249 250 // InterlockedMin - original_value 251 //LIB: call {{.*}}.atomic.local.min.u.i32 252 InterlockedMin(shareMemUI[idx], 0, origui); 253 val += shareMemUI[idx]; 254 val += origui; 255 256 //LIB: call {{.*}}.atomic.local.min.s.i32 257 InterlockedMin(shareMemI[idx], 0, origi); 258 val += shareMemI[idx]; 259 val += origi; 260 261 //LIB: call {{.*}}.atomic.global.min.u.i32 262 InterlockedMin(uintBuffer[idx], 0, origui); 263 val += uintBuffer[idx]; 264 val += origui; 265 266 //LIB: call {{.*}}.atomic.global.min.s.i32 267 InterlockedMin(intBuffer[idx], 0, origi); 268 val += intBuffer[idx]; 269 val += origi; 270 271 // InterlockedOr 272 //LIB: call {{.*}}.atomic.local.or.u.i32 273 InterlockedOr(shareMemUI[idx], 2); 274 val += shareMemUI[idx]; 275 276 //LIB: call {{.*}}.atomic.local.or.s.i32 277 InterlockedOr(shareMemI[idx], 4); 278 val += shareMemI[idx]; 279 280 //LIB: call {{.*}}.atomic.global.or.u.i32 281 InterlockedOr(uintBuffer[idx], 6); 282 val += uintBuffer[idx]; 283 284 //LIB: call {{.*}}.atomic.global.or.s.i32 285 InterlockedOr(intBuffer[idx], 8); 286 val += intBuffer[idx]; 287 288 // InterlockedOr - original_value 289 //LIB: call {{.*}}.atomic.local.or.u.i32 290 InterlockedOr(shareMemUI[idx], 2, origui); 291 val += shareMemUI[idx]; 292 val += origui; 293 294 //LIB: call {{.*}}.atomic.local.or.s.i32 295 InterlockedOr(shareMemI[idx], 4, origi); 296 val += shareMemI[idx]; 297 val += origi; 298 299 //LIB: call {{.*}}.atomic.global.or.u.i32 300 InterlockedOr(uintBuffer[idx], 6, origui); 301 val += uintBuffer[idx]; 302 val += origui; 303 304 //LIB: call {{.*}}.atomic.global.or.s.i32 305 InterlockedOr(intBuffer[idx], 8, origi); 306 val += intBuffer[idx]; 307 val += origi; 308 309 // InterlockedXor 310 //LIB: call {{.*}}.atomic.local.xor.u.i32 311 InterlockedXor(shareMemUI[idx], 2); 312 val += shareMemUI[idx]; 313 314 //LIB: call {{.*}}.atomic.local.xor.s.i32 315 InterlockedXor(shareMemI[idx], 4); 316 val += shareMemI[idx]; 317 318 //LIB: call {{.*}}.atomic.global.xor.u.i32 319 InterlockedXor(uintBuffer[idx], 6); 320 val += uintBuffer[idx]; 321 322 //LIB: call {{.*}}.atomic.global.xor.s.i32 323 InterlockedXor(intBuffer[idx], 8); 324 val += intBuffer[idx]; 325 326 // InterlockedXor - original_value 327 //LIB: call {{.*}}.atomic.local.xor.u.i32 328 InterlockedXor(shareMemUI[idx], 2, origui); 329 val += shareMemUI[idx]; 330 val += origui; 331 332 //LIB: call {{.*}}.atomic.local.xor.s.i32 333 InterlockedXor(shareMemI[idx], 4, origi); 334 val += shareMemI[idx]; 335 val += origi; 336 337 //LIB: call {{.*}}.atomic.global.xor.u.i32 338 InterlockedXor(uintBuffer[idx], 6, origui); 339 val += uintBuffer[idx]; 340 val += origui; 341 342 //LIB: call {{.*}}.atomic.global.xor.s.i32 343 InterlockedXor(intBuffer[idx], 8, origi); 344 val += intBuffer[idx]; 345 val += origi; 346 347 // BUF: 184 348 // BUF-NEXT: 207 349 // BUF-NEXT: 230 350 // BUF-NEXT: 253 351 outputBuffer[idx] = val; 352}