From 2d70388587f54fddb618a818eed8d935bfb845c9 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 12 Feb 2026 07:27:11 -0600 Subject: [PATCH] Maybe fix Mac crashing with sodium on world start? --- .../core/api/internal/ClientApi.java | 9 +++++++- .../core/render/renderer/RenderParams.java | 23 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java index 96d9a711c..b75e3c5a8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java @@ -410,6 +410,8 @@ public class ClientApi */ public void renderDeferredLodsForShaders() { this.renderLodLayer(true); } + public static long firstRenderTimeMs = 0; + private void renderLodLayer(boolean renderingDeferredLayer) { IProfilerWrapper profiler = MC_CLIENT.getProfiler(); @@ -529,7 +531,12 @@ public class ClientApi //============// ///region - String validationMessage = renderParams.getValidationErrorMessage(); + if (firstRenderTimeMs == 0) + { + firstRenderTimeMs = System.currentTimeMillis(); + } + + String validationMessage = renderParams.getValidationErrorMessage(firstRenderTimeMs); if (validationMessage != null) { // store the error message so it can be seen on the F3 screen diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java index ce3699919..67ab123ad 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderParams.java @@ -4,6 +4,7 @@ import com.seibel.distanthorizons.api.enums.rendering.EDhApiRenderPass; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.jar.EPlatform; import com.seibel.distanthorizons.core.level.IDhClientLevel; import com.seibel.distanthorizons.core.render.RenderBufferHandler; import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer; @@ -27,6 +28,8 @@ public class RenderParams extends DhApiRenderParam private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + private static final long TIME_FOR_MAC_TO_FINISH_COMPILING_IN_MS = 5_000; + public IDhClientWorld dhClientWorld; public IDhClientLevel dhClientLevel; @@ -92,7 +95,7 @@ public class RenderParams extends DhApiRenderParam * Should be called before rendering is done. * @return a message if LODs shouldn't be rendered, null if the LODs can render */ - public String getValidationErrorMessage() + public String getValidationErrorMessage(long firstRenderTimeMs) { // Note: all strings here should be constants to prevent String allocations @@ -148,6 +151,24 @@ public class RenderParams extends DhApiRenderParam } + // potential fix for a segfault when + // Sodium and DH are running together + if (EPlatform.get() == EPlatform.MACOS) + { + // Once MC starts rendering, wait a few seconds so + // MC/Sodium can finish their shader compiling before DH does its own. + // This will allow DH to compile its own shaders after Sodium finishes + // compiling it's own. + + long nowMs = System.currentTimeMillis(); + long firstAllowedRenderTimeMs = firstRenderTimeMs + TIME_FOR_MAC_TO_FINISH_COMPILING_IN_MS; + if (nowMs < firstAllowedRenderTimeMs) + { + return "Waiting for initial MC compile..."; + } + } + + return null; }