tweek section meta

This commit is contained in:
mcrcortex
2025-07-13 18:13:15 +10:00
parent 64d211b333
commit aff30961bd
4 changed files with 37 additions and 26 deletions

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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

View File

@@ -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
}