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 1/2] 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."); From a7c2424b1439600eecf3aaa8ec1f173feda17361 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 23 Dec 2023 15:53:40 -0500 Subject: [PATCH 2/2] Handle missing models in item overrides --- .../mixin/perf/dynamic_resources/ItemOverridesMixin.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java index 794757dc..2d155459 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java @@ -1,8 +1,11 @@ package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.block.model.ItemOverride; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.dynamicresources.ItemOverrideBakedModel; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -20,11 +23,12 @@ public class ItemOverridesMixin { } @Inject(method = "resolve", at = @At("RETURN"), cancellable = true) - private void getRealModel(CallbackInfoReturnable cir) { + private void getRealModel(BakedModel bakedModel, ItemStack itemStack, ClientLevel clientLevel, LivingEntity livingEntity, CallbackInfoReturnable cir) { BakedModel original = cir.getReturnValue(); if(original instanceof ItemOverrideBakedModel) { ItemOverrideBakedModel override = (ItemOverrideBakedModel)original; - cir.setReturnValue(override.getRealModel()); + BakedModel overrideModel = override.getRealModel(); + cir.setReturnValue(overrideModel != null ? overrideModel : bakedModel); } } }