workgroup atomicUint wgAtomic; // valid workgroup atomicUint wgAtomicArray[2]; // valid atomicUint globalAtomic; // invalid atomicUint globalAtomicArray[2]; // invalid struct S { atomicUint structMemberAtomic; // valid atomicUint 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 { atomicUint 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 { atomicUint 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 { atomicUint 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 atomicUint 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 'atomicUint' may not be uniform atomics are only permitted in workgroup variables and writable storage blocks variables of type 'atomicUint[2]' may not be uniform atomics are only permitted in workgroup variables and writable storage blocks variables of type 'atomicUint' may not be uniform 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 'atomicUint' may not be uniform 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 *%%*/