Skip to content

Commit 512a7e2

Browse files
committed
Merge remote-tracking branch 'origin/1.20' into 1.21
2 parents 7db5d6a + 4946445 commit 512a7e2

File tree

7 files changed

+104
-106
lines changed

7 files changed

+104
-106
lines changed

common/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.embeddedt.modernfix.blockstate;
22

3+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
34
import net.minecraft.world.level.block.state.properties.Property;
45
import org.jetbrains.annotations.NotNull;
56
import org.jetbrains.annotations.Nullable;
@@ -14,6 +15,7 @@
1415
*/
1516
public class FakeStateMap<S> implements Map<Map<Property<?>, Comparable<?>>, S> {
1617
private final Map<Property<?>, Comparable<?>>[] keys;
18+
private Map<Map<Property<?>, Comparable<?>>, S> fastLookup;
1719
private final Object[] values;
1820
private int usedSlots;
1921
public FakeStateMap(int numStates) {
@@ -34,22 +36,39 @@ public boolean isEmpty() {
3436

3537
@Override
3638
public boolean containsKey(Object o) {
37-
throw new UnsupportedOperationException();
39+
return getFastLookup().containsKey(o);
3840
}
3941

4042
@Override
4143
public boolean containsValue(Object o) {
42-
throw new UnsupportedOperationException();
44+
return getFastLookup().containsValue(o);
45+
}
46+
47+
@SuppressWarnings("unchecked")
48+
private Map<Map<Property<?>, Comparable<?>>, S> getFastLookup() {
49+
if(fastLookup == null) {
50+
var map = new Object2ObjectOpenHashMap<Map<Property<?>, Comparable<?>>, S>(usedSlots);
51+
Map<Property<?>, Comparable<?>>[] keys = this.keys;
52+
Object[] values = this.values;
53+
for(int i = 0; i < usedSlots; i++) {
54+
map.put(keys[i], (S)values[i]);
55+
}
56+
fastLookup = map;
57+
}
58+
return fastLookup;
4359
}
4460

4561
@Override
4662
public S get(Object o) {
47-
throw new UnsupportedOperationException();
63+
return getFastLookup().get(o);
4864
}
4965

5066
@Nullable
5167
@Override
5268
public S put(Map<Property<?>, Comparable<?>> propertyComparableMap, S s) {
69+
if(fastLookup != null) {
70+
throw new IllegalStateException("Cannot populate map after fast lookup is built");
71+
}
5372
keys[usedSlots] = propertyComparableMap;
5473
values[usedSlots] = s;
5574
usedSlots++;
@@ -70,7 +89,7 @@ public void putAll(@NotNull Map<? extends Map<Property<?>, Comparable<?>>, ? ext
7089

7190
@Override
7291
public void clear() {
73-
for(int i = 0; i < this.keys.length; i++) {
92+
for(int i = 0; i < usedSlots; i++) {
7493
this.keys[i] = null;
7594
this.values[i] = null;
7695
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.embeddedt.modernfix.common.mixin.perf.chunk_meshing;
2+
3+
import net.minecraft.client.renderer.chunk.SectionCompiler;
4+
import net.minecraft.core.BlockPos;
5+
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
6+
import org.embeddedt.modernfix.util.blockpos.SectionBlockPosIterator;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Redirect;
10+
11+
@Mixin(value = SectionCompiler.class, priority = 2000)
12+
@ClientOnlyMixin
13+
public class RebuildTaskMixin {
14+
/**
15+
* @author embeddedt
16+
* @reason Use a much faster iterator implementation than vanilla's Guava-based one.
17+
*/
18+
@Redirect(method = "compile", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/BlockPos;betweenClosed(Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/BlockPos;)Ljava/lang/Iterable;"))
19+
private Iterable<BlockPos> fastBetweenClosed(BlockPos firstPos, BlockPos secondPos) {
20+
return () -> new SectionBlockPosIterator(firstPos);
21+
}
22+
}

common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/state_definition_construct/StateDefinitionMixin.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@
66
import net.minecraft.world.level.block.state.properties.Property;
77
import org.embeddedt.modernfix.annotation.RequiresMod;
88
import org.embeddedt.modernfix.blockstate.FakeStateMap;
9-
import org.embeddedt.modernfix.blockstate.FerriteCorePostProcess;
10-
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
119
import org.spongepowered.asm.mixin.Final;
1210
import org.spongepowered.asm.mixin.Mixin;
1311
import org.spongepowered.asm.mixin.Shadow;
1412
import org.spongepowered.asm.mixin.injection.At;
15-
import org.spongepowered.asm.mixin.injection.Inject;
1613
import org.spongepowered.asm.mixin.injection.ModifyVariable;
17-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1814

1915
import java.util.Map;
2016

17+
// This optimization requires FerriteCore to be worthwhile, otherwise the FakeStateMap degrades to hash internally
2118
@Mixin(StateDefinition.class)
2219
@RequiresMod("ferritecore")
2320
public class StateDefinitionMixin<O, S extends StateHolder<O, S>> {
2421
@Shadow @Final private ImmutableSortedMap<String, Property<?>> propertiesByName;
2522

23+
/**
24+
* @author embeddedt
25+
* @reason write states into a custom array map for fast iteration by FerriteCore, no need to waste time hashing
26+
* and growing
27+
*/
2628
@ModifyVariable(method = "<init>", at = @At(value = "STORE", ordinal = 0), ordinal = 1, index = 8)
2729
private Map<Map<Property<?>, Comparable<?>>, S> useArrayMap(Map<Map<Property<?>, Comparable<?>>, S> in) {
2830
int numStates = 1;
@@ -31,11 +33,4 @@ private Map<Map<Property<?>, Comparable<?>>, S> useArrayMap(Map<Map<Property<?>,
3133
}
3234
return new FakeStateMap<>(numStates);
3335
}
34-
35-
@Inject(method = "<init>", at = @At("TAIL"))
36-
private void postProcess(CallbackInfo ci) {
37-
// keep in dev only until upstream FC releases
38-
if(ModernFixPlatformHooks.INSTANCE.isDevEnv())
39-
FerriteCorePostProcess.postProcess((StateDefinition<O, S>)(Object)this);
40-
}
4136
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.embeddedt.modernfix.util.blockpos;
2+
3+
import net.minecraft.core.BlockPos;
4+
5+
import java.util.Iterator;
6+
import java.util.NoSuchElementException;
7+
8+
public class SectionBlockPosIterator implements Iterator<BlockPos> {
9+
private final BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
10+
private int index = 0;
11+
private final int baseX, baseY, baseZ;
12+
13+
public SectionBlockPosIterator(int baseX, int baseY, int baseZ) {
14+
this.baseX = baseX;
15+
this.baseY = baseY;
16+
this.baseZ = baseZ;
17+
}
18+
19+
public SectionBlockPosIterator(BlockPos pos) {
20+
this(pos.getX(), pos.getY(), pos.getZ());
21+
}
22+
23+
@Override
24+
public boolean hasNext() {
25+
return index < 4096;
26+
}
27+
28+
@Override
29+
public BlockPos next() {
30+
int i = index;
31+
if (i >= 4096) {
32+
throw new NoSuchElementException();
33+
}
34+
index = i + 1;
35+
var pos = this.pos;
36+
pos.set(this.baseX + (i & 15), this.baseY + ((i >> 8) & 15), this.baseZ + ((i >> 4) & 15));
37+
return pos;
38+
}
39+
}

fabric/src/test/java/org/embeddedt/modernfix/testing/util/BootstrapMinecraftExtension.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package org.embeddedt.modernfix.testing.util;
22

33
import net.minecraft.SharedConstants;
4+
import net.minecraft.core.MappedRegistry;
5+
import net.minecraft.core.registries.BuiltInRegistries;
46
import net.minecraft.server.Bootstrap;
57
import org.junit.jupiter.api.extension.AfterAllCallback;
68
import org.junit.jupiter.api.extension.BeforeAllCallback;
79
import org.junit.jupiter.api.extension.Extension;
810
import org.junit.jupiter.api.extension.ExtensionContext;
911

12+
import java.lang.reflect.Field;
13+
import java.util.IdentityHashMap;
14+
1015
/**
1116
* Simple extension to run vanilla bootstrap, inspired by AE2.
1217
*/
@@ -15,6 +20,15 @@ public class BootstrapMinecraftExtension implements Extension, BeforeAllCallback
1520
public void beforeAll(ExtensionContext context) throws Exception {
1621
SharedConstants.tryDetectVersion();
1722
Bootstrap.bootStrap();
23+
// Allow blocks to be created in tests
24+
Field field = MappedRegistry.class.getDeclaredField("unregisteredIntrusiveHolders");
25+
field.setAccessible(true);
26+
if(field.get(BuiltInRegistries.BLOCK) == null) {
27+
field.set(BuiltInRegistries.BLOCK, new IdentityHashMap<>());
28+
field = MappedRegistry.class.getDeclaredField("frozen");
29+
field.setAccessible(true);
30+
field.setBoolean(BuiltInRegistries.BLOCK, false);
31+
}
1832
}
1933

2034
@Override

neoforge/src/main/java/org/embeddedt/modernfix/neoforge/classloading/ModFileScanDataDeduplicator.java

Lines changed: 0 additions & 89 deletions
This file was deleted.

neoforge/src/main/java/org/embeddedt/modernfix/neoforge/init/ModernFixForge.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.embeddedt.modernfix.ModernFix;
2323
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
2424
import org.embeddedt.modernfix.neoforge.ModernFixConfig;
25-
import org.embeddedt.modernfix.neoforge.classloading.ModFileScanDataDeduplicator;
2625

2726
import java.util.List;
2827

@@ -41,7 +40,6 @@ public ModernFixForge(ModContainer modContainer, IEventBus modBus) {
4140
NeoForge.EVENT_BUS.register(new ModernFixClientForge(modContainer, modBus));
4241
}
4342
modContainer.registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG);
44-
ModFileScanDataDeduplicator.deduplicate();
4543
}
4644

4745
private void registerItems(RegisterEvent event) {

0 commit comments

Comments
 (0)