summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/asymptote/shaders/partialsum.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/asymptote/shaders/partialsum.glsl')
-rwxr-xr-xMaster/texmf-dist/asymptote/shaders/partialsum.glsl37
1 files changed, 37 insertions, 0 deletions
diff --git a/Master/texmf-dist/asymptote/shaders/partialsum.glsl b/Master/texmf-dist/asymptote/shaders/partialsum.glsl
new file mode 100755
index 00000000000..d00195bb3ae
--- /dev/null
+++ b/Master/texmf-dist/asymptote/shaders/partialsum.glsl
@@ -0,0 +1,37 @@
+layout(local_size_x=PROCESSORS) in;
+
+uniform uint elements;
+
+layout(binding=0, std430) buffer sumBuffer
+{
+ uint sum[];
+};
+
+shared uint sharedData[PROCESSORS];
+
+void main(void)
+{
+ uint id=gl_LocalInvocationID.x;
+ sharedData[id]=sum[id+1u];
+
+ barrier();
+
+ uint index=id << 1u;
+ sharedData[index+1u] += sharedData[index];
+ barrier();
+ 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 << STEPSM1)-1u;
+ index=((id >> STEPSM1) << (STEPSM1+1u))+mask;
+ uint windex=index+(id&mask)+1u;
+ if(windex < PROCESSORS)
+ sharedData[windex] += sharedData[index];
+ barrier();
+
+ sum[id+1u]=sharedData[id];
+}