summaryrefslogtreecommitdiff
path: root/graphics/asymptote/base/shaders/sum3.glsl
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-04-07 03:01:53 +0000
committerNorbert Preining <norbert@preining.info>2022-04-07 03:01:53 +0000
commit4ab0687cfdd546779ccb6d8589a671441bf5865f (patch)
tree77554e11f1829a925194242636c38c7306fa43a8 /graphics/asymptote/base/shaders/sum3.glsl
parent333540a9182285f9d72d7d39be3fa730c135d664 (diff)
CTAN sync 202204070301
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];
+ }
}