diff options
Diffstat (limited to 'graphics/asymptote/base/shaders/sum2.glsl')
-rw-r--r-- | graphics/asymptote/base/shaders/sum2.glsl | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/graphics/asymptote/base/shaders/sum2.glsl b/graphics/asymptote/base/shaders/sum2.glsl index 11bf0064eb..17b5efeaee 100644 --- a/graphics/asymptote/base/shaders/sum2.glsl +++ b/graphics/asymptote/base/shaders/sum2.glsl @@ -1,22 +1,43 @@ -layout(local_size_x=LOCAL_SIZE_X) in; +layout(local_size_x=LOCALSIZE) in; -uniform uint offset2; +const uint groupSize=LOCALSIZE*BLOCKSIZE; -layout(binding=2, std430) buffer localSumBuffer +uniform uint blockSize; + +layout(binding=3, std430) buffer globalSumBuffer { - uint localSum[]; + uint globalSum[]; }; -void main(void) +shared uint groupSum[LOCALSIZE]; + +void main() { - uint id=gl_GlobalInvocationID.x; + uint localSum[groupSize]; + uint id=gl_LocalInvocationID.x; + + uint dataOffset=blockSize*id; + uint sum=0u; + for(uint i=0; i < blockSize; ++i) { + localSum[i]=sum; + sum += globalSum[dataOffset+i]; + } - uint row=LOCAL_SIZE_X*id; - uint stop=row+LOCAL_SIZE_X; + groupSum[id]=sum; + barrier(); - uint Sum=localSum[row]; - for(uint i=row+1u; i < stop; ++i) - localSum[i]=Sum += localSum[i]; + for(uint shift=1u; shift < LOCALSIZE; shift *= 2u) { + uint read; + if(shift <= id) + read=groupSum[id]+groupSum[id-shift]; + barrier(); + if(shift <= id) + groupSum[id]=read; + barrier(); + } - localSum[offset2+id+1u]=Sum; + // shift local sums and store + uint shift=id > 0u ? groupSum[id-1u] : 0u; + for(uint i=0u; i < blockSize; ++i) + globalSum[dataOffset+i]=localSum[i]+shift; } |