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