This is a tiny subset of #639. It looks like Metal doesn't atomic ops on texture storages in fragment shaders. SPIRV-Cross goes lengths to work around this by having a separate storage buffer (presumably, mirroring the texture). See KhronosGroup/SPIRV-Cross#835 and gfx-rs/wgpu#618 for some context.