Skip to content

Commit

Permalink
New Sodium + experimenting with dynamic vertex format
Browse files Browse the repository at this point in the history
  • Loading branch information
IMS212 committed Sep 3, 2024
1 parent 605a77a commit f60a6e3
Show file tree
Hide file tree
Showing 27 changed files with 256 additions and 87 deletions.
6 changes: 5 additions & 1 deletion common/src/main/java/net/irisshaders/iris/Iris.java
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,11 @@ public static boolean loadedIncompatiblePack() {
return DHCompat.lastPackIncompatible();
}

/**
public static boolean isPackInUseQuick() {
return getPipelineManager().getPipelineNullable() instanceof IrisRenderingPipeline;
}

/**
* Called very early on in Minecraft initialization. At this point we *cannot* safely access OpenGL, but we can do
* some very basic setup, config loading, and environment checks.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ public static boolean checkFrame() {
if (DhApi.Delayed.configs == null) return dhEnabled;

if ((dhEnabled != DhApi.Delayed.configs.graphics().renderingEnabled().getValue() || guiScale != Minecraft.getInstance().options.guiScale().get())
&& IrisApi.getInstance().isShaderPackInUse()) {
&& Iris.isPackInUseQuick()) {
guiScale = Minecraft.getInstance().options.guiScale().get();
dhEnabled = DhApi.Delayed.configs.graphics().renderingEnabled().getValue();
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.seibel.distanthorizons.api.objects.math.DhApiVec3i;
import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox;
import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.gl.IrisRenderSystem;
import net.irisshaders.iris.gl.blending.BlendModeOverride;
Expand Down Expand Up @@ -269,7 +270,7 @@ public void bindVertexBuffer(int i) {

@Override
public boolean overrideThisFrame() {
return IrisApi.getInstance().isShaderPackInUse();
return Iris.isPackInUseQuick();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ private static void setupSetDeferredBeforeRenderingEvent() {
@Override
public void beforeRender(DhApiCancelableEventParam<DhApiRenderParam> event) {

DhApi.Delayed.renderProxy.setDeferTransparentRendering(IrisApi.getInstance().isShaderPackInUse() && getInstance().shouldOverride);
DhApi.Delayed.renderProxy.setDeferTransparentRendering(Iris.isPackInUseQuick() && getInstance().shouldOverride);
DhApi.Delayed.configs.graphics().fog().drawMode().setValue(getInstance().shouldOverride ? EDhApiFogDrawMode.FOG_DISABLED : EDhApiFogDrawMode.FOG_ENABLED);
}
};
Expand Down Expand Up @@ -365,7 +365,7 @@ private static void setupBeforeApplyShaderEvent() {
DhApiBeforeApplyShaderRenderEvent beforeApplyShaderEvent = new DhApiBeforeApplyShaderRenderEvent() {
@Override
public void beforeRender(DhApiCancelableEventParam<DhApiRenderParam> event) {
if (IrisApi.getInstance().isShaderPackInUse()) {
if (Iris.isPackInUseQuick()) {
DHCompatInternal instance = getInstance();

OverrideInjector.INSTANCE.unbind(IDhApiShadowCullingFrustum.class, (IDhApiOverrideable) ShadowRenderer.FRUSTUM);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ public class MixinRenderRegionArenas {
target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkMeshFormats;COMPACT:Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexType;",
remap = false))
private ChunkVertexType iris$useExtendedStride() {
return WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat() ? IrisModelVertexFormats.MODEL_VERTEX_XHFP : ChunkMeshFormats.COMPACT;
return WorldRenderingSettings.INSTANCE.getVertexFormat();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ public class MixinRenderSectionManager {
at = @At(value = "INVOKE",
target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer;<init>(Lnet/caffeinemc/mods/sodium/client/gl/device/RenderDevice;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexType;)V"))
private ChunkVertexType iris$useExtendedVertexFormat$1(ChunkVertexType vertexType) {
return WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat() ? IrisModelVertexFormats.MODEL_VERTEX_XHFP : vertexType;
return WorldRenderingSettings.INSTANCE.getVertexFormat();
}

@ModifyArg(method = "<init>",
at = @At(value = "INVOKE",
target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder;<init>(Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexType;)V"))
private ChunkVertexType iris$useExtendedVertexFormat$2(ChunkVertexType vertexType) {
return WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat() ? IrisModelVertexFormats.MODEL_VERTEX_XHFP : vertexType;
return WorldRenderingSettings.INSTANCE.getVertexFormat();
}

@Redirect(method = "getSearchDistance", remap = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ private static void override(ShaderKey key, CallbackInfoReturnable<ShaderInstanc

@Redirect(method = "renderItemInHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;renderHandsWithItems(FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/player/LocalPlayer;I)V"))
private void iris$disableVanillaHandRendering(ItemInHandRenderer itemInHandRenderer, float tickDelta, PoseStack poseStack, BufferSource bufferSource, LocalPlayer localPlayer, int light) {
if (IrisApi.getInstance().isShaderPackInUse()) {
if (Iris.isPackInUseQuick()) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.irisshaders.iris.mixin;

import com.mojang.blaze3d.vertex.PoseStack;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.pathways.HandRenderer;
import net.minecraft.client.player.AbstractClientPlayer;
Expand All @@ -17,7 +18,7 @@
public class MixinItemInHandRenderer {
@Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true)
private void iris$skipTranslucentHands(AbstractClientPlayer abstractClientPlayer, float f, float g, InteractionHand interactionHand, float h, ItemStack itemStack, float i, PoseStack poseStack, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) {
if (IrisApi.getInstance().isShaderPackInUse()) {
if (Iris.isPackInUseQuick()) {
if (HandRenderer.INSTANCE.isRenderingSolid() && HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) {
ci.cancel();
} else if (!HandRenderer.INSTANCE.isRenderingSolid() && !HandRenderer.INSTANCE.isHandTranslucent(interactionHand)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.irisshaders.iris.mixin;

import com.mojang.blaze3d.vertex.PoseStack;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
Expand Down Expand Up @@ -54,7 +55,7 @@ public abstract class MixinModelViewBobbing {

@Inject(method = "renderLevel", at = @At("HEAD"))
private void iris$saveShadersOn(DeltaTracker deltaTracker, CallbackInfo ci) {
areShadersOn = IrisApi.getInstance().isShaderPackInUse();
areShadersOn = Iris.isPackInUseQuick();
}

@ModifyArg(method = "renderLevel", index = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.blaze3d.vertex.VertexFormatElement;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.shaderpack.materialmap.WorldRenderingSettings;
import net.irisshaders.iris.uniforms.CapturedRenderingState;
import net.irisshaders.iris.vertices.BlockSensitiveBufferBuilder;
Expand Down Expand Up @@ -95,7 +97,7 @@ public abstract class MixinBufferBuilder implements VertexConsumer, BlockSensiti
boolean iris$isTerrain = false;
injectNormalAndUV1 = false;

if (ImmediateState.skipExtension.get() || !WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat()) {
if (ImmediateState.skipExtension.get() || !Iris.isPackInUseQuick()) {
return format;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.shaderpack.materialmap.WorldRenderingSettings;
import net.irisshaders.iris.vertices.ImmediateState;
import net.irisshaders.iris.vertices.IrisVertexFormats;
Expand All @@ -17,7 +19,7 @@
public class MixinVertexFormat {
@Inject(method = "setupBufferState", at = @At("HEAD"), cancellable = true)
private void iris$onSetupBufferState(CallbackInfo ci) {
if (WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat() && ImmediateState.renderWithExtendedVertexFormat) {
if (Iris.isPackInUseQuick() && ImmediateState.renderWithExtendedVertexFormat) {
if ((Object) this == DefaultVertexFormat.BLOCK) {
IrisVertexFormats.TERRAIN.setupBufferState();

Expand All @@ -36,7 +38,7 @@ public class MixinVertexFormat {

@Inject(method = "clearBufferState", at = @At("HEAD"), cancellable = true)
private void iris$onClearBufferState(CallbackInfo ci) {
if (WorldRenderingSettings.INSTANCE.shouldUseExtendedVertexFormat() && ImmediateState.renderWithExtendedVertexFormat) {
if (Iris.isPackInUseQuick() && ImmediateState.renderWithExtendedVertexFormat) {
if ((Object) this == DefaultVertexFormat.BLOCK) {
IrisVertexFormats.TERRAIN.clearBufferState();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import net.irisshaders.batchedentityrendering.impl.FullyBufferedMultiBufferSource;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.mixin.GameRendererAccessor;
import net.irisshaders.iris.pipeline.WorldRenderingPhase;
Expand Down Expand Up @@ -74,7 +75,7 @@ public boolean isAnyHandTranslucent() {
}

public void renderSolid(Matrix4fc modelMatrix, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) {
if (!canRender(camera, gameRenderer) || !IrisApi.getInstance().isShaderPackInUse()) {
if (!canRender(camera, gameRenderer) || !Iris.isPackInUseQuick()) {
return;
}

Expand Down Expand Up @@ -115,7 +116,7 @@ public void renderSolid(Matrix4fc modelMatrix, float tickDelta, Camera camera, G
}

public void renderTranslucent(Matrix4fc modelMatrix, float tickDelta, Camera camera, GameRenderer gameRenderer, WorldRenderingPipeline pipeline) {
if (!canRender(camera, gameRenderer) || !isAnyHandTranslucent() || !IrisApi.getInstance().isShaderPackInUse()) {
if (!canRender(camera, gameRenderer) || !isAnyHandTranslucent() || !Iris.isPackInUseQuick()) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,6 @@ public IrisRenderingPipeline(ProgramSet programSet) {
WorldRenderingSettings.INSTANCE.setUseSeparateAo(programSet.getPackDirectives().shouldUseSeparateAo());
WorldRenderingSettings.INSTANCE.setVoxelizeLightBlocks(programSet.getPackDirectives().shouldVoxelizeLightBlocks());
WorldRenderingSettings.INSTANCE.setSeparateEntityDraws(programSet.getPackDirectives().shouldUseSeparateEntityDraws());
WorldRenderingSettings.INSTANCE.setUseExtendedVertexFormat(true);

if (shadowRenderTargets != null) {
ShaderInstance shader = shaderMap.getShader(ShaderKey.SHADOW_TERRAIN_CUTOUT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mojang.blaze3d.platform.GlStateManager;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkMeshFormats;
import net.irisshaders.iris.compat.dh.DHCompat;
import net.irisshaders.iris.features.FeatureFlags;
import net.irisshaders.iris.gl.texture.TextureType;
Expand All @@ -26,7 +27,7 @@ public VanillaRenderingPipeline() {
WorldRenderingSettings.INSTANCE.setUseSeparateAo(false);
WorldRenderingSettings.INSTANCE.setSeparateEntityDraws(false);
WorldRenderingSettings.INSTANCE.setAmbientOcclusionLevel(1.0f);
WorldRenderingSettings.INSTANCE.setUseExtendedVertexFormat(false);
WorldRenderingSettings.INSTANCE.setVertexFormat(ChunkMeshFormats.COMPACT);
WorldRenderingSettings.INSTANCE.setVoxelizeLightBlocks(false);
WorldRenderingSettings.INSTANCE.setBlockTypeIds(Object2ObjectMaps.emptyMap());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,21 @@
import net.irisshaders.iris.pipeline.transform.ShaderPrinter;
import net.irisshaders.iris.pipeline.transform.TransformPatcher;
import net.irisshaders.iris.shaderpack.loading.ProgramId;
import net.irisshaders.iris.shaderpack.materialmap.WorldRenderingSettings;
import net.irisshaders.iris.shaderpack.programs.ProgramFallbackResolver;
import net.irisshaders.iris.shaderpack.programs.ProgramSet;
import net.irisshaders.iris.shaderpack.programs.ProgramSource;
import net.irisshaders.iris.shadows.ShadowRenderTargets;
import net.irisshaders.iris.shadows.ShadowRenderingState;
import net.irisshaders.iris.targets.RenderTargets;
import net.irisshaders.iris.uniforms.custom.CustomUniforms;
import net.irisshaders.iris.vertices.sodium.terrain.FormatAnalyzer;
import net.irisshaders.iris.vertices.sodium.terrain.IrisModelVertexFormats;
import net.minecraft.resources.ResourceLocation;
import org.lwjgl.opengl.GL43C;
import org.lwjgl.system.MemoryStack;

import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
Expand All @@ -42,6 +46,12 @@ public class SodiumPrograms {
private final EnumMap<Pass, GlFramebuffer> framebuffers = new EnumMap<>(Pass.class);
private final EnumMap<Pass, GlProgram<ChunkShaderInterface>> shaders = new EnumMap<>(Pass.class);

private boolean hasBlockId;
private boolean hasMidUv;
private boolean hasNormal;
private boolean hasTangent;
private boolean hasMidBlock;

public SodiumPrograms(IrisRenderingPipeline pipeline, ProgramSet programSet, ProgramFallbackResolver resolver,
RenderTargets renderTargets, Supplier<ShadowRenderTargets> shadowRenderTargets,
CustomUniforms customUniforms) {
Expand All @@ -60,6 +70,8 @@ public SodiumPrograms(IrisRenderingPipeline pipeline, ProgramSet programSet, Pro
GlProgram<ChunkShaderInterface> shader = createShader(pipeline, pass, source, alphaTest, customUniforms, flipState, createGlShaders(pass.name().toLowerCase(Locale.ROOT), transformed));
shaders.put(pass, shader);
}

WorldRenderingSettings.INSTANCE.setVertexFormat(FormatAnalyzer.createFormat(hasBlockId, hasNormal, hasMidUv, hasTangent, hasMidBlock));
}

private AlphaTest getAlphaTest(Pass pass, ProgramSource source) {
Expand All @@ -75,7 +87,7 @@ private Map<PatchShaderType, String> transformShaders(ProgramSource source, Alph
source.getTessControlSource().orElse(null),
source.getTessEvalSource().orElse(null),
source.getFragmentSource().orElse(null),
alphaTest, IrisModelVertexFormats.MODEL_VERTEX_XHFP,
alphaTest,
programSet.getPackDirectives().getTextureMap());

ShaderPrinter.printProgram("sodium_" + source.getName()).addSources(transformed).print();
Expand Down Expand Up @@ -160,6 +172,13 @@ private GlProgram<ChunkShaderInterface> buildProgram(GlProgram.Builder builder,
.link((shader) -> {
int handle = ((GlObject) shader).handle();
GLDebug.nameObject(GL43C.GL_PROGRAM, handle, "sodium-terrain-" + pass.toString().toLowerCase(Locale.ROOT));

if (!hasNormal) hasNormal = GL43C.glGetAttribLocation(handle, "iris_Normal") != -1;
if (!hasMidBlock) hasMidBlock = GL43C.glGetAttribLocation(handle, "at_midBlock") != -1;
if (!hasBlockId) hasBlockId = GL43C.glGetAttribLocation(handle, "mc_Entity") != -1;
if (!hasMidUv) hasMidUv = GL43C.glGetAttribLocation(handle, "mc_midTexCoord") != -1;
if (!hasTangent) hasTangent = GL43C.glGetAttribLocation(handle, "at_tangent") != -1;

return new SodiumShader(pipeline, pass, shader, handle, source.getDirectives().getBlendModeOverride(),
createBufferBlendOverrides(source), customUniforms, flipState,
alphaTest.reference(), containsTessellation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,10 +332,10 @@ public TextureStage getTextureStage() {
}

public static Map<PatchShaderType, String> patchSodium(String name, String vertex, String geometry, String tessControl, String tessEval, String fragment,
AlphaTest alpha, ChunkVertexType vertexType,
AlphaTest alpha,
Object2ObjectMap<Tri<String, TextureType, TextureStage>, String> textureMap) {
return transform(name, vertex, geometry, tessControl, tessEval, fragment,
new SodiumParameters(Patch.SODIUM, textureMap, alpha, vertexType));
new SodiumParameters(Patch.SODIUM, textureMap, alpha));
}

public static Map<PatchShaderType, String> patchComposite(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import net.irisshaders.iris.shaderpack.texture.TextureStage;

public class SodiumParameters extends Parameters {
public final ChunkVertexType vertexType;
// WARNING: adding new fields requires updating hashCode and equals methods!

// DO NOT include this field in hashCode or equals, it's mutable!
Expand All @@ -18,9 +17,8 @@ public class SodiumParameters extends Parameters {

public SodiumParameters(Patch patch,
Object2ObjectMap<Tri<String, TextureType, TextureStage>, String> textureMap,
AlphaTest alpha, ChunkVertexType vertexType) {
AlphaTest alpha) {
super(patch, textureMap);
this.vertexType = vertexType;

this.alpha = alpha;
}
Expand All @@ -35,15 +33,11 @@ public TextureStage getTextureStage() {
return TextureStage.GBUFFERS_AND_SHADOW;
}

public ChunkVertexType getVertexType() {
return vertexType;
}

@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((vertexType == null) ? 0 : vertexType.hashCode());
result = prime * result + ((alpha == null) ? 0 : alpha.hashCode());
return result;
}
Expand All @@ -57,11 +51,6 @@ public boolean equals(Object obj) {
if (getClass() != obj.getClass())
return false;
SodiumParameters other = (SodiumParameters) obj;
if (vertexType == null) {
if (other.vertexType != null)
return false;
} else if (!vertexType.equals(other.vertexType))
return false;
if (alpha == null) {
return other.alpha == null;

This comment has been minimized.

Copy link
@douira

douira Sep 5, 2024

Member

it seems wrong that there's a comment stating alpha shouldn't be part of equals and hashCode but then it is

} else return alpha.equals(other.alpha);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public static void transform(

root.rename("gl_Color", "_vert_color");

if (parameters.type.glShaderType == ShaderType.VERTEX) {
if (parameters.type.glShaderType == ShaderType.VERTEX && root.identifierIndex.has("gl_Normal")) {
root.rename("gl_Normal", "iris_Normal");
tree.parseAndInjectNode(t, ASTInjectionPoint.BEFORE_DECLARATIONS, "in vec3 iris_Normal;");
}
Expand Down
Loading

0 comments on commit f60a6e3

Please sign in to comment.