From e3a2ea7ff9b3f8a09737878d7f6b29a3edff37e0 Mon Sep 17 00:00:00 2001 From: XFactHD <11262040+XFactHD@users.noreply.github.com> Date: Sat, 20 Jun 2026 21:03:50 +0200 Subject: [PATCH 1/4] Very rough prototype of B3D implementation of ELS render abstraction --- gradle.properties | 2 +- settings.gradle | 1 + .../neoforge/client/ClientHooks.java | 9 + .../loading/earlydisplay/Blaze3DBuffer.java | 54 ++++ .../earlydisplay/Blaze3DBufferSlice.java | 34 +++ .../loading/earlydisplay/Blaze3DConst.java | 28 ++ .../earlydisplay/Blaze3DRenderBackend.java | 262 ++++++++++++++++++ .../earlydisplay/Blaze3DRenderPass.java | 83 ++++++ .../loading/earlydisplay/Blaze3DTexture.java | 51 ++++ .../loading/earlydisplay/package-info.java | 11 + .../neoforge/common/NeoForgeMod.java | 2 + 11 files changed, 536 insertions(+), 1 deletion(-) create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java create mode 100644 src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/package-info.java diff --git a/gradle.properties b/gradle.properties index 43a6671a4c3..bc40a308019 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ nightconfig_version=3.8.3 jetbrains_annotations_version=24.0.1 apache_maven_artifact_version=3.9.9 jarjar_version=0.4.1 -fancy_mod_loader_version=11.0.13 +fancy_mod_loader_version=11.0.16-els_backend typetools_version=0.6.3 mixin_extras_version=0.5.4 diff --git a/settings.gradle b/settings.gradle index 9819940cfa4..cf963edbd0a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,6 +22,7 @@ dependencyResolutionManagement { rulesMode = RulesMode.FAIL_ON_PROJECT_RULES repositories { mavenCentral() + mavenLocal() } } diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index bdd40ff2a1b..017cafbcad1 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -139,6 +139,7 @@ import net.minecraft.world.level.material.FogType; import net.neoforged.bus.api.Event; import net.neoforged.fml.ModLoader; +import net.neoforged.fml.loading.EarlyLoadingScreenController; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.client.config.NeoForgeClientConfig; import net.neoforged.neoforge.client.entity.animation.json.AnimationTypeManager; @@ -190,6 +191,7 @@ import net.neoforged.neoforge.client.gui.ClientTooltipComponentManager; import net.neoforged.neoforge.client.gui.PictureInPictureRendererRegistration; import net.neoforged.neoforge.client.gui.map.MapDecorationRendererManager; +import net.neoforged.neoforge.client.loading.earlydisplay.Blaze3DRenderBackend; import net.neoforged.neoforge.client.model.block.BlockStateModelHooks; import net.neoforged.neoforge.client.pipeline.PipelineModifiers; import net.neoforged.neoforge.client.renderstate.RegisterRenderStateModifiersEvent; @@ -1025,4 +1027,11 @@ public static Map gatherFluidModels(Map mo } return Map.copyOf(models); } + + public static void takeOverLoadingScreen(Window window) { + EarlyLoadingScreenController earlyLoadingScreen = EarlyLoadingScreenController.current(); + if (earlyLoadingScreen != null) { + earlyLoadingScreen.handOverToMinecraft(() -> new Blaze3DRenderBackend(window)); + } + } } diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java new file mode 100644 index 00000000000..8f512bdc264 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java @@ -0,0 +1,54 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; + +import java.util.Set; + +@SuppressWarnings("UnstableApiUsage") +final class Blaze3DBuffer implements ELSBuffer { + private final GpuBuffer b3dBuffer; + private final Set usage; + private final int usageMask; + private final Blaze3DBufferSlice defaultSlice; + + Blaze3DBuffer(GpuBuffer b3dBuffer, Set usage, int usageMask) { + this.b3dBuffer = b3dBuffer; + this.usage = usage; + this.usageMask = usageMask; + this.defaultSlice = new Blaze3DBufferSlice(this, b3dBuffer.slice(0, b3dBuffer.size())); + } + + @Override + public Set usage() { + return this.usage; + } + + @Override + public long size() { + return this.b3dBuffer.size(); + } + + @Override + public Blaze3DBufferSlice slice() { + return this.defaultSlice; + } + + @Override + public Blaze3DBufferSlice slice(long offset, long length) { + return new Blaze3DBufferSlice(this, this.b3dBuffer.slice(offset, length)); + } + + @Override + public void close() { + this.b3dBuffer.close(); + } + + int getUsageMask() { + return this.usageMask; + } + + GpuBuffer unwrap() { + return this.b3dBuffer; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java new file mode 100644 index 00000000000..c43dcdae7c7 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java @@ -0,0 +1,34 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import net.neoforged.fml.earlydisplay.render.backend.ELSBufferSlice; + +@SuppressWarnings("UnstableApiUsage") +final class Blaze3DBufferSlice implements ELSBufferSlice { + private final Blaze3DBuffer buffer; + private final GpuBufferSlice b3dBufferSlice; + + Blaze3DBufferSlice(Blaze3DBuffer buffer, GpuBufferSlice b3dBufferSlice) { + this.buffer = buffer; + this.b3dBufferSlice = b3dBufferSlice; + } + + @Override + public Blaze3DBuffer buffer() { + return this.buffer; + } + + @Override + public long offset() { + return this.b3dBufferSlice.offset(); + } + + @Override + public long length() { + return this.b3dBufferSlice.length(); + } + + GpuBufferSlice unwrap() { + return this.b3dBufferSlice; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java new file mode 100644 index 00000000000..e8ffc997710 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java @@ -0,0 +1,28 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; + +import java.util.Set; + +@SuppressWarnings("UnstableApiUsage") +final class Blaze3DConst { + static int elsUsageToB3D(Set usage) { + int mask = 0; + for (ELSBuffer.Usage entry : usage) { + mask |= switch (entry) { + case MAP_READ -> GpuBuffer.USAGE_MAP_READ; + case MAP_WRITE -> GpuBuffer.USAGE_MAP_WRITE; + case HINT_CLIENT_STORAGE -> GpuBuffer.USAGE_HINT_CLIENT_STORAGE; + case COPY_DST -> GpuBuffer.USAGE_COPY_DST; + case COPY_SRC -> GpuBuffer.USAGE_COPY_SRC; + case VERTEX -> GpuBuffer.USAGE_VERTEX; + case INDEX -> GpuBuffer.USAGE_INDEX; + case UNIFORM -> GpuBuffer.USAGE_UNIFORM; + }; + } + return mask; + } + + private Blaze3DConst() { } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java new file mode 100644 index 00000000000..ff9ec705cf3 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java @@ -0,0 +1,262 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.GpuFormat; +import com.mojang.blaze3d.PrimitiveTopology; +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.pipeline.BindGroupLayout; +import com.mojang.blaze3d.pipeline.BlendFunction; +import com.mojang.blaze3d.pipeline.ColorTargetState; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.BlendFactor; +import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.shaders.ShaderSource; +import com.mojang.blaze3d.shaders.UniformType; +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.GpuSurface; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.systems.SurfaceException; +import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuSampler; +import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.blaze3d.textures.GpuTextureView; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.logging.LogUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.Identifier; +import net.neoforged.fml.earlydisplay.render.ElementShader; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; +import net.neoforged.fml.earlydisplay.render.backend.ELSBufferSlice; +import net.neoforged.fml.earlydisplay.render.backend.ELSRenderBackend; +import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPass; +import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; +import net.neoforged.fml.earlydisplay.render.backend.TextureFormat; +import net.neoforged.fml.earlydisplay.theme.NativeBuffer; +import net.neoforged.fml.earlydisplay.theme.ThemeColor; +import org.joml.Vector4f; +import org.joml.Vector4fc; +import org.lwjgl.glfw.GLFW; +import org.slf4j.Logger; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +@SuppressWarnings("UnstableApiUsage") +public final class Blaze3DRenderBackend extends ELSRenderBackend { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final int TEX_USAGE = GpuTexture.USAGE_COPY_DST | GpuTexture.USAGE_COPY_SRC | GpuTexture.USAGE_TEXTURE_BINDING | GpuTexture.USAGE_RENDER_ATTACHMENT; + private static final ColorTargetState COLOR_STATE = new ColorTargetState(new BlendFunction(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA, BlendFactor.ZERO, BlendFactor.ONE)); + private static final VertexFormat FORMAT_POS = VertexFormat.builder(0) + .addAttribute("position", GpuFormat.RG32_FLOAT) + .build(); + private static final VertexFormat FORMAT_POS_TEX = VertexFormat.builder(0) + .addAttribute("position", GpuFormat.RG32_FLOAT) + .addAttribute("uv", GpuFormat.RG32_FLOAT) + .build(); + private static final VertexFormat FORMAT_COLOR = VertexFormat.builder(0) + .addAttribute("position", GpuFormat.RG32_FLOAT) + .addAttribute("color", GpuFormat.RGBA8_UNORM) + .build(); + private static final VertexFormat FORMAT_POS_TEX_COLOR = VertexFormat.builder(0) + .addAttribute("position", GpuFormat.RG32_FLOAT) + .addAttribute("uv", GpuFormat.RG32_FLOAT) + .addAttribute("color", GpuFormat.RGBA8_UNORM) + .build(); + private static final BindGroupLayout BIND_GROUP_LAYOUT = BindGroupLayout.builder() + .withSampler("tex") + .withUniform("screenSize", UniformType.UNIFORM_BUFFER) + .build(); + + private final GpuDevice device; + private final Window window; + private final Map pipelines = new IdentityHashMap<>(); + + public Blaze3DRenderBackend(Window window) { + this.device = RenderSystem.getDevice(); + this.window = window; + } + + @Override + public void preloadPipelines(Collection shaders) { + for (ElementShader shader : shaders) { + RenderPipeline pipeline = RenderPipeline.builder() + .withLocation(makeId(shader.getName())) + .withVertexShader(makeId(shader.getVertexShaderPath())) + .withFragmentShader(makeId(shader.getFragmentShaderPath())) + .withPrimitiveTopology(PrimitiveTopology.QUADS) + .withColorTargetState(COLOR_STATE) + .withVertexBinding(0, FORMAT_POS_TEX_COLOR) + .withBindGroupLayout(BIND_GROUP_LAYOUT) + .build(); + device.precompilePipeline(pipeline, makeShaderSource(shader)); + this.pipelines.put(shader, pipeline); + } + } + + @Override + public ELSTexture createTexture(String debugName, int width, int height, TextureFormat format, boolean linearFilter) { + GpuFormat b3dFormat = switch (format) { + case RGBA -> GpuFormat.RGBA8_UNORM; + case RED -> GpuFormat.R8_UNORM; + }; + GpuTexture texture = this.device.createTexture(debugName, TEX_USAGE, b3dFormat, width, height, 1, 1); + GpuSampler sampler = RenderSystem.getSamplerCache().getRepeat(linearFilter ? FilterMode.LINEAR : FilterMode.NEAREST); + return new Blaze3DTexture(format, texture, this.device.createTextureView(texture), sampler); + } + + @Override + public void writeToTexture(ELSTexture texture, ByteBuffer pixels) { + this.device.createCommandEncoder().writeToTexture(((Blaze3DTexture) texture).unwrap(), pixels, 0, 0, 0, 0, texture.width(), texture.height()); + } + + @Override + public ELSBuffer createBuffer(String label, Set usage, long size) { + int usageMask = Blaze3DConst.elsUsageToB3D(usage); + return new Blaze3DBuffer(this.device.createBuffer(() -> label, usageMask, size), usage, usageMask); + } + + @Override + public ELSBuffer createBuffer(String label, Set usage, ByteBuffer data) { + int usageMask = Blaze3DConst.elsUsageToB3D(usage); + return new Blaze3DBuffer(this.device.createBuffer(() -> label, usageMask, data), usage, usageMask); + } + + @Override + public void writeToBuffer(ELSBufferSlice buffer, ByteBuffer data) { + this.device.createCommandEncoder().writeToBuffer(((Blaze3DBufferSlice) buffer).unwrap(), data); + } + + @Override + public void copyBufferToBuffer(ELSBuffer source, ELSBuffer destination) { + this.device.createCommandEncoder().copyToBuffer( + ((Blaze3DBuffer) source).slice().unwrap(), + ((Blaze3DBuffer) destination).slice().unwrap() + ); + } + + @Override + public ELSBuffer getQuadAutoIndexBuffer(int indexCount) { + return new Blaze3DBuffer(RenderSystem.getSequentialBuffer(PrimitiveTopology.QUADS).getBuffer(indexCount), Set.of(ELSBuffer.Usage.INDEX), GpuBuffer.USAGE_INDEX); + } + + @Override + public ELSRenderPass createRenderPass(String label, ELSTexture target, ThemeColor clearColor) { + GpuTextureView texture = ((Blaze3DTexture) target).view(); + Optional clearColorVec = Optional.of(new Vector4f(clearColor.a(), clearColor.r(), clearColor.g(), clearColor.a())); + return new Blaze3DRenderPass(this, this.device.createCommandEncoder().createRenderPass(() -> label, texture, clearColorVec)); + } + + @Override + public boolean startFrame(FramebufferSizeListener listener) { + GpuSurface gpuSurface = Minecraft.getInstance().windowSurface(); + if (gpuSurface.isAcquired()) { + return false; + } + + if (Minecraft.getInstance().windowSurfaceNeedsReconfiguring) { + int[] width = new int[1]; + int[] height = new int[1]; + GLFW.glfwGetFramebufferSize(this.window.handle(), width, height); + listener.accept(width[0], height[0]); + + if (width[0] != 0 || height[0] != 0) { + GpuSurface.PresentMode presentMode = GpuSurface.PresentMode.getSupportedVsyncMode( + gpuSurface.supportedPresentModes(), Minecraft.getInstance().options.enableVsync().get() + ); + GpuSurface.Configuration config = new GpuSurface.Configuration(width[0], height[0], presentMode); + + try { + gpuSurface.configure(config); + Minecraft.getInstance().surfaceIsInvalid = false; + } catch (SurfaceException exception) { + LOGGER.warn("Couldn't configure surface to {}: {}", config, exception); + Minecraft.getInstance().surfaceIsInvalid = true; + } + } + Minecraft.getInstance().windowSurfaceNeedsReconfiguring = false; + } + + if (!Minecraft.getInstance().surfaceIsInvalid && !this.window.isMinimized()) { + try { + gpuSurface.acquireNextTexture(); + } catch (SurfaceException ex) { + LOGGER.warn("Couldn't acquire next surface texture with config {}: {}", gpuSurface.currentConfiguration(), ex); + Minecraft.getInstance().surfaceIsInvalid = true; + Minecraft.getInstance().windowSurfaceNeedsReconfiguring = true; + } + } + + return true; + } + + @Override + public void presentTexture(ELSTexture texture, ThemeColor backgroundColor, int windowFBWidth, int windowFBHeight) { + GpuSurface gpuSurface = Minecraft.getInstance().windowSurface(); + if (gpuSurface.isAcquired()) { + gpuSurface.blitFromTexture(this.device.createCommandEncoder(), ((Blaze3DTexture) texture).view()); + } + this.device.createCommandEncoder().submit(); + if (gpuSurface.isAcquired()) { + gpuSurface.present(); + } + } + + @Override + public int getMaxTextureSize() { + return this.device.getDeviceInfo().limits().maxTextureSize(); + } + + @Override + public long getWindowHandle() { + return this.window.handle(); + } + + @Override + public void acquireContextOwnership() {} + + @Override + public void releaseContextOwnership() {} + + @Override + public void guardResourceCleanup(Runnable cleanupTask) { + cleanupTask.run(); + } + + @Override + public void close() { } + + @Override + public String name() { + return "Blaze3D"; + } + + RenderPipeline getPipeline(ElementShader shader) { + RenderPipeline pipeline = this.pipelines.get(shader); + if (pipeline == null) { + throw new IllegalArgumentException("Unrecognized shader: " + shader); + } + return pipeline; + } + + private static Identifier makeId(String path) { + return Identifier.fromNamespaceAndPath("neoforge", "fml_els/" + path); + } + + private static ShaderSource makeShaderSource(ElementShader shader) { + return (_, type) -> { + try { + NativeBuffer buffer = switch (type) { + case VERTEX -> shader.loadVertexShader(); + case FRAGMENT -> shader.loadFragmentShader(); + }; + return new String(buffer.toByteArray()); + } catch (IOException e) { + return null; + } + }; + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java new file mode 100644 index 00000000000..724fdafffab --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java @@ -0,0 +1,83 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.IndexType; +import com.mojang.blaze3d.systems.RenderPass; +import net.neoforged.fml.earlydisplay.render.ElementShader; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; +import net.neoforged.fml.earlydisplay.render.backend.ELSBufferSlice; +import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPass; +import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; +import org.jetbrains.annotations.Nullable; + +@SuppressWarnings("UnstableApiUsage") +final class Blaze3DRenderPass implements ELSRenderPass { + private final Blaze3DRenderBackend backend; + private final RenderPass renderPass; + + Blaze3DRenderPass(Blaze3DRenderBackend backend, RenderPass renderPass) { + this.backend = backend; + this.renderPass = renderPass; + } + + @Override + public void setViewport(int x, int y, int width, int height) { + this.renderPass.setViewport(x, y, width, height); + } + + @Override + public void enableScissor(int x, int y, int width, int height) { + this.renderPass.enableScissor(x, y, width, height); + } + + @Override + public void disableScissor() { + this.renderPass.disableScissor(); + } + + @Override + public void bindShader(ElementShader shader) { + this.renderPass.setPipeline(this.backend.getPipeline(shader)); + } + + @Override + public void bindTexture(String name, @Nullable ELSTexture texture) { + if (texture != null) { + Blaze3DTexture b3dTexture = (Blaze3DTexture) texture; + this.renderPass.bindTexture(name, b3dTexture.view(), b3dTexture.sampler); + } else { + this.renderPass.bindTexture(name, null, null); + } + } + + @Override + public void bindUniform(String name, ELSBuffer buffer) { + this.renderPass.setUniform(name, ((Blaze3DBuffer) buffer).unwrap()); + } + + @Override + public void bindVertexBuffer(ELSBufferSlice buffer) { + this.renderPass.setVertexBuffer(0, ((Blaze3DBufferSlice) buffer).unwrap()); + } + + @Override + public void bindIndexBuffer(@Nullable ELSBuffer buffer) { + if (buffer != null) { + this.renderPass.setIndexBuffer(((Blaze3DBuffer) buffer).unwrap(), IndexType.INT); + } + } + + @Override + public void draw(int vertexCount) { + this.renderPass.draw(vertexCount, 1, 0, 0); + } + + @Override + public void drawIndexed(int indexCount) { + this.renderPass.drawIndexed(indexCount, 1, 0, 0, 0); + } + + @Override + public void close() { + this.renderPass.close(); + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java new file mode 100644 index 00000000000..315c790bc1d --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java @@ -0,0 +1,51 @@ +package net.neoforged.neoforge.client.loading.earlydisplay; + +import com.mojang.blaze3d.textures.GpuSampler; +import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.blaze3d.textures.GpuTextureView; +import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; +import net.neoforged.fml.earlydisplay.render.backend.TextureFormat; + +@SuppressWarnings("UnstableApiUsage") +final class Blaze3DTexture implements ELSTexture { + private final TextureFormat format; + private final GpuTexture b3dTexture; + private final GpuTextureView b3dTextureView; + final GpuSampler sampler; + + Blaze3DTexture(TextureFormat format, GpuTexture b3dTexture, GpuTextureView b3dTextureView, GpuSampler sampler) { + this.format = format; + this.b3dTexture = b3dTexture; + this.b3dTextureView = b3dTextureView; + this.sampler = sampler; + } + + @Override + public int width() { + return this.b3dTexture.getWidth(0); + } + + @Override + public int height() { + return this.b3dTexture.getHeight(0); + } + + @Override + public TextureFormat format() { + return this.format; + } + + GpuTexture unwrap() { + return this.b3dTexture; + } + + GpuTextureView view() { + return this.b3dTextureView; + } + + @Override + public void close() { + this.b3dTextureView.close(); + this.b3dTexture.close(); + } +} diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/package-info.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/package-info.java new file mode 100644 index 00000000000..3bbdcbab2c7 --- /dev/null +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/package-info.java @@ -0,0 +1,11 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +@NullMarked +@ApiStatus.Internal +package net.neoforged.neoforge.client.loading.earlydisplay; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 201ef34f891..419600b7e3f 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -619,6 +619,8 @@ public NeoForgeMod(IEventBus modEventBus, Dist dist, ModContainer container) { if (NeoForgeVersion.getBuildType() == NeoForgeBuildType.PULL_REQUEST) { ModLoader.addLoadingIssue(ModLoadingIssue.warning("loadwarning.neoforge.prbuild").withAffectedMod(container.getModInfo())); } + + while (true); } public void preInit(FMLCommonSetupEvent evt) { From 2718dd4633c926275729bcf975bb344d07fbff74 Mon Sep 17 00:00:00 2001 From: XFactHD <11262040+XFactHD@users.noreply.github.com> Date: Mon, 22 Jun 2026 01:38:32 +0200 Subject: [PATCH 2/4] Finish B3D implementation of ELS render abstraction --- gradle.properties | 2 +- .../mojang/blaze3d/platform/Window.java.patch | 12 ---- .../net/minecraft/client/Minecraft.java.patch | 26 +++++---- settings.gradle | 10 +++- .../neoforge/client/ClientHooks.java | 1 + .../earlydisplay/Blaze3DRenderBackend.java | 58 ++++++++++++------- .../earlydisplay/Blaze3DRenderPass.java | 8 +-- .../neoforge/common/NeoForgeMod.java | 2 - .../resources/META-INF/accesstransformer.cfg | 2 + 9 files changed, 68 insertions(+), 53 deletions(-) diff --git a/gradle.properties b/gradle.properties index bc40a308019..170ca4fdca9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ nightconfig_version=3.8.3 jetbrains_annotations_version=24.0.1 apache_maven_artifact_version=3.9.9 jarjar_version=0.4.1 -fancy_mod_loader_version=11.0.16-els_backend +fancy_mod_loader_version=11.0.24-pr-430-els_backend typetools_version=0.6.3 mixin_extras_version=0.5.4 diff --git a/patches/com/mojang/blaze3d/platform/Window.java.patch b/patches/com/mojang/blaze3d/platform/Window.java.patch index 3ecfc4acad1..b2e8fccac6c 100644 --- a/patches/com/mojang/blaze3d/platform/Window.java.patch +++ b/patches/com/mojang/blaze3d/platform/Window.java.patch @@ -17,18 +17,6 @@ this.backend = backend; if (initialMonitor != null) { VideoMode mode = initialMonitor.getPreferredVidMode(this.fullscreen ? this.preferredFullscreenVideoMode : Optional.empty()); -@@ -132,6 +_,11 @@ - try (GLFWErrorScope var9 = new GLFWErrorScope(glfwErrors)) { - backend.setWindowHints(); - GLFW.glfwWindowHint(131076, 0); -+ var earlyLoadingScreen = net.neoforged.fml.loading.EarlyLoadingScreenController.current(); -+ if (earlyLoadingScreen != null) { -+ windowHandle = earlyLoadingScreen.takeOverGlfwWindow(); -+ GLFW.glfwSetWindowTitle(windowHandle, title); -+ } else - windowHandle = GLFW.glfwCreateWindow(width, height, title, monitor, 0L); - if (windowHandle == 0L) { - backend.handleWindowCreationErrors(glfwErrors.firstError()); @@ -237,11 +_,11 @@ } diff --git a/patches/net/minecraft/client/Minecraft.java.patch b/patches/net/minecraft/client/Minecraft.java.patch index 3f4a7a9b480..e5122e15830 100644 --- a/patches/net/minecraft/client/Minecraft.java.patch +++ b/patches/net/minecraft/client/Minecraft.java.patch @@ -83,17 +83,7 @@ this.gameRenderer = new GameRenderer(this, this.entityRenderDispatcher.getItemInHandRenderer(), this.modelManager); WindowRenderState windowRenderState = this.gameRenderer.gameRenderState().windowRenderState; windowRenderState.width = this.window.getWidth(); -@@ -654,6 +_,9 @@ - this.gpuWarnlistManager = new GpuWarnlistManager(); - this.resourceManager.registerReloadListener(this.gpuWarnlistManager); - this.resourceManager.registerReloadListener(this.regionalCompliancies); -+ // NEO: Moved keyboard and mouse handler setup below ingame gui creation to prevent NPEs in them. -+ this.mouseHandler.setup(this.window); -+ this.keyboardHandler.setup(this.window); - this.gui = new Gui(this, new Hud(this), this.gameRenderer.gameRenderState().guiRenderState); - this.gui.registerReloadListeners(this.resourceManager); - RealmsClient realmsClient = RealmsClient.getOrCreate(this); -@@ -688,6 +_,7 @@ +@@ -688,9 +_,11 @@ } } @@ -101,6 +91,10 @@ this.window.updateRawMouseInput(this.options.rawMouseInput().get()); this.window.setAllowCursorChanges(this.options.allowCursorChanges().get()); this.window.setDefaultErrorCallback(); ++ net.neoforged.neoforge.client.ClientHooks.takeOverLoadingScreen(this.window); + GLFW.glfwShowWindow(windowCandidate.handle()); + this.resizeGui(); + this.loadCriticalShaders(); @@ -704,6 +_,7 @@ TitleScreen.registerTextures(this.textureManager); LoadingOverlay.registerTextures(this.textureManager); @@ -118,6 +112,16 @@ this.selfTest(); } +@@ -722,6 +_,9 @@ + }), false)); + this.quickPlayLog = QuickPlayLog.of(gameConfig.quickPlay.logPath()); + this.framerateLimitTracker = new FramerateLimitTracker(this.options, this); ++ // NEO: Moved keyboard and mouse handler setup below ingame gui and framerate limiter creation to prevent NPEs in them. ++ this.mouseHandler.setup(this.window); ++ this.keyboardHandler.setup(this.window); + this.fpsPieProfiler = new ContinuousProfiler(Util.timeSource(), () -> this.fpsPieRenderTicks, this.framerateLimitTracker::isHeavilyThrottled); + if (TracyClient.isAvailable() && gameConfig.game.captureTracyImages) { + this.tracyFrameCapture = new TracyFrameCapture(); @@ -767,6 +_,7 @@ } diff --git a/settings.gradle b/settings.gradle index cf963edbd0a..7e926de6674 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,7 +22,15 @@ dependencyResolutionManagement { rulesMode = RulesMode.FAIL_ON_PROJECT_RULES repositories { mavenCentral() - mavenLocal() + maven { + name = "Maven for PR #430" // https://github.com/neoforged/FancyModLoader/pull/430 + url = uri("https://prmaven.neoforged.net/FancyModLoader/pr430") + content { + includeModule("net.neoforged.fancymodloader", "earlydisplay") + includeModule("net.neoforged.fancymodloader", "junit-fml") + includeModule("net.neoforged.fancymodloader", "loader") + } + } } } diff --git a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java index 017cafbcad1..70592cf672a 100644 --- a/src/client/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/client/java/net/neoforged/neoforge/client/ClientHooks.java @@ -1032,6 +1032,7 @@ public static void takeOverLoadingScreen(Window window) { EarlyLoadingScreenController earlyLoadingScreen = EarlyLoadingScreenController.current(); if (earlyLoadingScreen != null) { earlyLoadingScreen.handOverToMinecraft(() -> new Blaze3DRenderBackend(window)); + earlyLoadingScreen.periodicTick(); } } } diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java index ff9ec705cf3..f89b558032a 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java @@ -28,6 +28,7 @@ import net.neoforged.fml.earlydisplay.render.backend.ELSBufferSlice; import net.neoforged.fml.earlydisplay.render.backend.ELSRenderBackend; import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPass; +import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPipeline; import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; import net.neoforged.fml.earlydisplay.render.backend.TextureFormat; import net.neoforged.fml.earlydisplay.theme.NativeBuffer; @@ -57,7 +58,7 @@ public final class Blaze3DRenderBackend extends ELSRenderBackend { .addAttribute("position", GpuFormat.RG32_FLOAT) .addAttribute("uv", GpuFormat.RG32_FLOAT) .build(); - private static final VertexFormat FORMAT_COLOR = VertexFormat.builder(0) + private static final VertexFormat FORMAT_POS_COLOR = VertexFormat.builder(0) .addAttribute("position", GpuFormat.RG32_FLOAT) .addAttribute("color", GpuFormat.RGBA8_UNORM) .build(); @@ -66,34 +67,47 @@ public final class Blaze3DRenderBackend extends ELSRenderBackend { .addAttribute("uv", GpuFormat.RG32_FLOAT) .addAttribute("color", GpuFormat.RGBA8_UNORM) .build(); - private static final BindGroupLayout BIND_GROUP_LAYOUT = BindGroupLayout.builder() - .withSampler("tex") - .withUniform("screenSize", UniformType.UNIFORM_BUFFER) - .build(); private final GpuDevice device; private final Window window; - private final Map pipelines = new IdentityHashMap<>(); + private final Map pipelines = new IdentityHashMap<>(); public Blaze3DRenderBackend(Window window) { this.device = RenderSystem.getDevice(); this.window = window; + super(); } @Override - public void preloadPipelines(Collection shaders) { - for (ElementShader shader : shaders) { + public void preloadPipelines(Collection pipelines) { + for (ELSRenderPipeline elsPipeline : pipelines) { + ElementShader shader = elsPipeline.shader(); + BindGroupLayout.Builder layoutBuilder = BindGroupLayout.builder(); + if (elsPipeline.sampler() != null) { + layoutBuilder.withSampler(elsPipeline.sampler()); + } + for (String uniform : elsPipeline.uniforms()) { + layoutBuilder.withUniform(uniform, UniformType.UNIFORM_BUFFER); + } RenderPipeline pipeline = RenderPipeline.builder() .withLocation(makeId(shader.getName())) .withVertexShader(makeId(shader.getVertexShaderPath())) .withFragmentShader(makeId(shader.getFragmentShaderPath())) - .withPrimitiveTopology(PrimitiveTopology.QUADS) + .withPrimitiveTopology(switch (elsPipeline.vertexMode()) { + case TRIANGLES -> PrimitiveTopology.TRIANGLES; + case QUADS -> PrimitiveTopology.QUADS; + }) .withColorTargetState(COLOR_STATE) - .withVertexBinding(0, FORMAT_POS_TEX_COLOR) - .withBindGroupLayout(BIND_GROUP_LAYOUT) + .withVertexBinding(0, switch (elsPipeline.vertexFormat()) { + case POS -> FORMAT_POS; + case POS_TEX -> FORMAT_POS_TEX; + case POS_COLOR -> FORMAT_POS_COLOR; + case POS_TEX_COLOR -> FORMAT_POS_TEX_COLOR; + }) + .withBindGroupLayout(layoutBuilder.build()) .build(); - device.precompilePipeline(pipeline, makeShaderSource(shader)); - this.pipelines.put(shader, pipeline); + this.device.precompilePipeline(pipeline, makeShaderSource(shader)); + this.pipelines.put(elsPipeline, pipeline); } } @@ -104,7 +118,7 @@ public ELSTexture createTexture(String debugName, int width, int height, Texture case RED -> GpuFormat.R8_UNORM; }; GpuTexture texture = this.device.createTexture(debugName, TEX_USAGE, b3dFormat, width, height, 1, 1); - GpuSampler sampler = RenderSystem.getSamplerCache().getRepeat(linearFilter ? FilterMode.LINEAR : FilterMode.NEAREST); + GpuSampler sampler = RenderSystem.getSamplerCache().getClampToEdge(linearFilter ? FilterMode.LINEAR : FilterMode.NEAREST); return new Blaze3DTexture(format, texture, this.device.createTextureView(texture), sampler); } @@ -131,10 +145,10 @@ public void writeToBuffer(ELSBufferSlice buffer, ByteBuffer data) { } @Override - public void copyBufferToBuffer(ELSBuffer source, ELSBuffer destination) { + public void copyBufferToBuffer(ELSBufferSlice source, ELSBufferSlice destination) { this.device.createCommandEncoder().copyToBuffer( - ((Blaze3DBuffer) source).slice().unwrap(), - ((Blaze3DBuffer) destination).slice().unwrap() + ((Blaze3DBufferSlice) source).unwrap(), + ((Blaze3DBufferSlice) destination).unwrap() ); } @@ -146,7 +160,7 @@ public ELSBuffer getQuadAutoIndexBuffer(int indexCount) { @Override public ELSRenderPass createRenderPass(String label, ELSTexture target, ThemeColor clearColor) { GpuTextureView texture = ((Blaze3DTexture) target).view(); - Optional clearColorVec = Optional.of(new Vector4f(clearColor.a(), clearColor.r(), clearColor.g(), clearColor.a())); + Optional clearColorVec = Optional.of(new Vector4f(clearColor.r(), clearColor.g(), clearColor.b(), clearColor.a())); return new Blaze3DRenderPass(this, this.device.createCommandEncoder().createRenderPass(() -> label, texture, clearColorVec)); } @@ -216,7 +230,7 @@ public long getWindowHandle() { } @Override - public void acquireContextOwnership() {} + public void acquireContextOwnership(boolean createContext) {} @Override public void releaseContextOwnership() {} @@ -234,10 +248,10 @@ public String name() { return "Blaze3D"; } - RenderPipeline getPipeline(ElementShader shader) { - RenderPipeline pipeline = this.pipelines.get(shader); + RenderPipeline getPipeline(ELSRenderPipeline elsPipeline) { + RenderPipeline pipeline = this.pipelines.get(elsPipeline); if (pipeline == null) { - throw new IllegalArgumentException("Unrecognized shader: " + shader); + throw new IllegalArgumentException("Unrecognized pipeline: " + elsPipeline); } return pipeline; } diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java index 724fdafffab..f1ba6b99982 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java @@ -2,10 +2,10 @@ import com.mojang.blaze3d.IndexType; import com.mojang.blaze3d.systems.RenderPass; -import net.neoforged.fml.earlydisplay.render.ElementShader; import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; import net.neoforged.fml.earlydisplay.render.backend.ELSBufferSlice; import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPass; +import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPipeline; import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; import org.jetbrains.annotations.Nullable; @@ -35,8 +35,8 @@ public void disableScissor() { } @Override - public void bindShader(ElementShader shader) { - this.renderPass.setPipeline(this.backend.getPipeline(shader)); + public void bindPipeline(ELSRenderPipeline pipeline) { + this.renderPass.setPipeline(this.backend.getPipeline(pipeline)); } @Override @@ -62,7 +62,7 @@ public void bindVertexBuffer(ELSBufferSlice buffer) { @Override public void bindIndexBuffer(@Nullable ELSBuffer buffer) { if (buffer != null) { - this.renderPass.setIndexBuffer(((Blaze3DBuffer) buffer).unwrap(), IndexType.INT); + this.renderPass.setIndexBuffer(((Blaze3DBuffer) buffer).unwrap(), IndexType.SHORT); } } diff --git a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java index 419600b7e3f..201ef34f891 100644 --- a/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java +++ b/src/main/java/net/neoforged/neoforge/common/NeoForgeMod.java @@ -619,8 +619,6 @@ public NeoForgeMod(IEventBus modEventBus, Dist dist, ModContainer container) { if (NeoForgeVersion.getBuildType() == NeoForgeBuildType.PULL_REQUEST) { ModLoader.addLoadingIssue(ModLoadingIssue.warning("loadwarning.neoforge.prbuild").withAffectedMod(container.getModInfo())); } - - while (true); } public void preInit(FMLCommonSetupEvent evt) { diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 0b4b2901689..2ee8ace8cf3 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,6 +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 net.minecraft.advancements.triggers.CriteriaTriggers register(Ljava/lang/String;Lnet/minecraft/advancements/triggers/CriterionTrigger;)Lnet/minecraft/advancements/triggers/CriterionTrigger; # register default net.minecraft.client.KeyMapping isDown # isDown +public net.minecraft.client.Minecraft windowSurfaceNeedsReconfiguring +public net.minecraft.client.Minecraft surfaceIsInvalid public-f net.minecraft.client.Options keyMappings # keyMappings public net.minecraft.client.Options$FieldAccess public net.minecraft.client.OptionInstance caption From 6f7716400ee62ff8abc4729e70dce1e26d1a52be Mon Sep 17 00:00:00 2001 From: XFactHD <11262040+XFactHD@users.noreply.github.com> Date: Mon, 22 Jun 2026 01:52:08 +0200 Subject: [PATCH 3/4] Remove defunct window size copy --- .../mojang/blaze3d/platform/Window.java.patch | 29 ++++--------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/patches/com/mojang/blaze3d/platform/Window.java.patch b/patches/com/mojang/blaze3d/platform/Window.java.patch index b2e8fccac6c..cb022eb17ff 100644 --- a/patches/com/mojang/blaze3d/platform/Window.java.patch +++ b/patches/com/mojang/blaze3d/platform/Window.java.patch @@ -1,35 +1,16 @@ --- a/com/mojang/blaze3d/platform/Window.java +++ b/com/mojang/blaze3d/platform/Window.java -@@ -102,6 +_,16 @@ - this.windowedWidth = this.width = allowedWindowMinSize(displayData.width()); - this.windowedHeight = this.height = allowedWindowMinSize(displayData.height()); - this.handle = this.createWindow(backend, this.width, this.height, title, this.fullscreen && initialMonitor != null ? initialMonitor.monitor() : 0L); -+ // Neo: If the window was taken over from EarlyLoadingScreen, inherit a potentially resized window size -+ var earlyLoadingScreen = net.neoforged.fml.loading.EarlyLoadingScreenController.current(); -+ if (earlyLoadingScreen != null) { -+ var width = new int[1]; -+ var height = new int[1]; -+ GLFW.glfwGetWindowSize(this.handle, width, height); -+ // The window height and width can be 0 if minimized -+ this.width = this.windowedWidth = Math.max(width[0], 1); -+ this.height = this.windowedHeight = Math.max(height[0], 1); -+ } - this.backend = backend; - if (initialMonitor != null) { - VideoMode mode = initialMonitor.getPreferredVidMode(this.fullscreen ? this.preferredFullscreenVideoMode : Optional.empty()); @@ -237,11 +_,11 @@ } public void defaultErrorCallback(int errorCode, long description) { -- if (!RenderSystem.isOnRenderThread()) { ++ String errorString = MemoryUtil.memUTF8(description); + if (!RenderSystem.isOnRenderThread()) { - LOGGER.error("Error callback from invalid thread ({})", Thread.currentThread().getName()); -- } -- - String errorString = MemoryUtil.memUTF8(description); -+ if (!RenderSystem.isOnRenderThread()) { + LOGGER.error("Error callback from invalid thread ({}): {}: {}", Thread.currentThread().getName(), errorCode, errorString); -+ } -+ + } + +- String errorString = MemoryUtil.memUTF8(description); LOGGER.error("########## GL ERROR ##########"); LOGGER.error("@ {}", this.errorSection); LOGGER.error("{}: {}", errorCode, errorString); From 7689d98d4f32e1dacedcd7e68674f4a1050daf1b Mon Sep 17 00:00:00 2001 From: XFactHD <11262040+XFactHD@users.noreply.github.com> Date: Mon, 22 Jun 2026 01:53:14 +0200 Subject: [PATCH 4/4] Fix formatting --- .../loading/earlydisplay/Blaze3DBuffer.java | 8 ++++-- .../earlydisplay/Blaze3DBufferSlice.java | 5 ++++ .../loading/earlydisplay/Blaze3DConst.java | 10 +++++-- .../earlydisplay/Blaze3DRenderBackend.java | 28 ++++++++++--------- .../earlydisplay/Blaze3DRenderPass.java | 7 ++++- .../loading/earlydisplay/Blaze3DTexture.java | 5 ++++ 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java index 8f512bdc264..98faf04c503 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBuffer.java @@ -1,9 +1,13 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.buffers.GpuBuffer; -import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; - import java.util.Set; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; @SuppressWarnings("UnstableApiUsage") final class Blaze3DBuffer implements ELSBuffer { diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java index c43dcdae7c7..e521592de97 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DBufferSlice.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.buffers.GpuBufferSlice; diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java index e8ffc997710..6bdef3422b1 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DConst.java @@ -1,9 +1,13 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.buffers.GpuBuffer; -import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; - import java.util.Set; +import net.neoforged.fml.earlydisplay.render.backend.ELSBuffer; @SuppressWarnings("UnstableApiUsage") final class Blaze3DConst { @@ -24,5 +28,5 @@ static int elsUsageToB3D(Set usage) { return mask; } - private Blaze3DConst() { } + private Blaze3DConst() {} } diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java index f89b558032a..671e978c0a2 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderBackend.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.GpuFormat; @@ -21,6 +26,13 @@ import com.mojang.blaze3d.textures.GpuTextureView; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.logging.LogUtils; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Collection; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; import net.neoforged.fml.earlydisplay.render.ElementShader; @@ -38,14 +50,6 @@ import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Collection; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - @SuppressWarnings("UnstableApiUsage") public final class Blaze3DRenderBackend extends ELSRenderBackend { private static final Logger LOGGER = LogUtils.getLogger(); @@ -148,8 +152,7 @@ public void writeToBuffer(ELSBufferSlice buffer, ByteBuffer data) { public void copyBufferToBuffer(ELSBufferSlice source, ELSBufferSlice destination) { this.device.createCommandEncoder().copyToBuffer( ((Blaze3DBufferSlice) source).unwrap(), - ((Blaze3DBufferSlice) destination).unwrap() - ); + ((Blaze3DBufferSlice) destination).unwrap()); } @Override @@ -179,8 +182,7 @@ public boolean startFrame(FramebufferSizeListener listener) { if (width[0] != 0 || height[0] != 0) { GpuSurface.PresentMode presentMode = GpuSurface.PresentMode.getSupportedVsyncMode( - gpuSurface.supportedPresentModes(), Minecraft.getInstance().options.enableVsync().get() - ); + gpuSurface.supportedPresentModes(), Minecraft.getInstance().options.enableVsync().get()); GpuSurface.Configuration config = new GpuSurface.Configuration(width[0], height[0], presentMode); try { @@ -241,7 +243,7 @@ public void guardResourceCleanup(Runnable cleanupTask) { } @Override - public void close() { } + public void close() {} @Override public String name() { diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java index f1ba6b99982..1e18feb1f08 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DRenderPass.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.IndexType; @@ -7,7 +12,7 @@ import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPass; import net.neoforged.fml.earlydisplay.render.backend.ELSRenderPipeline; import net.neoforged.fml.earlydisplay.render.backend.ELSTexture; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @SuppressWarnings("UnstableApiUsage") final class Blaze3DRenderPass implements ELSRenderPass { diff --git a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java index 315c790bc1d..fb22d0fe36c 100644 --- a/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java +++ b/src/client/java/net/neoforged/neoforge/client/loading/earlydisplay/Blaze3DTexture.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client.loading.earlydisplay; import com.mojang.blaze3d.textures.GpuSampler;