summaryrefslogtreecommitdiff
path: root/graphics/asymptote/base/shaders/sum3.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/base/shaders/sum3.glsl')
-rw-r--r--graphics/asymptote/base/shaders/sum3.glsl25
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];
+ }
}