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

View File

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

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) //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

View File

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