From 6087dba91b65d9ce39050648e5a1ac5ca1004f34 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Tue, 6 May 2025 20:33:21 +1000 Subject: [PATCH] notes and tweeks --- .../voxy/client/core/model/ModelFactory.java | 8 ++++++++ .../HierarchicalOcclusionTraverser.java | 2 +- .../core/rendering/util/UploadStream.java | 2 +- .../config/compressors/ZSTDCompressor.java | 3 +++ .../assets/voxy/shaders/lod/gl46/quads.frag | 1 + .../voxy/shaders/lod/hierarchical/queue.glsl | 2 ++ .../lod/hierarchical/traversal_dev.comp | 18 +++++++++++------- 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java b/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java index a312c51e..61080ddc 100644 --- a/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java +++ b/src/main/java/me/cortex/voxy/client/core/model/ModelFactory.java @@ -415,6 +415,10 @@ public class ModelFactory { } metadata |= fullyOpaque?(1L<<(48+6)):0; + + boolean canBeCorrectlyRendered = true;//This represents if a model can be correctly (perfectly) represented + // i.e. no gaps + this.metadataCache[modelId] = metadata; uploadPtr += 4*6; @@ -629,6 +633,10 @@ public class ModelFactory { return res; } + public int[] _unsafeRawAccess() { + return this.idMappings; + } + public int getModelId(int blockId) { int map = this.idMappings[blockId]; if (map == -1) { diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/HierarchicalOcclusionTraverser.java b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/HierarchicalOcclusionTraverser.java index b3cfed3e..38cbdf82 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/HierarchicalOcclusionTraverser.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/HierarchicalOcclusionTraverser.java @@ -282,7 +282,7 @@ public class HierarchicalOcclusionTraverser { glBindBufferBase(GL_SHADER_STORAGE_BUFFER, NODE_QUEUE_SINK_BINDING, this.scratchQueueB.id); //Dont need to use indirect to dispatch the first iteration - glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT|GL_COMMAND_BARRIER_BIT); + glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT|GL_COMMAND_BARRIER_BIT|GL_BUFFER_UPDATE_BARRIER_BIT); glDispatchCompute(firstDispatchSize, 1,1); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT|GL_COMMAND_BARRIER_BIT); diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/util/UploadStream.java b/src/main/java/me/cortex/voxy/client/core/rendering/util/UploadStream.java index 21f84aae..616c4318 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/util/UploadStream.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/util/UploadStream.java @@ -80,7 +80,7 @@ public class UploadStream { public void commit() { - glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); + glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT|GL_BUFFER_UPDATE_BARRIER_BIT); //Execute all the copies for (var entry : this.uploadList) { glCopyNamedBufferSubData(this.uploadBuffer.id, entry.target.id, entry.uploadOffset, entry.targetOffset, entry.size); diff --git a/src/main/java/me/cortex/voxy/common/config/compressors/ZSTDCompressor.java b/src/main/java/me/cortex/voxy/common/config/compressors/ZSTDCompressor.java index aec25af7..a0c8539a 100644 --- a/src/main/java/me/cortex/voxy/common/config/compressors/ZSTDCompressor.java +++ b/src/main/java/me/cortex/voxy/common/config/compressors/ZSTDCompressor.java @@ -12,14 +12,17 @@ import static org.lwjgl.util.zstd.Zstd.*; public class ZSTDCompressor implements StorageCompressor { private static final Cleaner CLEANER = Cleaner.create(); private record Ref(long ptr) {} + private static Ref createCleanableCompressionContext() { long ctx = ZSTD_createCCtx(); var ref = new Ref(ctx); CLEANER.register(ref, ()->ZSTD_freeCCtx(ctx)); return ref; } + private static Ref createCleanableDecompressionContext() { long ctx = ZSTD_createDCtx(); + nZSTD_DCtx_setParameter(ctx, ZSTD_d_experimentalParam3, 1);//experimental ZSTD_d_forceIgnoreChecksum var ref = new Ref(ctx); CLEANER.register(ref, ()->ZSTD_freeDCtx(ctx)); return ref; diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag b/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag index 08ac61a2..ac2bcc5b 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag @@ -27,6 +27,7 @@ void main() { vec2 uv = mod(uv, vec2(1.0))*(1.0/(vec2(3.0,2.0)*256.0)); vec2 texPos = uv + baseUV; //vec4 colour = solidColour; + //TODO: FIXME, need to manually compute the mip colour vec4 colour = texture(blockModelAtlas, texPos, ((flags>>1)&1u)*-5.0);//TODO: FIXME mipping needs to be fixed so that it doesnt go cross model bounds //Also, small quad is really fking over the mipping level somehow if ((flags&1u) == 1 && colour.a <= 0.25f) { diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchical/queue.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchical/queue.glsl index 2b73f3ed..66f44e9b 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchical/queue.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchical/queue.glsl @@ -21,6 +21,8 @@ uint getCurrentNode() { return nodeQueueSource[gl_GlobalInvocationID.x]; } + +//TODO: limit the size/writing out of bounds uint nodePushIndex = -1; void pushNodesInit(uint nodeCount) { //Debug diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchical/traversal_dev.comp b/src/main/resources/assets/voxy/shaders/lod/hierarchical/traversal_dev.comp index c78c743d..642a339e 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchical/traversal_dev.comp +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchical/traversal_dev.comp @@ -78,14 +78,18 @@ void enqueueSelfForRender(in UnpackedNode node) { if (renderQueueIndex < renderQueueMaxSize) { lastRenderFrame[getId(node)] = frameId; if (!isEmptyMesh(node)) { - renderQueue[atomicAdd(renderQueueIndex, 1)] = getMesh(node); - #ifdef IS_DEBUG - debugRenderNodeQueue[atomicAdd(debugRenderNodeQueueIndex, 1)] = node.nodeId; - #endif + uint renderIndex = atomicAdd(renderQueueIndex, 1); + if (renderIndex < renderQueueMaxSize) { + renderQueue[renderIndex] = getMesh(node); - #ifdef HAS_STATISTICS - atomicAdd(renderCounts[node.lodLevel], 1); - #endif + #ifdef IS_DEBUG + debugRenderNodeQueue[atomicAdd(debugRenderNodeQueueIndex, 1)] = node.nodeId; + #endif + + #ifdef HAS_STATISTICS + atomicAdd(renderCounts[node.lodLevel], 1); + #endif + } } } }