diff options
Diffstat (limited to 'graphics/asymptote/base/shaders/sum3.glsl')
-rw-r--r-- | graphics/asymptote/base/shaders/sum3.glsl | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/graphics/asymptote/base/shaders/sum3.glsl b/graphics/asymptote/base/shaders/sum3.glsl index 85f55ff2a6..8e6e94bf45 100644 --- a/graphics/asymptote/base/shaders/sum3.glsl +++ b/graphics/asymptote/base/shaders/sum3.glsl @@ -1,28 +1,39 @@ layout(local_size_x=LOCAL_SIZE_X) in; uniform uint offset2; +uniform uint final; layout(binding=2, std430) buffer localSumBuffer { uint localSum[]; }; -layout(binding=3, std430) buffer globalSumBuffer { +layout(binding=3, std430) buffer globalSumBuffer +{ uint globalSum[]; }; +layout(binding=7, std430) buffer opaqueDepthBuffer +{ + uint maxSize; + float opaqueDepth[]; +}; + void main(void) { uint id=gl_GlobalInvocationID.x; - uint row=offset2+LOCAL_SIZE_X*id; uint stop=row+LOCAL_SIZE_X; uint Sum=localSum[row]; - for(uint i=row+1u; i < stop; ++i) { - Sum += localSum[i]; - localSum[i]=Sum; - } + for(uint i=row+1u; i < stop; ++i) + localSum[i]=Sum += localSum[i]; - globalSum[id+1u]=Sum; + uint id1=id+1u; + if(id1 < gl_WorkGroupSize.x*gl_NumWorkGroups.x) + globalSum[id1]=Sum; + else { + globalSum[0]=maxSize; + globalSum[id1]=Sum+localSum[offset2-1u]+localSum[final]; + } } |