1workgroup atomicUint wgAtomic; // valid 2workgroup atomic_uint wgAtomicArray[2]; // valid 3 4atomic_uint globalAtomic; // invalid 5atomicUint globalAtomicArray[2]; // invalid 6 7struct S { 8 atomicUint structMemberAtomic; // valid 9 atomic_uint structMemberAtomicArray[2]; // valid 10}; 11 12struct NestedS { 13 S nestedStructWithAtomicMember; // valid 14}; 15 16workgroup S wgStructWithAtomicMember; // valid 17workgroup S wgStructWithAtomicMemberArray[2]; // valid 18workgroup NestedS wgStructWithNestedAtomicMember; // valid 19 20S globalStructWithAtomicMember; // invalid 21S globalStructWithAtomicMemberArray[2]; // invalid 22NestedS globalStructWithNestedAtomicMember; // invalid 23 24layout(metal, binding = 0) buffer ssbo { 25 atomic_uint ssboAtomic; // valid 26 atomicUint ssboAtomicArray[2]; // valid 27 S ssboStructWithAtomicMember; // valid 28 S ssboStructWithAtomicMemberArray[2]; // valid 29}; 30 31layout(metal, binding = 1) uniform ubo1 { 32 atomicUint uboAtomic; // invalid 33}; 34layout(metal, binding = 2) uniform ubo2 { 35 atomic_uint uboAtomicArray[2]; // invalid 36}; 37layout(metal, binding = 3) uniform ubo3 { 38 S uboStructWithAtomicMember; // invalid 39}; 40layout(metal, binding = 4) uniform ubo4 { 41 S uboStructWithAtomicMemberArray[2]; // invalid 42}; 43layout(metal, binding = 5) uniform ubo5 { 44 NestedS uboStructWithNestedAtomicMember; // invalid 45}; 46 47layout(metal, binding = 6) readonly buffer roSsbo1 { 48 atomic_uint readonlySsboAtomic; // invalid 49}; 50layout(metal, binding = 7) readonly buffer roSsbo2 { 51 atomicUint readonlySsboAtomicArray[2]; // invalid 52}; 53layout(metal, binding = 8) readonly buffer roSsbo3 { 54 S readonlySsboStructWithAtomicMember; // invalid 55}; 56layout(metal, binding = 9) readonly buffer roSsbo4 { 57 S readonlySsboStructWithAtomicMemberArray[2]; // invalid 58}; 59layout(metal, binding = 10) readonly buffer roSsbo5 { 60 NestedS readonlySsboStructWithNestedAtomicMember; // invalid 61}; 62 63void main() { 64 atomicUint localAtomic; // invalid 65 atomic_uint localAtomicArray[2]; // invalid 66 S localStructWithAtomicMember; // invalid 67 S localStructWithAtomicMemberArray[2]; // invalid 68} 69 70/*%%* 71atomics are only permitted in workgroup variables and writable storage blocks 72atomics are only permitted in workgroup variables and writable storage blocks 73atomics are only permitted in workgroup variables and writable storage blocks 74atomics are only permitted in workgroup variables and writable storage blocks 75atomics are only permitted in workgroup variables and writable storage blocks 76variables of type 'ubo1' may not be uniform 77caused by: 78atomics are only permitted in workgroup variables and writable storage blocks 79variables of type 'ubo2' may not be uniform 80caused by: 81atomics are only permitted in workgroup variables and writable storage blocks 82variables of type 'ubo3' may not be uniform 83caused by: 84atomics are only permitted in workgroup variables and writable storage blocks 85variables of type 'ubo4' may not be uniform 86caused by: 87atomics are only permitted in workgroup variables and writable storage blocks 88variables of type 'ubo5' may not be uniform 89caused by: 90atomics are only permitted in workgroup variables and writable storage blocks 91atomics are only permitted in workgroup variables and writable storage blocks 92atomics are only permitted in workgroup variables and writable storage blocks 93atomics are only permitted in workgroup variables and writable storage blocks 94atomics are only permitted in workgroup variables and writable storage blocks 95atomics are only permitted in workgroup variables and writable storage blocks 96atomics are only permitted in workgroup variables and writable storage blocks 97atomics are only permitted in workgroup variables and writable storage blocks 98atomics are only permitted in workgroup variables and writable storage blocks 99atomics are only permitted in workgroup variables and writable storage blocks 100*%%*/ 101