From 74c2c28a66bf55f378b51b522e3eca037079cbdb Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:17:46 -0400 Subject: [PATCH 1/9] Avoid hard crash if AT fails to apply --- .../src/main/java/org/embeddedt/modernfix/ModernFix.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFix.java b/common/src/main/java/org/embeddedt/modernfix/ModernFix.java index 6f10dc9a..18f99171 100644 --- a/common/src/main/java/org/embeddedt/modernfix/ModernFix.java +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFix.java @@ -31,7 +31,12 @@ public class ModernFix { static { if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.dedicated_reload_executor.ReloadExecutor")) { - resourceReloadService = Util.makeExecutor("ResourceReload"); + try { + resourceReloadService = Util.makeExecutor("ResourceReload"); + } catch(Throwable e) { + LOGGER.error("Error creating resource reload service, using fallback", e); + resourceReloadService = Util.backgroundExecutor(); + } } else { resourceReloadService = Util.backgroundExecutor(); } From 48f9ad86f082d71624aa630d49d69b7a0faa9f4e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:20:54 -0400 Subject: [PATCH 2/9] Prevent immediate crash when TextureAtlasSprite constructor throws Fixes #79 --- .../modernfix/platform/forge/ModernFixPlatformHooksImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index d2c84cf8..f8eb19e6 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -118,7 +118,10 @@ public class ModernFixPlatformHooksImpl { try { return (TextureAtlasSprite)textureAtlasSpriteConstruct.invokeExact(atlasTexture, textureInfo, mipmapLevel, atlasWidth, atlasHeight, spriteX, spriteY, image); } catch(Throwable e) { - throw new AssertionError("MethodHandle failed", e); + if(e instanceof RuntimeException) + throw (RuntimeException)e; + else + throw new RuntimeException("TextureAtlasSprite construction failed", e); } } } From 8beadf828c273317d7cde52c9520fda5f782db6e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:22:27 -0400 Subject: [PATCH 3/9] Add dev builds to README [skip ci] --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index e1543d82..5408ed37 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,13 @@ A performance mod for modern Minecraft that significantly improves launch times, Some fixes are based on prior work in various Forge PRs (check commit history and/or code comments). The config system is directly derived from Sodium and used under the terms of the LGPL-3.0 license. +## Development builds (generally stable, but may occasionally have bugs) + +1.16.5, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/main/Package.zip +1.18.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.18/Package.zip +1.19.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.2/Package.zip +1.19.4, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.4/Package.zip + ------------ ![YourKit logo](https://www.yourkit.com/images/yklogo.png) From 218c3e84d39d11386c5af16456f561e1a0262527 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:22:50 -0400 Subject: [PATCH 4/9] Fix GitHub markdown formatting being different [skip ci] --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5408ed37..f98eb2cf 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ is directly derived from Sodium and used under the terms of the LGPL-3.0 license ## Development builds (generally stable, but may occasionally have bugs)  -1.16.5, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/main/Package.zip -1.18.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.18/Package.zip -1.19.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.2/Package.zip -1.19.4, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.4/Package.zip +- 1.16.5, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/main/Package.zip +- 1.18.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.18/Package.zip +- 1.19.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.2/Package.zip +- 1.19.4, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.4/Package.zip ------------ From f506fc671a5c4a80da932516bfd663bee975f430 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:23:10 -0400 Subject: [PATCH 5/9] Remove blank space [skip ci] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f98eb2cf..6eee1d0d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ Some fixes are based on prior work in various Forge PRs (check commit history an is directly derived from Sodium and used under the terms of the LGPL-3.0 license. ## Development builds (generally stable, but may occasionally have bugs) - - 1.16.5, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/main/Package.zip - 1.18.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.18/Package.zip - 1.19.2, both modloaders: https://nightly.link/embeddedt/ModernFix/workflows/gradle/1.19.2/Package.zip From d4fec79e5535be4eebb7b3eda5bfb4a960409ae1 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 11:43:11 -0400 Subject: [PATCH 6/9] Change texture loading mixin priority to prevent FAPI conflicts --- .../mixin/perf/faster_texture_loading/TextureAtlasMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java index 7de5e189..0c9e7199 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java @@ -25,7 +25,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -@Mixin(TextureAtlas.class) +@Mixin(value = TextureAtlas.class, priority = 1500) @ClientOnlyMixin public abstract class TextureAtlasMixin { @Shadow protected abstract ResourceLocation getResourceLocation(ResourceLocation location); From 2e669761bd69bfbe35458ea9720ba6206bdf8397 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 12:57:15 -0400 Subject: [PATCH 7/9] Remove unnecessary injected field on BlockState --- .../reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java index 5daa0af2..576159a3 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java @@ -20,7 +20,6 @@ public abstract class BlockStateBaseMixin implements IBlockState { private volatile boolean cacheInvalid = false; private static boolean buildingCache = false; - private static final ThreadLocal isMakingCache = ThreadLocal.withInitial(() -> false); @Override public void clearCache() { cacheInvalid = true; From deac0b43d1bdce9607aedb1e73894ef63ecafb01 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 15:20:40 -0400 Subject: [PATCH 8/9] Optimize rendering of simple items in GUIs --- .../ItemRendererMixin.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java new file mode 100644 index 00000000..630cef82 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java @@ -0,0 +1,80 @@ +package org.embeddedt.modernfix.common.mixin.perf.faster_item_rendering; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.SimpleBakedModel; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.List; +import java.util.Random; + +@Mixin(ItemRenderer.class) +public abstract class ItemRendererMixin { + @Shadow @Final private ItemColors itemColors; + + private final Random dummyRandom = new Random(); + + private static final float[] COLOR_MULTIPLIER = new float[]{1.0F, 1.0F, 1.0F, 1.0F}; + + private ItemTransforms.TransformType transformType; + + @Inject(method = "render", at = @At("HEAD")) + private void markRenderingType(ItemStack itemStack, ItemTransforms.TransformType transformType, boolean leftHand, PoseStack matrixStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model, CallbackInfo ci) { + this.transformType = transformType; + } + + /** + * If a model + * - is a vanilla item model (SimpleBakedModel), + * - has no custom GUI transforms, and + * - is being rendered in 2D on a GUI + * we do not need to go through the process of rendering every quad. Just render the south ones (the ones facing the + * camera). + */ + @Inject(method = "renderModelLists", at = @At("HEAD"), cancellable = true) + private void fasterItemRender(BakedModel model, ItemStack stack, int combinedLight, int combinedOverlay, PoseStack matrixStack, VertexConsumer buffer, CallbackInfo ci) { + if(!stack.isEmpty() && model.getClass() == SimpleBakedModel.class && transformType == ItemTransforms.TransformType.GUI && model.getTransforms().gui == ItemTransform.NO_TRANSFORM) { + ci.cancel(); + PoseStack.Pose pose = matrixStack.last(); + int[] combinedLights = new int[] {combinedLight, combinedLight, combinedLight, combinedLight}; + List culledFaces = model.getQuads(null, Direction.SOUTH, dummyRandom); + List unculledFaces = model.getQuads(null, null, dummyRandom); + /* check size to avoid instantiating iterator when the list is empty */ + if(culledFaces.size() > 0) { + for(BakedQuad quad : culledFaces) { + render2dItemFace(quad, stack, buffer, pose, combinedLights, combinedOverlay); + } + } + for(BakedQuad quad : unculledFaces) { + if(quad.getDirection() == Direction.SOUTH) + render2dItemFace(quad, stack, buffer, pose, combinedLights, combinedOverlay); + } + } + } + + private void render2dItemFace(BakedQuad quad, ItemStack stack, VertexConsumer buffer, PoseStack.Pose pose, int[] combinedLights, int combinedOverlay) { + int i = -1; + if (quad.isTinted()) { + i = this.itemColors.getColor(stack, quad.getTintIndex()); + } + + float f = (float)(i >> 16 & 255) / 255.0F; + float f1 = (float)(i >> 8 & 255) / 255.0F; + float f2 = (float)(i & 255) / 255.0F; + buffer.putBulkData(pose, quad, COLOR_MULTIPLIER, f, f1, f2, combinedLights, combinedOverlay, true); + } +} From e84360efe921c9f4ae9c4a8a88c7953221d09b49 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 6 May 2023 15:33:25 -0400 Subject: [PATCH 9/9] Update item rendering patch for 1.19.2 --- .../mixin/perf/faster_item_rendering/ItemRendererMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java index 630cef82..179a83e7 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_item_rendering/ItemRendererMixin.java @@ -11,6 +11,7 @@ import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.SimpleBakedModel; import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -20,13 +21,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; -import java.util.Random; @Mixin(ItemRenderer.class) public abstract class ItemRendererMixin { @Shadow @Final private ItemColors itemColors; - private final Random dummyRandom = new Random(); + private final RandomSource dummyRandom = RandomSource.createNewThreadLocalInstance(); private static final float[] COLOR_MULTIPLIER = new float[]{1.0F, 1.0F, 1.0F, 1.0F};