diff options
Diffstat (limited to 'graphics/asymptote/base/shaders/sum1.glsl')
-rw-r--r-- | graphics/asymptote/base/shaders/sum1.glsl | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/graphics/asymptote/base/shaders/sum1.glsl b/graphics/asymptote/base/shaders/sum1.glsl new file mode 100644 index 0000000000..2cb9ed23aa --- /dev/null +++ b/graphics/asymptote/base/shaders/sum1.glsl @@ -0,0 +1,38 @@ +layout(local_size_x=LOCAL_SIZE_X) in; + +uniform uint elements; + +layout(binding=0, std430) buffer offsetBuffer +{ + uint offset[]; +}; + +layout(binding=2, std430) buffer localSumBuffer +{ + uint localSum[]; +}; + +void main(void) +{ + uint id=gl_GlobalInvocationID.x; + + uint m=elements/(gl_WorkGroupSize.x*gl_NumWorkGroups.x); + uint r=elements-m*gl_WorkGroupSize.x*gl_NumWorkGroups.x; + uint row,stop; + if(id < r) { + row=m*id+id; + stop=row+m+1u; + } else { + row=m*id+r; + stop=row+m; + } + + uint Sum=offset[row]; + offset[elements+row]=Sum; + for(uint i=row+1u; i < stop; ++i) { + Sum += offset[i]; + offset[elements+i]=Sum; + } + + localSum[id+1u]=Sum; +} |