// compiler_extensions: VK_EXT_mesh_shader // compiler_shader_flags: no_task_shader #version 450 #extension GL_EXT_mesh_shader : enable struct AtomicStruct { uint inoutValues[32/2]; uint inputValues[32]; uint compareValues[32]; uint outputValues[32]; int invocationHitCount[32]; int index; }; layout (set = 1, binding = 0) buffer AtomicBuffer { AtomicStruct data; } result; shared struct { AtomicStruct data; } buf; layout(local_size_x = 32) in; layout(points) out; layout(max_vertices=1, max_primitives=1) out; struct Outputs { highp uint outData; }; layout(set = 0, binding = 1, std430) buffer OutBuffer { Outputs outputs[]; }; void main (void) { uint invocationNdx = gl_NumWorkGroups.x*gl_NumWorkGroups.y*gl_WorkGroupID.z + gl_NumWorkGroups.x*gl_WorkGroupID.y + gl_WorkGroupID.x; uint outData; if (gl_LocalInvocationIndex == 0u) { buf.data = result.data; } barrier(); if (atomicAdd(buf.data.invocationHitCount[0], 1) < 32) { int idx = atomicAdd(buf.data.index, 1); buf.data.outputValues[idx] = atomicAdd(buf.data.inoutValues[idx % (32/2)], buf.data.inputValues[idx]); } barrier(); if (gl_LocalInvocationIndex == 0u) { result.data = buf.data; } outputs[invocationNdx].outData = outData; SetMeshOutputsEXT(0u, 0u); }