Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create a ConfigureMainRenderTargetEvent for enabling stenciling, simplified(?) #1830

Draft
wants to merge 18 commits into
base: 1.21.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions patches/com/mojang/blaze3d/framegraph/FrameGraphBuilder.java.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--- a/com/mojang/blaze3d/framegraph/FrameGraphBuilder.java
+++ b/com/mojang/blaze3d/framegraph/FrameGraphBuilder.java
@@ -211,6 +_,11 @@
public String toString() {
return this.createdBy != null ? this.holder + "#" + this.version + " (from " + this.createdBy + ")" : this.holder + "#" + this.version;
}
+
+ @Nullable
+ public ResourceDescriptor<T> getDescriptor() {
+ return this.holder.getDescriptor();
+ }
}

@OnlyIn(Dist.CLIENT)
@@ -265,6 +_,11 @@
this.physicalResource = null;
}
}
+
+ @Override
+ public ResourceDescriptor<T> getDescriptor() {
+ return descriptor;
+ }
}

@OnlyIn(Dist.CLIENT)
@@ -363,6 +_,11 @@
@Override
public String toString() {
return this.name;
+ }
+
+ @Nullable
+ public ResourceDescriptor<T> getDescriptor() {
+ return null;
}
}
}
51 changes: 51 additions & 0 deletions patches/com/mojang/blaze3d/pipeline/MainTarget.java.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
--- a/com/mojang/blaze3d/pipeline/MainTarget.java
+++ b/com/mojang/blaze3d/pipeline/MainTarget.java
@@ -16,8 +_,12 @@
static final MainTarget.Dimension DEFAULT_DIMENSIONS = new MainTarget.Dimension(854, 480);

public MainTarget(int p_166137_, int p_166138_) {
- super(true);
- this.createFrameBuffer(p_166137_, p_166138_);
+ this(net.neoforged.neoforge.client.ClientHooks.configureMainRenderTarget(true, p_166137_, p_166138_));
+ }
+
+ private MainTarget(net.neoforged.neoforge.client.event.ConfigureMainRenderTargetEvent e) {
+ super(e.useDepth(), e.useStencil());
+ this.createFrameBuffer(e.width(), e.height());
}

private void createFrameBuffer(int p_166142_, int p_166143_) {
@@ -37,6 +_,9 @@
GlStateManager._texParameter(3553, 10242, 33071);
GlStateManager._texParameter(3553, 10243, 33071);
GlStateManager._glFramebufferTexture2D(36160, 36096, 3553, this.depthBufferId, 0);
+ if (this.useStencil) {
+ GlStateManager._glFramebufferTexture2D(36160, org.lwjgl.opengl.GL32.GL_STENCIL_ATTACHMENT, 3553, this.depthBufferId, 0);
+ }
GlStateManager._bindTexture(0);
this.viewWidth = maintarget$dimension.width;
this.viewHeight = maintarget$dimension.height;
@@ -58,8 +_,8 @@
maintarget$attachmentstate = maintarget$attachmentstate.with(MainTarget.AttachmentState.COLOR);
}

- if (this.allocateDepthAttachment(maintarget$dimension)) {
- maintarget$attachmentstate = maintarget$attachmentstate.with(MainTarget.AttachmentState.DEPTH);
+ if (this.useStencil && this.allocateDepthAttachment(maintarget$dimension)) {
+ maintarget$attachmentstate = maintarget$attachmentstate.with(AttachmentState.DEPTH);
}

if (maintarget$attachmentstate == MainTarget.AttachmentState.COLOR_DEPTH) {
@@ -82,7 +_,11 @@
RenderSystem.assertOnRenderThreadOrInit();
GlStateManager._getError();
GlStateManager._bindTexture(this.depthBufferId);
- GlStateManager._texImage2D(3553, 0, 6402, p_166145_.width, p_166145_.height, 0, 6402, 5126, null);
+ if (this.useStencil) {
+ GlStateManager._texImage2D(3553, 0, 6402, p_166145_.width, p_166145_.height, 0, org.lwjgl.opengl.GL32.GL_DEPTH_STENCIL, org.lwjgl.opengl.GL32.GL_UNSIGNED_INT_24_8, null);
+ } else {
+ GlStateManager._texImage2D(3553, 0, 6402, p_166145_.width, p_166145_.height, 0, 6402, 5126, null);
+ }
return GlStateManager._getError() != 1285;
}

75 changes: 75 additions & 0 deletions patches/com/mojang/blaze3d/pipeline/RenderTarget.java.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
--- a/com/mojang/blaze3d/pipeline/RenderTarget.java
+++ b/com/mojang/blaze3d/pipeline/RenderTarget.java
@@ -25,6 +_,7 @@
public int viewWidth;
public int viewHeight;
public final boolean useDepth;
+ public final boolean useStencil;
public int frameBufferId;
protected int colorTextureId;
protected int depthBufferId;
@@ -32,7 +_,15 @@
public int filterMode;

public RenderTarget(boolean p_166199_) {
- this.useDepth = p_166199_;
+ this(p_166199_, false);
+ }
+
+ public RenderTarget(boolean useDepth, boolean useStencil) {
+ if (useStencil && !useDepth) {
+ throw new IllegalArgumentException("Stencil can only be enabled if depth is enabled.");
+ }
+ this.useDepth = useDepth;
+ this.useStencil = useStencil;
this.frameBufferId = -1;
this.colorTextureId = -1;
this.depthBufferId = -1;
@@ -96,7 +_,20 @@
GlStateManager._texParameter(3553, 34892, 0);
GlStateManager._texParameter(3553, 10242, 33071);
GlStateManager._texParameter(3553, 10243, 33071);
- GlStateManager._texImage2D(3553, 0, 6402, this.width, this.height, 0, 6402, 5126, null);
+ if (!this.useStencil) {
+ GlStateManager._texImage2D(3553, 0, 6402, this.width, this.height, 0, 6402, 5126, null);
+ } else {
+ // Use a combined format for both depth and stencil.
+ GlStateManager._texImage2D(
+ org.lwjgl.opengl.GL32.GL_TEXTURE_2D,
+ 0,
+ org.lwjgl.opengl.GL32.GL_DEPTH24_STENCIL8,
+ this.width, this.height,
+ 0,
+ org.lwjgl.opengl.GL32.GL_DEPTH_STENCIL,
+ org.lwjgl.opengl.GL32.GL_UNSIGNED_INT_24_8,
+ null);
+ }
}

this.setFilterMode(9728, true);
@@ -109,6 +_,14 @@
if (this.useDepth) {
GlStateManager._glFramebufferTexture2D(36160, 36096, 3553, this.depthBufferId, 0);
}
+ if (this.useStencil) {
+ GlStateManager._glFramebufferTexture2D(
+ org.lwjgl.opengl.GL32.GL_FRAMEBUFFER,
+ org.lwjgl.opengl.GL32.GL_STENCIL_ATTACHMENT,
+ org.lwjgl.opengl.GL32.GL_TEXTURE_2D,
+ this.depthBufferId,
+ 0);
+ }

this.checkStatus();
this.clear();
@@ -217,6 +_,10 @@
if (this.useDepth) {
GlStateManager._clearDepth(1.0);
i |= 256;
+ }
+ if (this.useStencil) {
+ GlStateManager._clearStencil(0);
+ i |= org.lwjgl.opengl.GL32.GL_STENCIL_BUFFER_BIT;
}

GlStateManager._clear(i);
14 changes: 14 additions & 0 deletions patches/com/mojang/blaze3d/pipeline/TextureTarget.java.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
--- a/com/mojang/blaze3d/pipeline/TextureTarget.java
+++ b/com/mojang/blaze3d/pipeline/TextureTarget.java
@@ -7,7 +_,10 @@
@OnlyIn(Dist.CLIENT)
public class TextureTarget extends RenderTarget {
public TextureTarget(int p_166213_, int p_166214_, boolean p_166215_) {
- super(p_166215_);
+ this(p_166213_, p_166214_, p_166215_, false);
+ }
+ public TextureTarget(int p_166213_, int p_166214_, boolean p_166215_, boolean useStencil) {
+ super(p_166215_, useStencil);
RenderSystem.assertOnRenderThreadOrInit();
this.resize(p_166213_, p_166214_);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--- a/com/mojang/blaze3d/resource/RenderTargetDescriptor.java
+++ b/com/mojang/blaze3d/resource/RenderTargetDescriptor.java
@@ -6,9 +_,13 @@
import net.neoforged.api.distmarker.OnlyIn;

@OnlyIn(Dist.CLIENT)
-public record RenderTargetDescriptor(int width, int height, boolean useDepth) implements ResourceDescriptor<RenderTarget> {
+public record RenderTargetDescriptor(int width, int height, boolean useDepth, boolean useStencil) implements ResourceDescriptor<RenderTarget> {
+ public RenderTargetDescriptor(int width, int height, boolean useDepth) {
+ this(width, height, useDepth, false);
+ }
+
public RenderTarget allocate() {
- return new TextureTarget(this.width, this.height, this.useDepth);
+ return new TextureTarget(this.width, this.height, this.useDepth, this.useStencil);
}

public void free(RenderTarget p_363223_) {
8 changes: 5 additions & 3 deletions patches/net/minecraft/client/Minecraft.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
this.demo = p_91084_.game.demo;
this.allowsMultiplayer = !p_91084_.game.disableMultiplayer;
this.allowsChat = !p_91084_.game.disableChat;
@@ -483,15 +_,17 @@
@@ -483,15 +_,18 @@
LOGGER.error("Couldn't set icon", (Throwable)ioexception);
}

Expand All @@ -18,11 +18,12 @@
this.keyboardHandler = new KeyboardHandler(this);
- this.keyboardHandler.setup(this.window.getWindow());
RenderSystem.initRenderer(this.options.glDebugVerbosity, false);
+ net.neoforged.neoforge.client.loading.ClientModLoader.begin(this);
this.mainRenderTarget = new MainTarget(this.window.getWidth(), this.window.getHeight());
this.mainRenderTarget.setClearColor(0.0F, 0.0F, 0.0F, 0.0F);
this.mainRenderTarget.clear();
this.resourceManager = new ReloadableResourceManager(PackType.CLIENT_RESOURCES);
+ net.neoforged.neoforge.client.loading.ClientModLoader.begin(this, this.resourcePackRepository, this.resourceManager);
+ net.neoforged.neoforge.client.loading.ClientModLoader.finish(this.resourcePackRepository, this.resourceManager);
+ //Move client bootstrap to after mod loading so that events can be fired for it.
+ ClientBootstrap.bootstrap();
this.resourcePackRepository.reload();
Expand Down Expand Up @@ -177,14 +178,15 @@
this.deltaTracker.updatePauseState(this.pause);
this.deltaTracker.updateFrozenState(!this.isLevelRunningNormally());
long l = Util.getNanos();
@@ -1351,10 +_,12 @@
@@ -1351,10 +_,13 @@
this.window.setGuiScale((double)i);
if (this.screen != null) {
this.screen.resize(this, this.window.getGuiScaledWidth(), this.window.getGuiScaledHeight());
+ net.neoforged.neoforge.client.ClientHooks.resizeGuiLayers(this, this.window.getGuiScaledWidth(), this.window.getGuiScaledHeight());
}

RenderTarget rendertarget = this.getMainRenderTarget();
+ if (rendertarget != null)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this?

rendertarget.resize(this.window.getWidth(), this.window.getHeight());
+ if (this.gameRenderer != null)
this.gameRenderer.resize(this.window.getWidth(), this.window.getHeight());
Expand Down
10 changes: 10 additions & 0 deletions patches/net/minecraft/client/renderer/LevelRenderer.java.patch
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
--- a/net/minecraft/client/renderer/LevelRenderer.java
+++ b/net/minecraft/client/renderer/LevelRenderer.java
@@ -459,7 +_,8 @@
this.targets.main = framegraphbuilder.importExternal("main", this.minecraft.getMainRenderTarget());
int i = this.minecraft.getMainRenderTarget().width;
int j = this.minecraft.getMainRenderTarget().height;
- RenderTargetDescriptor rendertargetdescriptor = new RenderTargetDescriptor(i, j, true);
+ boolean useStencil = this.minecraft.getMainRenderTarget().useStencil;
+ RenderTargetDescriptor rendertargetdescriptor = new RenderTargetDescriptor(i, j, true, useStencil);
PostChain postchain = this.getTransparencyChain();
if (postchain != null) {
this.targets.translucent = framegraphbuilder.createInternal("translucent", rendertargetdescriptor);
@@ -473,6 +_,9 @@
this.targets.entityOutline = framegraphbuilder.importExternal("entity_outline", this.entityOutlineTarget);
}
Expand Down
38 changes: 38 additions & 0 deletions patches/net/minecraft/client/renderer/PostChain.java.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--- a/net/minecraft/client/renderer/PostChain.java
+++ b/net/minecraft/client/renderer/PostChain.java
@@ -95,17 +_,33 @@
Matrix4f matrix4f = new Matrix4f().setOrtho(0.0F, (float)p_361423_, 0.0F, (float)p_362735_, 0.1F, 1000.0F);
Map<ResourceLocation, ResourceHandle<RenderTarget>> map = new HashMap<>(this.internalTargets.size() + this.externalTargets.size());

+ // Enable the depth and stencil buffers based on whether any external targets use them.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what this patch is trying to achieve.

+ // This is necessary so any created buffers get the correct parameters for blitting.
+ boolean useDepth = false;
+ boolean useStencil = false;
for (ResourceLocation resourcelocation : this.externalTargets) {
map.put(resourcelocation, p_361871_.getOrThrow(resourcelocation));
+
+ var handle = p_361871_.get(resourcelocation);
+
+ if (handle instanceof FrameGraphBuilder.Handle<?> frameHandle
+ && frameHandle.getDescriptor() instanceof RenderTargetDescriptor renderDescriptor) {
+ useDepth |= renderDescriptor.useDepth();
+ useStencil |= renderDescriptor.useStencil();
+ } else {
+ var target = handle.get();
+ useDepth |= target.useDepth;
+ useStencil |= target.useStencil;
+ }
}

for (Entry<ResourceLocation, PostChainConfig.InternalTarget> entry : this.internalTargets.entrySet()) {
ResourceLocation resourcelocation1 = entry.getKey();
RenderTargetDescriptor rendertargetdescriptor = switch (entry.getValue()) {
case PostChainConfig.FixedSizedTarget(int i, int j) -> {
- yield new RenderTargetDescriptor(i, j, true);
+ yield new RenderTargetDescriptor(i, j, useDepth, useStencil);
}
- case PostChainConfig.FullScreenTarget postchainconfig$fullscreentarget -> new RenderTargetDescriptor(p_361423_, p_362735_, true);
+ case PostChainConfig.FullScreenTarget postchainconfig$fullscreentarget -> new RenderTargetDescriptor(p_361423_, p_362735_, useDepth, useStencil);
default -> throw new MatchException(null, null);
};
map.put(resourcelocation1, p_362523_.createInternal(resourcelocation1.toString(), rendertargetdescriptor));
8 changes: 8 additions & 0 deletions src/main/java/net/neoforged/neoforge/client/ClientHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.framegraph.FrameGraphBuilder;
import com.mojang.blaze3d.pipeline.MainTarget;
import com.mojang.blaze3d.platform.NativeImage;
import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.resource.RenderTargetDescriptor;
Expand Down Expand Up @@ -144,6 +145,7 @@
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.ComputeFovModifierEvent;
import net.neoforged.neoforge.client.event.ConfigureMainRenderTargetEvent;
import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.event.FrameGraphSetupEvent;
Expand Down Expand Up @@ -1099,4 +1101,10 @@ public static Map<ResourceLocation, ResourceLocation> gatherMaterialAtlases(Map<
public static FrameGraphSetupEvent fireFrameGraphSetup(FrameGraphBuilder builder, LevelTargetBundle targets, RenderTargetDescriptor renderTargetDescriptor, Frustum frustum, Camera camera, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, DeltaTracker deltaTracker, ProfilerFiller profiler) {
return NeoForge.EVENT_BUS.post(new FrameGraphSetupEvent(builder, targets, renderTargetDescriptor, frustum, camera, modelViewMatrix, projectionMatrix, deltaTracker, profiler));
}

@ApiStatus.Internal
public static MainTarget createMainRenderTarget(int width, int height) {
var e = ModLoader.postEventWithReturn(new ConfigureMainRenderTargetEvent());
return new MainTarget(width, height, e.useStencil());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

package net.neoforged.neoforge.client.event;

import com.mojang.blaze3d.pipeline.MainTarget;
import net.neoforged.bus.api.Event;
import net.neoforged.bus.api.ICancellableEvent;
import net.neoforged.fml.LogicalSide;
import net.neoforged.fml.event.IModBusEvent;

/**
* Fired when configuring the {@linkplain MainTarget main render target} during startup.
* <p>
* This event is not {@linkplain ICancellableEvent cancellable}.
* <p>
* This event is fired on the mod-specific event bus, only on the {@linkplain LogicalSide#CLIENT logical client}.
*/
public class ConfigureMainRenderTargetEvent extends Event implements IModBusEvent {
private boolean useStencil;

/**
* Returns whether enabling the stencil buffer on the main render target was requested.
*
* @return <code>true</code>, if the stencil buffer is enabled, or <code>false</code> otherwise.
*/
public boolean useStencil() {
return this.useStencil;
}

/**
* Enable the stencil buffer for the main render target.
*
* @return <code>this</code>, for method chaining.
*/
public ConfigureMainRenderTargetEvent enableStencil() {
this.useStencil = true;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public class ClientModLoader extends CommonModLoader {
@Nullable
private static ModLoadingException error;

public static void begin(final Minecraft minecraft, final PackRepository defaultResourcePacks, final ReloadableResourceManager mcResourceManager) {
public static void begin(final Minecraft minecraft) {
// force log4j to shutdown logging in a shutdown hook. This is because we disable default shutdown hook so the server properly logs it's shutdown
Runtime.getRuntime().addShutdownHook(new Thread(LogManager::shutdown));
ImmediateWindowHandler.updateProgress("Loading mods");
Expand All @@ -60,6 +60,9 @@ public static void begin(final Minecraft minecraft, final PackRepository default
} catch (ModLoadingException e) {
error = e;
}
}

public static void finish(final PackRepository defaultResourcePacks, final ReloadableResourceManager mcResourceManager) {
if (error == null) {
ResourcePackLoader.populatePackRepository(defaultResourcePacks, PackType.CLIENT_RESOURCES, false);
DataPackConfig.DEFAULT.addModPacks(ResourcePackLoader.getPackNames(PackType.SERVER_DATA));
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# Note: This file is for manually added ATs. When AT entries can be programmatically generated based on fixed rules you may define those rules in the build.gradle file
public com.mojang.blaze3d.framegraph.FrameGraphBuilder$Handle
public com.mojang.blaze3d.framegraph.FrameGraphBuilder$Handle holder
public com.mojang.blaze3d.framegraph.FrameGraphBuilder$VirtualResource
public com.mojang.blaze3d.framegraph.FrameGraphBuilder$Pass
public net.minecraft.advancements.CriteriaTriggers register(Ljava/lang/String;Lnet/minecraft/advancements/CriterionTrigger;)Lnet/minecraft/advancements/CriterionTrigger; # register
default net.minecraft.client.KeyMapping isDown # isDown
public-f net.minecraft.client.Options keyMappings # keyMappings
Expand Down
Loading