diff options
Diffstat (limited to 'graphics/asymptote/base')
-rw-r--r-- | graphics/asymptote/base/shaders/partialsum.glsl | 24 | ||||
-rw-r--r-- | graphics/asymptote/base/shaders/postsum.glsl | 28 | ||||
-rw-r--r-- | graphics/asymptote/base/shaders/presum.glsl | 19 | ||||
-rw-r--r-- | graphics/asymptote/base/v3dheadertypes.asy | 2 | ||||
-rw-r--r-- | graphics/asymptote/base/v3dtypes.asy | 2 |
5 files changed, 35 insertions, 40 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] } diff --git a/graphics/asymptote/base/shaders/postsum.glsl b/graphics/asymptote/base/shaders/postsum.glsl index 9a2afaf845..999fe5fdf3 100644 --- a/graphics/asymptote/base/shaders/postsum.glsl +++ b/graphics/asymptote/base/shaders/postsum.glsl @@ -7,24 +7,24 @@ layout(binding=1, std430) buffer offsetBuffer uint offset[]; }; -uint ceilquotient(uint a, uint b) -{ - return (a+b-1u)/b; -} - void main(void) { uint id=gl_GlobalInvocationID.x; - uint m=ceilquotient(elements,gl_NumWorkGroups.x); - uint row=m*id; - uint col=min(m,elements-row); - uint stop=row+col-1u; + uint m=elements/gl_NumWorkGroups.x; + uint r=elements-m*gl_NumWorkGroups.x; + uint row,stop; + if(id < r) { + row=m*id+id; + stop=row+m+1; + } else { + row=m*id+r; + stop=row+m; + } - uint curr=offset[row]; - for(uint i=row; i < stop; ++i) { - uint next=offset[i+1u]; - curr += next; - offset[i+1u]=curr; + uint Sum=offset[row]; + for(uint i=row+1u; i < stop; ++i) { + Sum += offset[i]; + offset[i]=Sum; } } diff --git a/graphics/asymptote/base/shaders/presum.glsl b/graphics/asymptote/base/shaders/presum.glsl index 0bcb02c91d..f2311c6756 100644 --- a/graphics/asymptote/base/shaders/presum.glsl +++ b/graphics/asymptote/base/shaders/presum.glsl @@ -12,19 +12,20 @@ layout(binding=1, std430) buffer offsetBuffer uint offset[]; }; -uint ceilquotient(uint a, uint b) -{ - return (a+b-1u)/b; -} - void main(void) { uint id=gl_GlobalInvocationID.x; - uint m=ceilquotient(elements,gl_NumWorkGroups.x); - uint row=m*id; - uint col=min(m,elements-row); - uint stop=row+col; + uint m=elements/gl_NumWorkGroups.x; + uint r=elements-m*gl_NumWorkGroups.x; + uint row,stop; + if(id < r) { + row=m*id+id; + stop=row+m+1; + } else { + row=m*id+r; + stop=row+m; + } uint Sum=offset[row]; for(uint i=row+1u; i < stop; ++i) diff --git a/graphics/asymptote/base/v3dheadertypes.asy b/graphics/asymptote/base/v3dheadertypes.asy index 3243fb3f4d..1932d23d8b 100644 --- a/graphics/asymptote/base/v3dheadertypes.asy +++ b/graphics/asymptote/base/v3dheadertypes.asy @@ -1,6 +1,6 @@ // Enum class for v3dheadertypes // AUTO-GENERATED from v3dheadertypes.csv -// Generated at 2022-01-19 22:30:10.732250 +// Generated at 2022-01-21 20:50:28.286711 struct v3dheadertypes { diff --git a/graphics/asymptote/base/v3dtypes.asy b/graphics/asymptote/base/v3dtypes.asy index 12e2d58c28..f885de3c75 100644 --- a/graphics/asymptote/base/v3dtypes.asy +++ b/graphics/asymptote/base/v3dtypes.asy @@ -1,6 +1,6 @@ // Enum class for v3dtypes // AUTO-GENERATED from v3dtypes.csv -// Generated at 2022-01-19 22:30:10.647049 +// Generated at 2022-01-21 20:50:28.223119 struct v3dtypes { |