tweek section meta
This commit is contained in:
@@ -47,5 +47,5 @@ void main() {
|
||||
dist = (TRANSLUCENT_WRITE_BASE-1)-min(dist, (TRANSLUCENT_WRITE_BASE-1));
|
||||
|
||||
uint drawPtr = atomicAdd(translucentCommandData[dist],1)+TRANSLUCENT_OFFSET;
|
||||
writeCmd(drawPtr, drawId, extractQuadStart(meta), meta.cntA&0xFFFF);
|
||||
writeCmd(drawPtr, drawId, extractQuadStart(meta), meta.b.x&0xFFFF);
|
||||
}
|
||||
@@ -78,18 +78,18 @@ void main() {
|
||||
ivec3 relative = ipos-(baseSectionPos>>detail);
|
||||
uint drawId = gl_GlobalInvocationID.x;
|
||||
|
||||
positionBuffer[drawId] = uvec2(meta.posA, meta.posB);
|
||||
|
||||
positionBuffer[drawId] = extractRawPos(meta);
|
||||
uvec4 counts = meta.b;
|
||||
|
||||
uint msk = 0;
|
||||
msk |= uint(((meta.cntB &0xFFFF)!=0) && (relative.y>-1))<<0;
|
||||
msk |= uint((((meta.cntB>>16)&0xFFFF)!=0) && (relative.y<1 ))<<1;
|
||||
msk |= uint(((meta.cntC &0xFFFF)!=0) && (relative.z>-1))<<2;
|
||||
msk |= uint((((meta.cntC>>16)&0xFFFF)!=0) && (relative.z<1 ))<<3;
|
||||
msk |= uint(((meta.cntD &0xFFFF)!=0) && (relative.x>-1))<<4;
|
||||
msk |= uint((((meta.cntD>>16)&0xFFFF)!=0) && (relative.x<1 ))<<5;
|
||||
msk |= uint(((counts.y &0xFFFFu)!=0) && (relative.y>-1))<<0;
|
||||
msk |= uint((((counts.y>>16)&0xFFFFu)!=0) && (relative.y<1 ))<<1;
|
||||
msk |= uint(((counts.z &0xFFFFu)!=0) && (relative.z>-1))<<2;
|
||||
msk |= uint((((counts.z>>16)&0xFFFFu)!=0) && (relative.z<1 ))<<3;
|
||||
msk |= uint(((counts.w &0xFFFFu)!=0) && (relative.x>-1))<<4;
|
||||
msk |= uint((((counts.w>>16)&0xFFFFu)!=0) && (relative.x<1 ))<<5;
|
||||
|
||||
msk |= uint(((meta.cntA>>16)&0xFFFF)!=0)<<6;
|
||||
msk |= uint(((counts.x>>16)&0xFFFFu)!=0)<<6;
|
||||
|
||||
|
||||
uint cmdCnt = bitCount(msk);
|
||||
@@ -107,7 +107,7 @@ void main() {
|
||||
|
||||
uint count = 0;
|
||||
//Translucency
|
||||
count = meta.cntA&0xFFFF;
|
||||
count = counts.x&0xFFFFu;
|
||||
if (count != 0) {
|
||||
uint tp = atomicAdd(translucentDrawCount, 1)+TRANSLUCENT_WRITE_BASE;
|
||||
translucentCommandData[tp] = drawId;
|
||||
@@ -123,7 +123,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//Double sided quads
|
||||
count = (meta.cntA>>16)&0xFFFF;
|
||||
count = (counts.x>>16)&0xFFFFu;
|
||||
if (count != 0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -136,7 +136,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//Down
|
||||
count = (meta.cntB)&0xFFFF;
|
||||
count = (counts.y)&0xFFFFu;
|
||||
if (((msk&(1u<<0))!=0)) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -149,7 +149,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//Up
|
||||
count = (meta.cntB>>16)&0xFFFF;
|
||||
count = (counts.y>>16)&0xFFFFu;
|
||||
if ((msk&(1u<<1))!=0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -162,7 +162,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//North
|
||||
count = (meta.cntC)&0xFFFF;
|
||||
count = (counts.z)&0xFFFFu;
|
||||
if ((msk&(1u<<2))!=0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -175,7 +175,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//South
|
||||
count = (meta.cntC>>16)&0xFFFF;
|
||||
count = (counts.z>>16)&0xFFFFu;
|
||||
if ((msk&(1u<<3))!=0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -188,7 +188,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//West
|
||||
count = (meta.cntD)&0xFFFF;
|
||||
count = (counts.w)&0xFFFFu;
|
||||
if ((msk&(1u<<4))!=0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
@@ -201,7 +201,7 @@ void main() {
|
||||
ptr += count;
|
||||
|
||||
//East
|
||||
count = (meta.cntD>>16)&0xFFFF;
|
||||
count = (counts.w>>16)&0xFFFFu;
|
||||
if ((msk&(1u<<5))!=0) {
|
||||
writeCmd(cmdPtr++, drawId, ptr, count);
|
||||
if (renderTemporally) {
|
||||
|
||||
@@ -32,6 +32,7 @@ void main() {
|
||||
//Write to the section id, to track temporal over time (litterally just need a single bit, 1 fking bit, but no)
|
||||
id = sid;
|
||||
|
||||
//Me when data race condition between visibilityData in the vert shader and frag shader
|
||||
uint previous = visibilityData[sid]&0x7fffffffu;
|
||||
bool wasVisibleLastFrame = previous==(frameId-1);
|
||||
value = (frameId&0x7fffffffu)|(uint(wasVisibleLastFrame)<<31);//Encode if it was visible last frame
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/*
|
||||
struct SectionMeta {
|
||||
uint posA;
|
||||
uint posB;
|
||||
@@ -8,29 +9,38 @@ struct SectionMeta {
|
||||
uint cntC;
|
||||
uint cntD;
|
||||
};
|
||||
*/
|
||||
struct SectionMeta {
|
||||
uvec4 a;
|
||||
uvec4 b;
|
||||
};
|
||||
|
||||
uvec2 extractRawPos(SectionMeta section) {
|
||||
return section.a.xy;
|
||||
}
|
||||
|
||||
uint extractDetail(SectionMeta section) {
|
||||
return section.posA>>28;
|
||||
return section.a.x>>28;
|
||||
}
|
||||
|
||||
ivec3 extractPosition(SectionMeta section) {
|
||||
int y = ((int(section.posA)<<4)>>24);
|
||||
int x = (int(section.posB)<<4)>>8;
|
||||
int z = int((section.posA&((1u<<20)-1))<<4);
|
||||
z |= int(section.posB>>28);
|
||||
int y = ((int(section.a.x)<<4)>>24);
|
||||
int x = (int(section.a.y)<<4)>>8;
|
||||
int z = int((section.a.x&((1u<<20)-1))<<4);
|
||||
z |= int(section.a.y>>28);
|
||||
z <<= 8;
|
||||
z >>= 8;
|
||||
return ivec3(x,y,z);
|
||||
}
|
||||
|
||||
uint extractQuadStart(SectionMeta meta) {
|
||||
return meta.ptr;
|
||||
return meta.a.w;
|
||||
}
|
||||
|
||||
ivec3 extractAABBOffset(SectionMeta meta) {
|
||||
return (ivec3(meta.AABB)>>ivec3(0,5,10))&31;
|
||||
return (ivec3(meta.a.z)>>ivec3(0,5,10))&31;
|
||||
}
|
||||
|
||||
ivec3 extractAABBSize(SectionMeta meta) {
|
||||
return ((ivec3(meta.AABB)>>ivec3(15,20,25))&31)+1;//The size is + 1 cause its always at least 1x1x1
|
||||
return ((ivec3(meta.a.z)>>ivec3(15,20,25))&31)+1;//The size is + 1 cause its always at least 1x1x1
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user