From f0efd3667429620a9878932c8f9773f955bcd50c Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:14:06 +1000 Subject: [PATCH] try not to crash on shader load failure --- .../voxy/client/iris/IrisShaderPatch.java | 5 ++-- .../voxy/client/iris/ShaderLoadError.java | 11 ++++++++ .../voxy/client/mixin/iris/MixinIris.java | 25 +++++++++++++++++++ .../mixin/minecraft/MixinWorldRenderer.java | 11 +++++++- src/main/resources/client.voxy.mixins.json | 1 + 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/cortex/voxy/client/iris/ShaderLoadError.java create mode 100644 src/main/java/me/cortex/voxy/client/mixin/iris/MixinIris.java diff --git a/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java b/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java index c5c3a3d7..ec61b3fa 100644 --- a/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java +++ b/src/main/java/me/cortex/voxy/client/iris/IrisShaderPatch.java @@ -316,15 +316,14 @@ public class IrisShaderPatch { } catch (Exception e) { patchData = null; Logger.error("Failed to parse patch data gson",e); - IrisUtil.disableIrisShaders(); + throw new ShaderLoadError("Failed to parse patch data gson",e); } if (patchData == null) { return null; } if (patchData.version != VERSION) { Logger.error("Shader has voxy patch data, but patch version is incorrect. expected " + VERSION + " got "+patchData.version); - IrisUtil.disableIrisShaders(); - return null; + throw new IllegalStateException("Shader version mismatch expected " + VERSION + " got "+patchData.version); } return new IrisShaderPatch(patchData, ipack); } diff --git a/src/main/java/me/cortex/voxy/client/iris/ShaderLoadError.java b/src/main/java/me/cortex/voxy/client/iris/ShaderLoadError.java new file mode 100644 index 00000000..19e3ce34 --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/iris/ShaderLoadError.java @@ -0,0 +1,11 @@ +package me.cortex.voxy.client.iris; + +public class ShaderLoadError extends RuntimeException { + public ShaderLoadError(String reason) { + super(reason); + } + + public ShaderLoadError(String reason, Exception cause) { + super(reason, cause); + } +} diff --git a/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIris.java b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIris.java new file mode 100644 index 00000000..47322c65 --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/mixin/iris/MixinIris.java @@ -0,0 +1,25 @@ +package me.cortex.voxy.client.mixin.iris; + +import me.cortex.voxy.client.iris.ShaderLoadError; +import me.cortex.voxy.common.Logger; +import net.irisshaders.iris.Iris; +import net.irisshaders.iris.shaderpack.ShaderPack; +import net.irisshaders.iris.shaderpack.materialmap.NamespacedId; +import net.irisshaders.iris.shaderpack.programs.ProgramSet; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Iris.class) +public class MixinIris { + @Redirect(method = "createPipeline", at = @At(value = "INVOKE", target = "Lnet/irisshaders/iris/shaderpack/ShaderPack;getProgramSet(Lnet/irisshaders/iris/shaderpack/materialmap/NamespacedId;)Lnet/irisshaders/iris/shaderpack/programs/ProgramSet;")) + private static ProgramSet voxy$redirectProgramSet(ShaderPack shaderPack, NamespacedId dim) { + try { + return shaderPack.getProgramSet(dim); + } catch (ShaderLoadError e) { + Logger.error(e); + return null; + } + } +} diff --git a/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWorldRenderer.java b/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWorldRenderer.java index cdb10039..756a1e9c 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWorldRenderer.java +++ b/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWorldRenderer.java @@ -4,6 +4,7 @@ import me.cortex.voxy.client.VoxyClientInstance; import me.cortex.voxy.client.config.VoxyConfig; import me.cortex.voxy.client.core.IGetVoxyRenderSystem; import me.cortex.voxy.client.core.VoxyRenderSystem; +import me.cortex.voxy.client.core.util.IrisUtil; import me.cortex.voxy.common.Logger; import me.cortex.voxy.common.world.WorldEngine; import me.cortex.voxy.commonImpl.VoxyCommon; @@ -79,6 +80,14 @@ public abstract class MixinWorldRenderer implements IGetVoxyRenderSystem { Logger.error("Null world selected"); return; } - this.renderer = new VoxyRenderSystem(world, instance.getThreadPool()); + try { + this.renderer = new VoxyRenderSystem(world, instance.getThreadPool()); + } catch (RuntimeException e) { + if (IrisUtil.irisShaderPackEnabled()) { + IrisUtil.disableIrisShaders(); + } else { + throw e; + } + } } } diff --git a/src/main/resources/client.voxy.mixins.json b/src/main/resources/client.voxy.mixins.json index f9c9fe92..842323cc 100644 --- a/src/main/resources/client.voxy.mixins.json +++ b/src/main/resources/client.voxy.mixins.json @@ -9,6 +9,7 @@ "iris.MixinPackRenderTargetDirectives", "iris.CustomUniformsAccessor", "iris.IrisRenderingPipelineAccessor", + "iris.MixinIris", "iris.MixinIrisRenderingPipeline", "iris.MixinIrisSamplers", "iris.MixinMatrixUniforms",