blob: 0506965c239a6c1c16db313b1d0f027e9b4823c2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
layout(local_size_x=PROCESSORS) in;
uniform uint elements;
uniform uint steps;
layout(binding=0, std430) buffer sumBuffer
{
uint sum[];
};
layout(binding=1, std430) buffer offsetBuffer
{
uint offset[];
};
shared uint sharedData[PROCESSORS];
uint ceilquotient(uint a, uint b)
{
return (a+b-1u)/b;
}
void main(void)
{
uint id=gl_LocalInvocationID.x;
sharedData[id]=sum[id];
barrier();
uint index=id << 1u;
sharedData[index+1u] += sharedData[index];
barrier();
uint step;
for(step=1u; step < steps-1u; 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 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
sum[0]=sharedData[id]; // Store fragment size in sum[0]
}
|