From 6eb24ecde13ecd14ebb933faa4dd1907fe4c7801 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 10 Nov 2025 07:33:03 -0600 Subject: [PATCH] re-add GPU upload config including "none" --- .../api/enums/config/EDhApiGpuUploadMethod.java | 4 ++++ .../seibel/distanthorizons/core/config/Config.java | 7 +++++++ .../bufferBuilding/ColumnRenderBufferBuilder.java | 2 +- .../render/bufferBuilding/LodBufferContainer.java | 14 +++++++++----- .../core/render/glObject/GLProxy.java | 11 ++++++++++- .../core/render/glObject/buffer/GLBuffer.java | 7 ++++--- .../assets/distanthorizons/lang/en_us.json | 6 ++++++ 7 files changed, 41 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiGpuUploadMethod.java b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiGpuUploadMethod.java index a2fca195b..ccd511013 100644 --- a/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiGpuUploadMethod.java +++ b/api/src/main/java/com/seibel/distanthorizons/api/enums/config/EDhApiGpuUploadMethod.java @@ -44,6 +44,10 @@ public enum EDhApiGpuUploadMethod /** Fast rendering but may stutter when uploading. */ SUB_DATA(false, false), + /** Don't upload, only should be used for debugging */ + @Deprecated // TODO remove before release + NONE(false, false), + /** * May end up storing buffers in System memory.
* Fast rending if in GPU memory, slow if in system memory,
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 1cb36fae5..3ee1cc497 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -1083,6 +1083,13 @@ public class Config + "") .build(); + public static ConfigEntry glUploadMode = new ConfigEntry.Builder() + .set(EDhApiGpuUploadMethod.AUTO) + .comment("" + + "\n" + + "") + .build(); + } public static class ColumnBuilderDebugging diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java index 41c3ace35..a797f18be 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java @@ -65,7 +65,7 @@ public class ColumnRenderBufferBuilder { DhBlockPos minBlockPos = new DhBlockPos(DhSectionPos.getMinCornerBlockX(pos), clientLevel.getLevelWrapper().getMinHeight(), DhSectionPos.getMinCornerBlockZ(pos)); LodBufferContainer bufferContainer = new LodBufferContainer(pos, minBlockPos); - CompletableFuture uploadFuture = bufferContainer.makeAndUploadBuffersAsync(quadBuilder, GLProxy.getInstance().getGpuUploadMethod()); + CompletableFuture uploadFuture = bufferContainer.makeAndUploadBuffersAsync(quadBuilder); uploadFuture.whenComplete((uploadedBuffer, exception) -> { // clean up if not uploaded diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java index 4b5c92c89..7b03ccb09 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java @@ -82,7 +82,7 @@ public class LodBufferContainer implements AutoCloseable //==================// /** Should be run on a DH thread. */ - public synchronized CompletableFuture makeAndUploadBuffersAsync(LodQuadBuilder builder, EDhApiGpuUploadMethod gpuUploadMethod) + public synchronized CompletableFuture makeAndUploadBuffersAsync(LodQuadBuilder builder) { // separate variable to prevent race condition when checking null CompletableFuture future = this.uploadFuture; @@ -117,6 +117,8 @@ public class LodBufferContainer implements AutoCloseable throw new InterruptedException(); } + EDhApiGpuUploadMethod gpuUploadMethod = GLProxy.getInstance().getGpuUploadMethod(); + // upload on the render thread uploadBuffersDirect(this.vbos, opaqueBuffers, gpuUploadMethod); uploadBuffersDirect(this.vbosTransparent, transparentBuffers, gpuUploadMethod); @@ -177,7 +179,9 @@ public class LodBufferContainer implements AutoCloseable } return newVbos; } - private static void uploadBuffersDirect(GLVertexBuffer[] vbos, ArrayList byteBuffers, EDhApiGpuUploadMethod method) throws InterruptedException + private static void uploadBuffersDirect( + GLVertexBuffer[] vbos, ArrayList byteBuffers, + EDhApiGpuUploadMethod uploadMethod) throws InterruptedException { int vboIndex = 0; for (int i = 0; i < byteBuffers.size(); i++) @@ -191,7 +195,7 @@ public class LodBufferContainer implements AutoCloseable // get or create the VBO if (vbos[vboIndex] == null) { - vbos[vboIndex] = new GLVertexBuffer(method.useBufferStorage); + vbos[vboIndex] = new GLVertexBuffer(uploadMethod.useBufferStorage); } GLVertexBuffer vbo = vbos[vboIndex]; @@ -202,13 +206,13 @@ public class LodBufferContainer implements AutoCloseable try { vbo.bind(); - vbo.uploadBuffer(buffer, size / LodUtil.LOD_VERTEX_FORMAT.getByteSize(), method, FULL_SIZED_BUFFER); + vbo.uploadBuffer(buffer, size / LodUtil.LOD_VERTEX_FORMAT.getByteSize(), uploadMethod, FULL_SIZED_BUFFER); } catch (Exception e) { vbos[vboIndex] = null; vbo.close(); - LOGGER.error("Failed to upload buffer: ", e); + LOGGER.error("Failed to upload buffer. Error: ["+e.getMessage()+"].", e); } vboIndex++; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/GLProxy.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/GLProxy.java index 2286a3429..dc4e5c6f1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/GLProxy.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/GLProxy.java @@ -220,7 +220,16 @@ public class GLProxy return instance; } - public EDhApiGpuUploadMethod getGpuUploadMethod() { return this.preferredUploadMethod; } + public EDhApiGpuUploadMethod getGpuUploadMethod() + { + EDhApiGpuUploadMethod uploadOverride = Config.Client.Advanced.Debugging.OpenGl.glUploadMode.get(); + if (uploadOverride == EDhApiGpuUploadMethod.AUTO) + { + return this.preferredUploadMethod; + } + + return uploadOverride; + } public boolean runningOnRenderThread() { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/GLBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/GLBuffer.java index d45d61bae..4c16652b1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/GLBuffer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/glObject/buffer/GLBuffer.java @@ -27,7 +27,6 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.render.glObject.GLProxy; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.ThreadUtil; -import com.seibel.distanthorizons.core.util.math.UnitBytes; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftGLWrapper; import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL44; @@ -187,7 +186,6 @@ public class GLBuffer implements AutoCloseable { LodUtil.assertNotReach("maxExpansionSize is [" + maxExpansionSize + "] but buffer size is [" + bbSize + "]!"); } - GLProxy.LOGGER.debug("Uploading buffer with ["+new UnitBytes(bbSize)+"]."); // Don't upload an empty buffer if (bbSize == 0) @@ -200,6 +198,8 @@ public class GLBuffer implements AutoCloseable switch (uploadMethod) { + case NONE: + return; case AUTO: LodUtil.assertNotReach("GpuUploadMethod AUTO must be resolved before call to uploadBuffer()!"); case BUFFER_STORAGE: @@ -379,6 +379,7 @@ public class GLBuffer implements AutoCloseable { int id = PHANTOM_TO_BUFFER_ID.get(phantomRef); destroyBufferIdAsync(id); + LOGGER.warn("Buffer Phantom collected, ID: ["+id+"]"); } phantomRef = PHANTOM_REFERENCE_QUEUE.poll(); @@ -386,7 +387,7 @@ public class GLBuffer implements AutoCloseable } catch (Exception e) { - LOGGER.error("Unexpected error in cleanup thread: [" + e.getMessage() + "].", e); + LOGGER.error("Unexpected error in buffer cleanup thread: [" + e.getMessage() + "].", e); } } } diff --git a/core/src/main/resources/assets/distanthorizons/lang/en_us.json b/core/src/main/resources/assets/distanthorizons/lang/en_us.json index 6c7f85efa..813af98ee 100644 --- a/core/src/main/resources/assets/distanthorizons/lang/en_us.json +++ b/core/src/main/resources/assets/distanthorizons/lang/en_us.json @@ -509,6 +509,10 @@ "Validate Buffer IDs Before Rendering", "distanthorizons.config.client.advanced.debugging.openGl.validateBufferIdsBeforeRendering.@tooltip": "Massively reduces FPS. \nShould only be used if mysterious EXCEPTION_ACCESS_VIOLATION crashes are happening in DH's rendering code and you're attempting to troubleshoot it.", + "distanthorizons.config.client.advanced.debugging.openGl.glUploadMode": + "Uploade Mode", + "distanthorizons.config.client.advanced.debugging.openGl.glUploadMode.@tooltip": + "Only for debugging", @@ -1046,6 +1050,8 @@ "distanthorizons.config.enum.EDhApiGpuUploadMethod.AUTO": "Auto", + "distanthorizons.config.enum.EDhApiGpuUploadMethod.NONE": + "None", "distanthorizons.config.enum.EDhApiGpuUploadMethod.BUFFER_STORAGE": "Buffer storage", "distanthorizons.config.enum.EDhApiGpuUploadMethod.SUB_DATA":