diff --git a/common/src/main/java/foundry/veil/ext/iris/IrisRenderingPipelineExtension.java b/common/src/main/java/foundry/veil/ext/iris/IrisRenderingPipelineExtension.java deleted file mode 100644 index 84096006a..000000000 --- a/common/src/main/java/foundry/veil/ext/iris/IrisRenderingPipelineExtension.java +++ /dev/null @@ -1,6 +0,0 @@ -package foundry.veil.ext.iris; - -public interface IrisRenderingPipelineExtension { - - void veil$bindSimpleFramebuffer(); -} diff --git a/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/IrisRenderingPipelineMixin.java b/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/IrisRenderingPipelineMixin.java deleted file mode 100644 index eac374b8f..000000000 --- a/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/IrisRenderingPipelineMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package foundry.veil.fabric.mixin.compat.iris; - -import foundry.veil.api.client.render.framebuffer.AdvancedFbo; -import foundry.veil.ext.iris.IrisRenderingPipelineExtension; -import net.irisshaders.iris.pipeline.IrisRenderingPipeline; -import net.irisshaders.iris.targets.RenderTarget; -import net.irisshaders.iris.targets.RenderTargets; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(IrisRenderingPipeline.class) -public class IrisRenderingPipelineMixin implements IrisRenderingPipelineExtension { - - @Shadow - @Final - private RenderTargets renderTargets; - - @Unique - private AdvancedFbo veil$simpleFbo; - - @Override - public void veil$bindSimpleFramebuffer() { - RenderTarget mainColorBuffer = this.renderTargets.getOrCreate(0); - if (this.veil$simpleFbo == null || - this.veil$simpleFbo.getWidth() != mainColorBuffer.getWidth() || - this.veil$simpleFbo.getHeight() != mainColorBuffer.getHeight()) { - if (this.veil$simpleFbo != null) { - this.veil$simpleFbo.free(); - } - this.veil$simpleFbo = AdvancedFbo.withSize(mainColorBuffer.getWidth(), mainColorBuffer.getHeight()) - .addColorTextureWrapper(mainColorBuffer.getMainTexture()) - .setDepthTextureWrapper(this.renderTargets.getDepthTexture()) - .build(true); - } - this.veil$simpleFbo.bind(false); - } - - @Inject(method = "destroy", at = @At("TAIL"), remap = false) - public void destroy(CallbackInfo ci) { - if (this.veil$simpleFbo != null) { - this.veil$simpleFbo.free(); - this.veil$simpleFbo = null; - } - } -} diff --git a/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/ShaderWrapperMixin.java b/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/ShaderWrapperMixin.java index fe911eca7..34fc8213f 100644 --- a/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/ShaderWrapperMixin.java +++ b/fabric/src/main/java/foundry/veil/fabric/mixin/compat/iris/ShaderWrapperMixin.java @@ -1,37 +1,57 @@ package foundry.veil.fabric.mixin.compat.iris; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; -import foundry.veil.api.client.render.framebuffer.AdvancedFbo; -import foundry.veil.ext.iris.IrisRenderingPipelineExtension; +import com.mojang.blaze3d.platform.GlStateManager; import foundry.veil.impl.client.render.shader.program.ShaderProgramImpl; import net.irisshaders.iris.Iris; +import net.irisshaders.iris.pipeline.IrisRenderingPipeline; import net.irisshaders.iris.pipeline.WorldRenderingPipeline; +import net.irisshaders.iris.shadows.ShadowRenderer; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Optional; +import static org.lwjgl.opengl.GL11C.glGetInteger; +import static org.lwjgl.opengl.GL30C.*; + @Mixin(ShaderProgramImpl.Wrapper.class) public class ShaderWrapperMixin { + // apply and clear are separate methods, so the framebuffer to restore has to be kept on the shader + @Unique + private int veil$previousReadFramebuffer = -1; + @Unique + private int veil$previousDrawFramebuffer = -1; + @Inject(method = "apply", at = @At("TAIL")) - public void apply(CallbackInfo ci, @Share("drawn") LocalBooleanRef drawnRef) { + public void apply(CallbackInfo ci) { + // Redirect into Iris's buffers the same way Iris does for other shaders it doesn't know: only while it's + // rendering the world (not in GUIs or the shadow pass), and into the copy of colortex0 the pack is using Optional pipelineOptional = Iris.getPipelineManager().getPipeline(); - if (pipelineOptional.isEmpty() || !(pipelineOptional.get() instanceof IrisRenderingPipelineExtension extension)) { + if (pipelineOptional.isEmpty() || !(pipelineOptional.get() instanceof IrisRenderingPipeline pipeline) || !pipeline.shouldOverrideShaders() || ShadowRenderer.ACTIVE) { return; } - drawnRef.set(true); - extension.veil$bindSimpleFramebuffer(); + if (this.veil$previousDrawFramebuffer == -1) { + this.veil$previousReadFramebuffer = glGetInteger(GL_READ_FRAMEBUFFER_BINDING); + this.veil$previousDrawFramebuffer = glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING); + } + pipeline.bindDefault(); } @Inject(method = "clear", at = @At("TAIL")) - public void clear(CallbackInfo ci, @Share("drawn") LocalBooleanRef drawnRef) { - if (drawnRef.get()) { - AdvancedFbo.unbind(); + public void clear(CallbackInfo ci) { + if (this.veil$previousDrawFramebuffer == -1) { + return; } + + // Restore whatever was bound before, which isn't always the main framebuffer (e.g. Iris's own while in the world) + GlStateManager._glBindFramebuffer(GL_READ_FRAMEBUFFER, this.veil$previousReadFramebuffer); + GlStateManager._glBindFramebuffer(GL_DRAW_FRAMEBUFFER, this.veil$previousDrawFramebuffer); + this.veil$previousReadFramebuffer = -1; + this.veil$previousDrawFramebuffer = -1; } } diff --git a/fabric/src/main/resources/veil.fabric.mixins.json b/fabric/src/main/resources/veil.fabric.mixins.json index 01693d86b..900d2a0a8 100644 --- a/fabric/src/main/resources/veil.fabric.mixins.json +++ b/fabric/src/main/resources/veil.fabric.mixins.json @@ -30,7 +30,6 @@ "compat.imguimc.KeyboardHandlerMixin", "compat.imguimc.MouseHandlerMixin", "compat.iris.IrisRenderingPipelineAccessor", - "compat.iris.IrisRenderingPipelineMixin", "compat.iris.IrisRenderTargetMixin", "compat.iris.ShaderWrapperMixin", "compat.replaymod.PipelineMixin", diff --git a/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/IrisRenderingPipelineMixin.java b/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/IrisRenderingPipelineMixin.java deleted file mode 100644 index 0993af2e9..000000000 --- a/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/IrisRenderingPipelineMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package foundry.veil.forge.mixin.compat.iris; - -import foundry.veil.api.client.render.framebuffer.AdvancedFbo; -import foundry.veil.ext.iris.IrisRenderingPipelineExtension; -import net.irisshaders.iris.pipeline.IrisRenderingPipeline; -import net.irisshaders.iris.targets.RenderTarget; -import net.irisshaders.iris.targets.RenderTargets; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(IrisRenderingPipeline.class) -public class IrisRenderingPipelineMixin implements IrisRenderingPipelineExtension { - - @Shadow - @Final - private RenderTargets renderTargets; - - @Unique - private AdvancedFbo veil$simpleFbo; - - @Override - public void veil$bindSimpleFramebuffer() { - RenderTarget mainColorBuffer = this.renderTargets.getOrCreate(0); - if (this.veil$simpleFbo == null || - this.veil$simpleFbo.getWidth() != mainColorBuffer.getWidth() || - this.veil$simpleFbo.getHeight() != mainColorBuffer.getHeight()) { - if (this.veil$simpleFbo != null) { - this.veil$simpleFbo.free(); - } - this.veil$simpleFbo = AdvancedFbo.withSize(mainColorBuffer.getWidth(), mainColorBuffer.getHeight()) - .addColorTextureWrapper(mainColorBuffer.getMainTexture()) - .setDepthTextureWrapper(this.renderTargets.getDepthTexture()) - .build(true); - } - this.veil$simpleFbo.bind(false); - } - - @Inject(method = "destroy", at = @At("TAIL"), remap = false) - public void destroy(CallbackInfo ci) { - if (this.veil$simpleFbo != null) { - this.veil$simpleFbo.free(); - this.veil$simpleFbo = null; - } - } -} diff --git a/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/ShaderWrapperMixin.java b/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/ShaderWrapperMixin.java index f3060ee79..1dff1679b 100644 --- a/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/ShaderWrapperMixin.java +++ b/neoforge/src/main/java/foundry/veil/forge/mixin/compat/iris/ShaderWrapperMixin.java @@ -1,37 +1,57 @@ package foundry.veil.forge.mixin.compat.iris; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; -import foundry.veil.api.client.render.framebuffer.AdvancedFbo; -import foundry.veil.ext.iris.IrisRenderingPipelineExtension; +import com.mojang.blaze3d.platform.GlStateManager; import foundry.veil.impl.client.render.shader.program.ShaderProgramImpl; import net.irisshaders.iris.Iris; +import net.irisshaders.iris.pipeline.IrisRenderingPipeline; import net.irisshaders.iris.pipeline.WorldRenderingPipeline; +import net.irisshaders.iris.shadows.ShadowRenderer; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Optional; +import static org.lwjgl.opengl.GL11C.glGetInteger; +import static org.lwjgl.opengl.GL30C.*; + @Mixin(ShaderProgramImpl.Wrapper.class) public class ShaderWrapperMixin { + // apply and clear are separate methods, so the framebuffer to restore has to be kept on the shader + @Unique + private int veil$previousReadFramebuffer = -1; + @Unique + private int veil$previousDrawFramebuffer = -1; + @Inject(method = "apply", at = @At("TAIL")) - public void apply(CallbackInfo ci, @Share("drawn") LocalBooleanRef drawnRef) { + public void apply(CallbackInfo ci) { + // Redirect into Iris's buffers the same way Iris does for other shaders it doesn't know: only while it's + // rendering the world (not in GUIs or the shadow pass), and into the copy of colortex0 the pack is using Optional pipelineOptional = Iris.getPipelineManager().getPipeline(); - if (pipelineOptional.isEmpty() || !(pipelineOptional.get() instanceof IrisRenderingPipelineExtension extension)) { + if (pipelineOptional.isEmpty() || !(pipelineOptional.get() instanceof IrisRenderingPipeline pipeline) || !pipeline.shouldOverrideShaders() || ShadowRenderer.ACTIVE) { return; } - drawnRef.set(true); - extension.veil$bindSimpleFramebuffer(); + if (this.veil$previousDrawFramebuffer == -1) { + this.veil$previousReadFramebuffer = glGetInteger(GL_READ_FRAMEBUFFER_BINDING); + this.veil$previousDrawFramebuffer = glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING); + } + pipeline.bindDefault(); } @Inject(method = "clear", at = @At("TAIL")) - public void clear(CallbackInfo ci, @Share("drawn") LocalBooleanRef drawnRef) { - if (drawnRef.get()) { - AdvancedFbo.unbind(); + public void clear(CallbackInfo ci) { + if (this.veil$previousDrawFramebuffer == -1) { + return; } + + // Restore whatever was bound before, which isn't always the main framebuffer (e.g. Iris's own while in the world) + GlStateManager._glBindFramebuffer(GL_READ_FRAMEBUFFER, this.veil$previousReadFramebuffer); + GlStateManager._glBindFramebuffer(GL_DRAW_FRAMEBUFFER, this.veil$previousDrawFramebuffer); + this.veil$previousReadFramebuffer = -1; + this.veil$previousDrawFramebuffer = -1; } } diff --git a/neoforge/src/main/resources/veil.neoforge.mixins.json b/neoforge/src/main/resources/veil.neoforge.mixins.json index 70d47e599..d3738337a 100644 --- a/neoforge/src/main/resources/veil.neoforge.mixins.json +++ b/neoforge/src/main/resources/veil.neoforge.mixins.json @@ -25,7 +25,6 @@ "client.perspective.sodium.SodiumWorldRendererMixin", "client.perspective.vanilla.LevelRendererMixin", "compat.iris.IrisRenderingPipelineAccessor", - "compat.iris.IrisRenderingPipelineMixin", "compat.iris.IrisRenderTargetMixin", "compat.iris.ShaderWrapperMixin", "compat.sodium.BlockRendererMixin",