From 5ff2951b5a4c36dc5e6921aa82bdf4d73aa1b242 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 23 Dec 2023 14:11:21 -0500 Subject: [PATCH] Work around Flywheel leaving freed buffers in BufferBuilder --- .../buffer_builder_leak/BufferBuilderMixin.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java index c78e6c5a..0319d519 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.render.UnsafeBufferHelper; +import org.spongepowered.asm.mixin.Dynamic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -12,13 +13,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.nio.ByteBuffer; -@Mixin(BufferBuilder.class) +@Mixin(value = BufferBuilder.class, priority = 1500) @ClientOnlyMixin public class BufferBuilderMixin { @Shadow private ByteBuffer buffer; private static boolean leakReported = false; + private boolean mfix$shouldFree = true; + + @Dynamic + @Inject(method = "flywheel$injectForRender", at = @At("RETURN"), remap = false, require = 0) + private void preventFree(CallbackInfo ci) { + mfix$shouldFree = false; + } + /** * Ensure UnsafeBufferHelper is classloaded early, to avoid Forge's event transformer showing an error in the log. */ @@ -32,7 +41,7 @@ public class BufferBuilderMixin { try { ByteBuffer buf = buffer; // can be null if a mod already tried to free the buffer - if(buf != null) { + if(buf != null && mfix$shouldFree) { if(!leakReported) { leakReported = true; ModernFix.LOGGER.warn("One or more BufferBuilders have been leaked, ModernFix will attempt to correct this.");