summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/base/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/base/shaders')
-rw-r--r--Build/source/utils/asymptote/base/shaders/blend.glsl121
-rw-r--r--Build/source/utils/asymptote/base/shaders/count.glsl6
-rw-r--r--Build/source/utils/asymptote/base/shaders/fragment.glsl54
-rw-r--r--Build/source/utils/asymptote/base/shaders/offset.glsl11
-rw-r--r--Build/source/utils/asymptote/base/shaders/partialsum.glsl37
-rw-r--r--Build/source/utils/asymptote/base/shaders/presum.glsl37
-rw-r--r--Build/source/utils/asymptote/base/shaders/sum1.glsl38
-rw-r--r--Build/source/utils/asymptote/base/shaders/sum2.glsl24
-rw-r--r--Build/source/utils/asymptote/base/shaders/sum3.glsl28
-rw-r--r--Build/source/utils/asymptote/base/shaders/zero.glsl (renamed from Build/source/utils/asymptote/base/shaders/count0.glsl)0
10 files changed, 200 insertions, 156 deletions
diff --git a/Build/source/utils/asymptote/base/shaders/blend.glsl b/Build/source/utils/asymptote/base/shaders/blend.glsl
index 629cc2dda5e..76dfe94ad30 100644
--- a/Build/source/utils/asymptote/base/shaders/blend.glsl
+++ b/Build/source/utils/asymptote/base/shaders/blend.glsl
@@ -1,36 +1,49 @@
-layout(binding=0, std430) buffer sumBuffer {
- uint sum[];
+layout(binding=0, std430) buffer offsetBuffer {
+ uint offset[];
};
-layout(binding=1, std430) buffer offsetBuffer {
- uint offset[];
+layout(binding=1, std430) buffer maxBuffer {
+ uint maxSize;
+};
+
+#ifdef GPUINDEXING
+uniform uint offset2;
+uniform uint m1;
+uniform uint r;
+
+layout(binding=2, std430) buffer localSumBuffer {
+ uint localSum[];
};
+layout(binding=3, std430) buffer globalSumBuffer {
+ uint globalSum[];
+};
+#else
layout(binding=2, std430) buffer countBuffer {
uint count[];
};
+#endif
-layout(binding=3, std430) buffer fragmentBuffer {
+layout(binding=4, std430) buffer fragmentBuffer {
vec4 fragment[];
};
-layout(binding=4, std430) buffer depthBuffer {
+layout(binding=5, std430) buffer depthBuffer {
float depth[];
};
-layout(binding=5, std430) buffer opaqueBuffer {
+layout(binding=6, std430) buffer opaqueBuffer {
vec4 opaqueColor[];
};
-layout(binding=6, std430) buffer opaqueDepthBuffer {
+layout(binding=7, std430) buffer opaqueDepthBuffer {
float opaqueDepth[];
};
out vec4 outColor;
uniform uint width;
-uniform uint M;
-uniform uint r;
+uniform uint pixels;
uniform vec4 background;
vec4 blend(vec4 outColor, vec4 color)
@@ -41,91 +54,95 @@ vec4 blend(vec4 outColor, vec4 color)
void main()
{
uint headIndex=uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x);
+#ifdef GPUINDEXING
+ uint size=offset[headIndex];
+#else
uint size=count[headIndex];
+#endif
float OpaqueDepth=opaqueDepth[headIndex];
if(size == 0u) {
#ifdef GPUINDEXING
- offset[headIndex]=0u;
+ offset[pixels+headIndex]=0u;
#endif
opaqueDepth[headIndex]=0.0;
discard;
}
- uint listIndex=
+ outColor=OpaqueDepth != 0.0 ? opaqueColor[headIndex] : background;
+
#ifdef GPUINDEXING
- sum[headIndex < r*(M+1u) ? headIndex/(M+1u) : (headIndex-r)/M]+
+ uint p=headIndex < r*(m1+1u) ? headIndex/(m1+1u) : (headIndex-r)/m1;
+ uint listIndex=localSum[p]+localSum[offset2+p/m2]+globalSum[p/(m2*m2)]+
+ offset[pixels+headIndex];
+#else
+ uint listIndex=offset[headIndex]-size;
#endif
- offset[headIndex];
- const uint maxSize=16u;
-
- // Sort the fragments with respect to descending depth
- if(size < maxSize) {
- vec4 sortedColor[maxSize];
- float sortedDepth[maxSize];
- uint k=0u;
-
- if(OpaqueDepth != 0.0)
- while(k < size && depth[listIndex+k] >= OpaqueDepth)
- ++k;
+ uint k=0u;
+ if(OpaqueDepth != 0.0)
+ while(k < size && depth[listIndex+k] >= OpaqueDepth)
+ ++k;
- uint i=0u;
+ // Sort the fragments with respect to descending depth
+ if(size-k <= ARRAYSIZE) {
if(k < size) {
- sortedColor[0]=fragment[listIndex+k];
- sortedDepth[0]=depth[listIndex+k];
+ uint Index[ARRAYSIZE];
+ float Depth[ARRAYSIZE];
+ Index[0]=k;
+ Depth[0]=depth[listIndex+k];
++k;
- i=1u;
+ uint i=1u;
while(true) {
if(OpaqueDepth != 0.0)
while(k < size && depth[listIndex+k] >= OpaqueDepth)
++k;
if(k == size) break;
- float D=depth[listIndex+k];
+ float d=depth[listIndex+k];
uint j=i;
- float d;
- while(j > 0u && D > sortedDepth[j-1u]) {
- sortedColor[j]=sortedColor[j-1u];
- sortedDepth[j]=sortedDepth[j-1u];
+ while(j > 0u && d > Depth[j-1u]) {
+ Index[j]=Index[j-1u];
+ Depth[j]=Depth[j-1u];
--j;
}
- sortedColor[j]=fragment[listIndex+k];
- sortedDepth[j]=D;
+ Index[j]=k++;
+ Depth[j]=d;
++i;
- ++k;
}
+ for(uint j=0u; j < i; ++j)
+ outColor=blend(outColor,fragment[listIndex+Index[j]]);
}
- outColor=OpaqueDepth != 0.0 ? opaqueColor[headIndex] : background;
- for(uint j=0u; j < i; ++j)
- outColor=blend(outColor,sortedColor[j]);
} else {
- uint k=0u;
- if(OpaqueDepth != 0.0)
- while(k < size && depth[listIndex+k] >= OpaqueDepth)
- ++k;
+ atomicMax(maxSize,size);
for(uint i=k+1u; i < size; i++) {
vec4 temp=fragment[listIndex+i];
- float D=depth[listIndex+i];
+ float d=depth[listIndex+i];
uint j=i;
- while(j > 0u && D > depth[listIndex+j-1u]) {
+ while(j > 0u && d > depth[listIndex+j-1u]) {
fragment[listIndex+j]=fragment[listIndex+j-1u];
depth[listIndex+j]=depth[listIndex+j-1u];
--j;
}
fragment[listIndex+j]=temp;
- depth[listIndex+j]=D;
+ depth[listIndex+j]=d;
}
- outColor=OpaqueDepth != 0.0 ? opaqueColor[headIndex] : background;
uint stop=listIndex+size;
- for(uint i=listIndex+k; i < stop; i++) {
- if(OpaqueDepth == 0.0 || depth[i] < OpaqueDepth)
+ if(OpaqueDepth == 0.0)
+ for(uint i=listIndex+k; i < stop; i++)
outColor=blend(outColor,fragment[i]);
- }
+ else
+ for(uint i=listIndex+k; i < stop; i++) {
+ if(depth[i] < OpaqueDepth)
+ outColor=blend(outColor,fragment[i]);
+ }
}
- count[headIndex]=0u;
+
opaqueDepth[headIndex]=0.0;
#ifdef GPUINDEXING
offset[headIndex]=0u;
+ offset[pixels+headIndex]=0u;
+#else
+ count[headIndex]=0u;
#endif
}
diff --git a/Build/source/utils/asymptote/base/shaders/count.glsl b/Build/source/utils/asymptote/base/shaders/count.glsl
index dae4e51f1b7..c9427714980 100644
--- a/Build/source/utils/asymptote/base/shaders/count.glsl
+++ b/Build/source/utils/asymptote/base/shaders/count.glsl
@@ -1,6 +1,12 @@
+#ifdef GPUINDEXING
+layout(binding=0, std430) buffer offsetBuffer {
+ uint count[];
+};
+#else
layout(binding=2, std430) buffer countBuffer {
uint count[];
};
+#endif
uniform uint width;
diff --git a/Build/source/utils/asymptote/base/shaders/fragment.glsl b/Build/source/utils/asymptote/base/shaders/fragment.glsl
index 5f60a56efd3..e8d4be86cf2 100644
--- a/Build/source/utils/asymptote/base/shaders/fragment.glsl
+++ b/Build/source/utils/asymptote/base/shaders/fragment.glsl
@@ -30,37 +30,50 @@ float Roughness;
#ifdef HAVE_SSBO
-layout(binding=0, std430) buffer sumBuffer {
- uint sum[];
+layout(binding=0, std430) buffer offsetBuffer {
+ uint offset[];
};
-layout(binding=1, std430) buffer offsetBuffer {
- uint offset[];
+#ifdef GPUINDEXING
+
+#if defined(TRANSPARENT) || (!defined(HAVE_INTERLOCK) && !defined(OPAQUE))
+uniform uint offset2;
+uniform uint m1;
+uniform uint r;
+#endif
+
+layout(binding=2, std430) buffer localSumBuffer {
+ uint localSum[];
};
+layout(binding=3, std430) buffer globalSumBuffer {
+ uint globalSum[];
+};
+#else
layout(binding=2, std430) buffer countBuffer {
uint count[];
};
+#endif
-layout(binding=3, std430) buffer fragmentBuffer {
+layout(binding=4, std430) buffer fragmentBuffer {
vec4 fragment[];
};
-layout(binding=4, std430) buffer depthBuffer {
+layout(binding=5, std430) buffer depthBuffer {
float depth[];
};
-layout(binding=5, std430) buffer opaqueBuffer {
+layout(binding=6, std430) buffer opaqueBuffer {
vec4 opaqueColor[];
};
-layout(binding=6, std430) buffer opaqueDepthBuffer {
+layout(binding=7, std430) buffer opaqueDepthBuffer {
float opaqueDepth[];
};
uniform uint width;
-uniform uint M;
-uniform uint r;
+uniform uint pixels;
+
#endif
#ifdef NORMAL
@@ -261,11 +274,13 @@ void main()
#ifdef HAVE_SSBO
uint headIndex=uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x);
#if defined(TRANSPARENT) || (!defined(HAVE_INTERLOCK) && !defined(OPAQUE))
- uint listIndex=
#ifdef GPUINDEXING
- sum[headIndex < r*(M+1u) ? headIndex/(M+1u) : (headIndex-r)/M]+
+ uint p=headIndex < r*(m1+1u) ? headIndex/(m1+1u) : (headIndex-r)/m1;
+ uint listIndex=localSum[p]+localSum[offset2+p/m2]+globalSum[p/(m2*m2)]+
+ atomicAdd(offset[pixels+headIndex],-1u)-1u;
+#else
+ uint listIndex=offset[headIndex]-atomicAdd(count[headIndex],1u)-1u;
#endif
- offset[headIndex]+atomicAdd(count[headIndex],1u);
fragment[listIndex]=outColor;
depth[listIndex]=gl_FragCoord.z;
#ifndef WIREFRAME
@@ -274,12 +289,13 @@ void main()
#else
#ifndef OPAQUE
#ifdef HAVE_INTERLOCK
-beginInvocationInterlockARB();
-if(opaqueDepth[headIndex] == 0.0 || gl_FragCoord.z < opaqueDepth[headIndex]) {
- opaqueDepth[headIndex]=gl_FragCoord.z;
- opaqueColor[headIndex]=outColor;
-}
-endInvocationInterlockARB();
+ beginInvocationInterlockARB();
+ if(opaqueDepth[headIndex] == 0.0 || gl_FragCoord.z < opaqueDepth[headIndex])
+ {
+ opaqueDepth[headIndex]=gl_FragCoord.z;
+ opaqueColor[headIndex]=outColor;
+ }
+ endInvocationInterlockARB();
#endif
#endif
#endif
diff --git a/Build/source/utils/asymptote/base/shaders/offset.glsl b/Build/source/utils/asymptote/base/shaders/offset.glsl
deleted file mode 100644
index 5fe24e75587..00000000000
--- a/Build/source/utils/asymptote/base/shaders/offset.glsl
+++ /dev/null
@@ -1,11 +0,0 @@
-layout(binding=1, std430) buffer offsetBuffer {
- uint offset[];
-};
-
-uniform uint width;
-
-void main()
-{
- atomicAdd(offset[uint(gl_FragCoord.y)*width+uint(gl_FragCoord.x)+1u],1u);
- discard;
-}
diff --git a/Build/source/utils/asymptote/base/shaders/partialsum.glsl b/Build/source/utils/asymptote/base/shaders/partialsum.glsl
deleted file mode 100644
index d00195bb3ae..00000000000
--- a/Build/source/utils/asymptote/base/shaders/partialsum.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-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];
-}
diff --git a/Build/source/utils/asymptote/base/shaders/presum.glsl b/Build/source/utils/asymptote/base/shaders/presum.glsl
deleted file mode 100644
index 5b0a8df89e0..00000000000
--- a/Build/source/utils/asymptote/base/shaders/presum.glsl
+++ /dev/null
@@ -1,37 +0,0 @@
-layout(local_size_x=1) in;
-
-uniform uint elements;
-
-layout(binding=0, std430) buffer sumBuffer
-{
- uint sum[];
-};
-
-layout(binding=1, std430) buffer offsetBuffer
-{
- uint offset[];
-};
-
-void main(void)
-{
- uint id=gl_GlobalInvocationID.x;
-
- 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+1u;
- } else {
- row=m*id+r;
- stop=row+m;
- }
-
- uint Sum=offset[row];
- for(uint i=row+1u; i < stop; ++i) {
- Sum += offset[i];
- offset[i]=Sum;
- }
-
- sum[id+1u]=Sum;
-}
diff --git a/Build/source/utils/asymptote/base/shaders/sum1.glsl b/Build/source/utils/asymptote/base/shaders/sum1.glsl
new file mode 100644
index 00000000000..2cb9ed23aac
--- /dev/null
+++ b/Build/source/utils/asymptote/base/shaders/sum1.glsl
@@ -0,0 +1,38 @@
+layout(local_size_x=LOCAL_SIZE_X) in;
+
+uniform uint elements;
+
+layout(binding=0, std430) buffer offsetBuffer
+{
+ uint offset[];
+};
+
+layout(binding=2, std430) buffer localSumBuffer
+{
+ uint localSum[];
+};
+
+void main(void)
+{
+ uint id=gl_GlobalInvocationID.x;
+
+ uint m=elements/(gl_WorkGroupSize.x*gl_NumWorkGroups.x);
+ uint r=elements-m*gl_WorkGroupSize.x*gl_NumWorkGroups.x;
+ uint row,stop;
+ if(id < r) {
+ row=m*id+id;
+ stop=row+m+1u;
+ } else {
+ row=m*id+r;
+ stop=row+m;
+ }
+
+ uint Sum=offset[row];
+ offset[elements+row]=Sum;
+ for(uint i=row+1u; i < stop; ++i) {
+ Sum += offset[i];
+ offset[elements+i]=Sum;
+ }
+
+ localSum[id+1u]=Sum;
+}
diff --git a/Build/source/utils/asymptote/base/shaders/sum2.glsl b/Build/source/utils/asymptote/base/shaders/sum2.glsl
new file mode 100644
index 00000000000..1ab03513ebd
--- /dev/null
+++ b/Build/source/utils/asymptote/base/shaders/sum2.glsl
@@ -0,0 +1,24 @@
+layout(local_size_x=LOCAL_SIZE_X) in;
+
+uniform uint offset2;
+
+layout(binding=2, std430) buffer localSumBuffer
+{
+ uint localSum[];
+};
+
+void main(void)
+{
+ uint id=gl_GlobalInvocationID.x;
+
+ uint row=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;
+ }
+
+ localSum[offset2+id+1u]=Sum;
+}
diff --git a/Build/source/utils/asymptote/base/shaders/sum3.glsl b/Build/source/utils/asymptote/base/shaders/sum3.glsl
new file mode 100644
index 00000000000..85f55ff2a6c
--- /dev/null
+++ b/Build/source/utils/asymptote/base/shaders/sum3.glsl
@@ -0,0 +1,28 @@
+layout(local_size_x=LOCAL_SIZE_X) in;
+
+uniform uint offset2;
+
+layout(binding=2, std430) buffer localSumBuffer
+{
+ uint localSum[];
+};
+
+layout(binding=3, std430) buffer globalSumBuffer {
+ uint globalSum[];
+};
+
+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;
+ }
+
+ globalSum[id+1u]=Sum;
+}
diff --git a/Build/source/utils/asymptote/base/shaders/count0.glsl b/Build/source/utils/asymptote/base/shaders/zero.glsl
index 9bcb6d222e5..9bcb6d222e5 100644
--- a/Build/source/utils/asymptote/base/shaders/count0.glsl
+++ b/Build/source/utils/asymptote/base/shaders/zero.glsl