summaryrefslogtreecommitdiff
path: root/graphics/asymptote/base/shaders/partialsum.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/base/shaders/partialsum.glsl')
-rw-r--r--graphics/asymptote/base/shaders/partialsum.glsl24
1 files changed, 9 insertions, 15 deletions
diff --git a/graphics/asymptote/base/shaders/partialsum.glsl b/graphics/asymptote/base/shaders/partialsum.glsl
index 0506965c23..4b04a01dae 100644
--- a/graphics/asymptote/base/shaders/partialsum.glsl
+++ b/graphics/asymptote/base/shaders/partialsum.glsl
@@ -1,7 +1,6 @@
layout(local_size_x=PROCESSORS) in;
uniform uint elements;
-uniform uint steps;
layout(binding=0, std430) buffer sumBuffer
{
@@ -15,11 +14,6 @@ layout(binding=1, std430) buffer offsetBuffer
shared uint sharedData[PROCESSORS];
-uint ceilquotient(uint a, uint b)
-{
- return (a+b-1u)/b;
-}
-
void main(void)
{
uint id=gl_LocalInvocationID.x;
@@ -30,25 +24,25 @@ void main(void)
uint index=id << 1u;
sharedData[index+1u] += sharedData[index];
barrier();
- uint step;
- for(step=1u; step < steps-1u; step++) {
+ for(uint step=1u; step < STEPSM1; step++) {
uint mask=(1u << step)-1u;
uint index=((id >> step) << (step+1u))+mask;
uint windex=index+(id&mask)+1u;
sharedData[windex] += sharedData[index];
barrier();
}
- uint mask=(1u << step)-1u;
- index=((id >> step) << steps)+mask;
+ uint mask=(1u << STEPSM1)-1u;
+ index=((id >> STEPSM1) << (STEPSM1+1u))+mask;
uint windex=index+(id&mask)+1u;
if(windex < PROCESSORS)
sharedData[windex] += sharedData[index];
barrier();
- uint m=ceilquotient(elements,PROCESSORS);
-
- if(id+1u < PROCESSORS)
- offset[m*(id+1u)] += sharedData[id];
- else
+ uint id1=id+1u;
+ if(id1 < PROCESSORS) {
+ uint m=elements/PROCESSORS;
+ uint row=m*id1+min(id1,elements-m*PROCESSORS);
+ offset[row] += sharedData[id];
+ } else
sum[0]=sharedData[id]; // Store fragment size in sum[0]
}