#version 450 // This variable is set by the pipeline layout (constant_id = 0) const uint BUF_SIZE = 32; layout(binding = 0) buffer Pos { uint values[ ]; }; layout (local_size_x = 4, local_size_y = 1, local_size_z = 1) in; shared uint sharedTotal[1]; uint mod(uint x, uint N) { return (x % N + N) % N; } void main() { uint index = gl_GlobalInvocationID.x; if (index >= BUF_SIZE) return; sharedTotal[0] = 0; barrier(); memoryBarrierShared(); atomicAdd(sharedTotal[0], values[index]); barrier(); memoryBarrierShared(); uint adjacentSum = values[mod(index+1, BUF_SIZE)] + values[mod(index-1, BUF_SIZE)]; values[index] = sharedTotal[0] + adjacentSum; }