workgroup atomicUint wgAtomic; // valid workgroup atomic_uint wgAtomicArray[2]; // valid atomic_uint globalAtomic; // invalid atomicUint globalAtomicArray[2]; // invalid struct S { atomicUint structMemberAtomic; // valid atomic_uint structMemberAtomicArray[2]; // valid }; struct NestedS { S nestedStructWithAtomicMember; // valid }; workgroup S wgStructWithAtomicMember; // valid workgroup S wgStructWithAtomicMemberArray[2]; // valid workgroup NestedS wgStructWithNestedAtomicMember; // valid S globalStructWithAtomicMember; // invalid S globalStructWithAtomicMemberArray[2]; // invalid NestedS globalStructWithNestedAtomicMember; // invalid layout(metal, binding = 0) buffer ssbo { atomic_uint ssboAtomic; // valid atomicUint ssboAtomicArray[2]; // valid S ssboStructWithAtomicMember; // valid S ssboStructWithAtomicMemberArray[2]; // valid }; layout(metal, binding = 1) uniform ubo1 { atomicUint uboAtomic; // invalid }; layout(metal, binding = 2) uniform ubo2 { atomic_uint uboAtomicArray[2]; // invalid }; layout(metal, binding = 3) uniform ubo3 { S uboStructWithAtomicMember; // invalid }; layout(metal, binding = 4) uniform ubo4 { S uboStructWithAtomicMemberArray[2]; // invalid }; layout(metal, binding = 5) uniform ubo5 { NestedS uboStructWithNestedAtomicMember; // invalid }; layout(metal, binding = 6) readonly buffer roSsbo1 { atomic_uint readonlySsboAtomic; // invalid }; layout(metal, binding = 7) readonly buffer roSsbo2 { atomicUint readonlySsboAtomicArray[2]; // invalid }; layout(metal, binding = 8) readonly buffer roSsbo3 { S readonlySsboStructWithAtomicMember; // invalid }; layout(metal, binding = 9) readonly buffer roSsbo4 { S readonlySsboStructWithAtomicMemberArray[2]; // invalid }; layout(metal, binding = 10) readonly buffer roSsbo5 { NestedS readonlySsboStructWithNestedAtomicMember; // invalid }; void main() { atomicUint localAtomic; // invalid atomic_uint localAtomicArray[2]; // invalid S localStructWithAtomicMember; // invalid S localStructWithAtomicMemberArray[2]; // invalid } /*%%* atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks variables of type 'ubo1' may not be uniform caused by: atomics are only permitted in workgroup variables and writable storage blocks variables of type 'ubo2' may not be uniform caused by: atomics are only permitted in workgroup variables and writable storage blocks variables of type 'ubo3' may not be uniform caused by: atomics are only permitted in workgroup variables and writable storage blocks variables of type 'ubo4' may not be uniform caused by: atomics are only permitted in workgroup variables and writable storage blocks variables of type 'ubo5' may not be uniform caused by: atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks atomics are only permitted in workgroup variables and writable storage blocks *%%*/