diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/buildtranslucents.comp b/src/main/resources/assets/voxy/shaders/lod/gl46/buildtranslucents.comp index 864791ae..e972baaf 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/buildtranslucents.comp +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/buildtranslucents.comp @@ -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); } \ No newline at end of file diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/cmdgen.comp b/src/main/resources/assets/voxy/shaders/lod/gl46/cmdgen.comp index aaa737b4..bf363859 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/cmdgen.comp +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/cmdgen.comp @@ -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) { diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert b/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert index bfa0b55a..e8e63bf0 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/cull/raster.vert @@ -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 diff --git a/src/main/resources/assets/voxy/shaders/lod/section.glsl b/src/main/resources/assets/voxy/shaders/lod/section.glsl index 52bcebeb..f9b4d87d 100644 --- a/src/main/resources/assets/voxy/shaders/lod/section.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/section.glsl @@ -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 }