Skip to content

Commit e36136d

Browse files
committed
Fix things and port to latest Sodium
1 parent 4c09f6e commit e36136d

File tree

10 files changed

+91
-27
lines changed

10 files changed

+91
-27
lines changed

build.gradle.kts

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ val NEOFORGE_VERSION by extra { "21.1.91" }
99
val FABRIC_LOADER_VERSION by extra { "0.16.10" }
1010
val FABRIC_API_VERSION by extra { "0.103.0+1.21.1" }
1111

12-
val SODIUM_DEPENDENCY_FABRIC by extra { files(rootDir.resolve("custom_sodium").resolve("sodium-fabric-0.6.7-snapshot+mc1.21.1-local.jar"))}
13-
val SODIUM_DEPENDENCY_NEO by extra { files(rootDir.resolve("custom_sodium").resolve("sodium-neoforge-0.6.7-snapshot+mc1.21.1-local.jar"))}
12+
val SODIUM_DEPENDENCY_FABRIC by extra { "maven.modrinth:sodium:26nVNc41"}
13+
val SODIUM_DEPENDENCY_NEO by extra { "maven.modrinth:sodium:I9RMZOOH"}
1414

1515
// This value can be set to null to disable Parchment.
1616
// TODO: Re-add Parchment
1717
val PARCHMENT_VERSION by extra { null }
1818

1919
// https://semver.org/
20-
val MOD_VERSION by extra { "1.8.5" }
20+
val MOD_VERSION by extra { "1.8.7" }
2121

2222
allprojects {
2323
apply(plugin = "java")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.irisshaders.iris.compat;
2+
3+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
4+
import org.spongepowered.asm.mixin.Unique;
5+
6+
import java.lang.invoke.MethodHandle;
7+
import java.lang.invoke.MethodHandles;
8+
import java.util.Map;
9+
10+
public class SkipList {
11+
public static Map<Class<?>, MethodHandle> shouldSkipList = new Object2ObjectOpenHashMap<>();
12+
13+
public static final MethodHandle NONE = MethodHandles.constant(Integer.class, 2);
14+
15+
public static final MethodHandle ALWAYS = MethodHandles.constant(Integer.class, 1);
16+
}

common/src/main/java/net/irisshaders/iris/mixin/MixinShaderInstance.java

+15-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.mojang.blaze3d.vertex.VertexFormat;
77
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
88
import net.irisshaders.iris.Iris;
9+
import net.irisshaders.iris.compat.SkipList;
910
import net.irisshaders.iris.gl.GLDebug;
1011
import net.irisshaders.iris.gl.blending.DepthColorStorage;
1112
import net.irisshaders.iris.mixinterface.ShaderInstanceInterface;
@@ -21,11 +22,13 @@
2122
import net.minecraft.server.packs.resources.ResourceProvider;
2223
import org.lwjgl.opengl.KHRDebug;
2324
import org.slf4j.Logger;
25+
import org.spongepowered.asm.mixin.Dynamic;
2426
import org.spongepowered.asm.mixin.Final;
2527
import org.spongepowered.asm.mixin.Mixin;
2628
import org.spongepowered.asm.mixin.Shadow;
2729
import org.spongepowered.asm.mixin.Unique;
2830
import org.spongepowered.asm.mixin.injection.At;
31+
import org.spongepowered.asm.mixin.injection.Group;
2932
import org.spongepowered.asm.mixin.injection.Inject;
3033
import org.spongepowered.asm.mixin.injection.Redirect;
3134
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -35,6 +38,9 @@
3538
import java.lang.invoke.MethodType;
3639
import java.util.Map;
3740

41+
import static net.irisshaders.iris.compat.SkipList.*;
42+
import static net.irisshaders.iris.compat.SkipList.shouldSkipList;
43+
3844
@Mixin(ShaderInstance.class)
3945
public abstract class MixinShaderInstance implements ShaderInstanceInterface {
4046
@Unique
@@ -51,24 +57,22 @@ public abstract class MixinShaderInstance implements ShaderInstanceInterface {
5157
@Final
5258
private Program fragmentProgram;
5359

54-
@Unique
55-
private static final MethodHandle NONE = MethodHandles.constant(Integer.class, 2);
56-
57-
@Unique
58-
private static final MethodHandle ALWAYS = MethodHandles.constant(Integer.class, 1);
59-
6060
@Unique
6161
private MethodHandle shouldSkip;
6262

63-
private static Map<Class<?>, MethodHandle> shouldSkipList = new Object2ObjectOpenHashMap<>();
64-
6563
static {
6664
shouldSkipList.put(ExtendedShader.class, NONE);
6765
shouldSkipList.put(FallbackShader.class, NONE);
6866
}
6967

70-
@Inject(method = "<init>(Lnet/minecraft/server/packs/resources/ResourceProvider;Lnet/minecraft/resources/ResourceLocation;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", at = @At("TAIL"), require = 0)
71-
private void iriss$storeSkip(ResourceProvider resourceProvider, ResourceLocation string, VertexFormat vertexFormat, CallbackInfo ci) {
68+
@Override
69+
public void setShouldSkip(MethodHandle s) {
70+
shouldSkip = s;
71+
}
72+
73+
74+
@Inject(method = "<init>(Lnet/minecraft/server/packs/resources/ResourceProvider;Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/ShaderInstance;CHUNK_OFFSET:Lcom/mojang/blaze3d/shaders/Uniform;"), require = 0)
75+
private void iris$storeSkipFabric(ResourceProvider resourceProvider, String string, VertexFormat vertexFormat, CallbackInfo ci) {
7276
shouldSkip = shouldSkipList.computeIfAbsent(getClass(), x -> {
7377
try {
7478
MethodHandle iris$skipDraw = MethodHandles.lookup().findVirtual(x, "iris$skipDraw", MethodType.methodType(boolean.class));
@@ -80,7 +84,7 @@ public abstract class MixinShaderInstance implements ShaderInstanceInterface {
8084
});
8185

8286

83-
if (Iris.getIrisConfig().shouldSkip(string)) {
87+
if (Iris.getIrisConfig().shouldSkip(ResourceLocation.tryParse(string))) {
8488
shouldSkip = ALWAYS;
8589
}
8690
}

common/src/main/java/net/irisshaders/iris/mixin/texture/pbr/MixinSpriteContents.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package net.irisshaders.iris.mixin.texture.pbr;
22

3-
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
3+
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
44
import net.irisshaders.iris.pbr.texture.PBRSpriteHolder;
55
import net.irisshaders.iris.pbr.texture.SpriteContentsExtension;
66
import net.minecraft.client.renderer.texture.SpriteContents;
@@ -33,10 +33,10 @@ public class MixinSpriteContents implements SpriteContentsExtension {
3333
TextureAtlasSprite normalSprite = pbrHolder.getNormalSprite();
3434
TextureAtlasSprite specularSprite = pbrHolder.getSpecularSprite();
3535
if (normalSprite != null) {
36-
SpriteUtil.markSpriteActive(normalSprite);
36+
SpriteUtil.INSTANCE.markSpriteActive(normalSprite);
3737
}
3838
if (specularSprite != null) {
39-
SpriteUtil.markSpriteActive(specularSprite);
39+
SpriteUtil.INSTANCE.markSpriteActive(specularSprite);
4040
}
4141
}
4242
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package net.irisshaders.iris.mixinterface;
22

3+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
34
import net.minecraft.server.packs.resources.ResourceProvider;
45

56
import java.io.IOException;
7+
import java.lang.invoke.MethodHandle;
8+
import java.util.Map;
69

710
public interface ShaderInstanceInterface {
811
void iris$createExtraShaders(ResourceProvider factory, String name) throws IOException;
12+
13+
void setShouldSkip(MethodHandle s);
914
}

common/src/main/java/net/irisshaders/iris/pipeline/programs/ExtendedShader.java

+6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.lwjgl.opengl.KHRDebug;
4141

4242
import java.io.IOException;
43+
import java.lang.invoke.MethodHandle;
4344
import java.util.List;
4445
import java.util.function.BiConsumer;
4546
import java.util.function.Consumer;
@@ -245,6 +246,11 @@ private void attachExtraShaders() {
245246
createTessEvalShader(factory, name);
246247
}
247248

249+
@Override
250+
public void setShouldSkip(MethodHandle s) {
251+
252+
}
253+
248254
private void createGeometryShader(ResourceProvider factory, String name) {
249255
createShader(factory, name, "_geometry.gsh", IrisProgramTypes.GEOMETRY,
250256
program -> this.geometry = program);

common/src/main/java/net/irisshaders/iris/pipeline/programs/SodiumShader.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import com.google.common.collect.ImmutableSet;
44
import com.mojang.blaze3d.platform.GlStateManager;
55
import com.mojang.blaze3d.systems.RenderSystem;
6+
import net.caffeinemc.mods.sodium.client.gl.device.GLRenderDevice;
67
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat2v;
78
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat3v;
89
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f;
910
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface;
1011
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ShaderBindingContext;
12+
import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.impl.CompactChunkVertex;
1113
import net.caffeinemc.mods.sodium.mixin.core.render.texture.TextureAtlasAccessor;
1214
import net.irisshaders.iris.gl.IrisRenderSystem;
1315
import net.irisshaders.iris.gl.blending.BlendModeOverride;
@@ -157,12 +159,15 @@ public void setupState() {
157159
// There is a limited amount of sub-texel precision when using hardware texture sampling. The mapped texture
158160
// area must be "shrunk" by at least one sub-texel to avoid bleed between textures in the atlas. And since we
159161
// offset texture coordinates in the vertex format by one texel, we also need to undo that here.
160-
double subTexelPrecision = (1 << SUB_TEXEL_PRECISION_BITS);
161-
double subTexelOffset = 1.0f / (1 << 15);
162-
this.uniformTexCoordShrink.set(
163-
(float) (subTexelOffset + ((1.0D / textureAtlas.getWidth()) / subTexelPrecision)),
164-
(float) (subTexelOffset + ((1.0D / textureAtlas.getHeight()) / subTexelPrecision))
165-
);
162+
double subTexelPrecision = (1 << GLRenderDevice.INSTANCE.getSubTexelPrecisionBits());
163+
double subTexelOffset = 1.0f / CompactChunkVertex.TEXTURE_MAX_VALUE;
164+
165+
if (this.uniformTexCoordShrink != null) {
166+
this.uniformTexCoordShrink.set(
167+
(float) (subTexelOffset - (((1.0D / textureAtlas.getWidth()) / subTexelPrecision))),
168+
(float) (subTexelOffset - (((1.0D / textureAtlas.getHeight()) / subTexelPrecision)))
169+
);
170+
}
166171

167172
if (containsTessellation) {
168173
ImmediateState.usingTessellation = true;

common/src/main/java/net/irisshaders/iris/pipeline/transform/transformer/SodiumTransformer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static void transform(
4040
tree.parseAndInjectNode(t, ASTInjectionPoint.BEFORE_DECLARATIONS, "uniform vec2 u_TexCoordShrink;");
4141

4242
root.replaceReferenceExpressions(t, "gl_MultiTexCoord0",
43-
"vec4(_vert_tex_diffuse_coord - (_vert_tex_diffuse_coord_bias * u_TexCoordShrink), 0.0, 1.0)");
43+
"vec4((_vert_tex_diffuse_coord_bias * u_TexCoordShrink) + _vert_tex_diffuse_coord, 0.0, 1.0)");
4444

4545
root.replaceReferenceExpressions(t, "gl_MultiTexCoord1",
4646
"vec4(_vert_tex_light_coord, 0.0, 1.0)");
@@ -171,8 +171,8 @@ vec2 _get_texcoord() {
171171
""",
172172
"""
173173
vec2 _get_texcoord_bias() {
174-
return mix(vec2(-1.0), vec2(1.0), bvec2(a_TexCoord >> TEXTURE_BITS));
175-
}
174+
return mix(vec2(-1.0), vec2(1.0), bvec2(a_TexCoord >> TEXTURE_BITS));
175+
}
176176
""",
177177
"float _material_mip_bias(uint material) {\n" +
178178
" return ((material >> MATERIAL_USE_MIP_OFFSET) & 1u) != 0u ? 0.0f : -4.0f;\n" +

common/src/main/java/net/irisshaders/iris/vertices/sodium/terrain/XHFPTerrainVertex.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private static int encodeTexture(float center, float x) {
7575
// This makes it possible to use much smaller epsilons for avoiding texture bleed, since the epsilon is no
7676
// longer encoded into the vertex data (instead, we only store the sign.)
7777
int bias = (x < center) ? 1 : -1;
78-
int quantized = floorInt(x * TEXTURE_MAX_VALUE) + bias;
78+
int quantized = Math.round(x * TEXTURE_MAX_VALUE) + bias;
7979

8080
return (quantized & 0x7FFF) | (sign(bias) << 15);
8181
}

neoforge/src/main/java/net/irisshaders/iris/mixin/forge/MixinShaderInstance.java

+28
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.irisshaders.iris.mixin.forge;
22

33
import com.mojang.blaze3d.vertex.VertexFormat;
4+
import net.irisshaders.iris.Iris;
5+
import net.irisshaders.iris.compat.SkipList;
46
import net.irisshaders.iris.mixinterface.ShaderInstanceInterface;
57
import net.minecraft.client.renderer.ShaderInstance;
68
import net.minecraft.resources.ResourceLocation;
@@ -11,6 +13,12 @@
1113
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1214

1315
import java.io.IOException;
16+
import java.lang.invoke.MethodHandle;
17+
import java.lang.invoke.MethodHandles;
18+
import java.lang.invoke.MethodType;
19+
20+
import static net.irisshaders.iris.compat.SkipList.ALWAYS;
21+
import static net.irisshaders.iris.compat.SkipList.shouldSkipList;
1422

1523
@Mixin(ShaderInstance.class)
1624
public abstract class MixinShaderInstance implements ShaderInstanceInterface {
@@ -22,4 +30,24 @@ public abstract class MixinShaderInstance implements ShaderInstanceInterface {
2230
throw new RuntimeException(e);
2331
}
2432
}
33+
34+
@Inject(method = "<init>(Lnet/minecraft/server/packs/resources/ResourceProvider;Lnet/minecraft/resources/ResourceLocation;Lcom/mojang/blaze3d/vertex/VertexFormat;)V", at = @At("TAIL"), require = 0)
35+
private void iriss$storeSkipNeo(ResourceProvider resourceProvider, ResourceLocation string, VertexFormat vertexFormat, CallbackInfo ci) {
36+
MethodHandle shouldSkip = shouldSkipList.computeIfAbsent(getClass(), x -> {
37+
try {
38+
MethodHandle iris$skipDraw = MethodHandles.lookup().findVirtual(x, "iris$skipDraw", MethodType.methodType(boolean.class));
39+
Iris.logger.warn("Class " + x.getName() + " has opted out of being rendered with shaders.");
40+
return iris$skipDraw;
41+
} catch (NoSuchMethodException | IllegalAccessException e) {
42+
return SkipList.NONE;
43+
}
44+
});
45+
46+
47+
if (Iris.getIrisConfig().shouldSkip(string)) {
48+
shouldSkip = ALWAYS;
49+
}
50+
51+
((ShaderInstanceInterface) this).setShouldSkip(shouldSkip);
52+
}
2553
}

0 commit comments

Comments
 (0)