Skip to content
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dev.anvilcraft.lib.v2.rendering;

import dev.anvilcraft.lib.v2.rendering.event.RegisterComputePipelinesEvent;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline.ALRComputePipeline;
import net.minecraft.client.renderer.ShaderDefines;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;

@EventBusSubscriber(Dist.CLIENT)
public class ALRComputePipelines {
public static final ALRComputePipeline FFX_SPD_DOWNSAMPLE_PASS = ALRComputePipeline.builder()
.withName(AnvilLibRendering.location("ffx_spd_downsample_pass"))
.withShader(AnvilLibRendering.location("compute/ffx_spd_downsample_pass.csh"))
.withDefines(
ShaderDefines.builder()
.define("FFX_SPD_OPTION_DOWNSAMPLE_FILTER", "2") // use max for HZB
.define("FFX_SPD_OPTION_WAVE_INTEROP_LDS", ALROptions.SPD_OPTION_WAVE_INTEROP_LDS ? 0 : 1) // weird inverted
.build()
)
.withUniformBlock("cbFSR1")
.withTexture("r_input_downsample_src")
.withReadWriteImage("rw_input_downsample_src_mid_mip")
.withImageArray("rw_input_downsample_src_mips", true, true, 13)
.build();

public static final ALRComputePipeline DEPTH_CONVERT = ALRComputePipeline.builder()
.withName(AnvilLibRendering.location("depth_convert"))
.withShader(AnvilLibRendering.location("compute/depth_convert.csh"))
.withUniformBlock("ConvertParam")
.withTexture("Input")
.withWriteOnlyImage("Output")
.build();

@SubscribeEvent
public static void on(RegisterComputePipelinesEvent event) {
event.registerPipeline(FFX_SPD_DOWNSAMPLE_PASS);
event.registerPipeline(DEPTH_CONVERT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.anvilcraft.lib.v2.rendering;

import com.mojang.blaze3d.systems.RenderSystem;
import dev.anvilcraft.lib.v2.rendering.optimization.occlusion.OcclusionCuller;
import org.jspecify.annotations.Nullable;

public class ALROptimizations {
private static OcclusionCuller occlusionCuller;

@Nullable
public static OcclusionCuller getOcclusionCuller() {
if (occlusionCuller == null) {
occlusionCuller = OcclusionCuller.createInstance(RenderSystem.getDevice());
}
return occlusionCuller;
}

public static void create() {
occlusionCuller = OcclusionCuller.createInstance(RenderSystem.getDevice());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.anvilcraft.lib.v2.rendering;

public class ALROptions {
public static final boolean SPD_OPTION_WAVE_INTEROP_LDS = getPropertyBoolean("alrSpdOptionUseWaveInteropLds");


private static boolean getPropertyBoolean(String key) {
String prop = System.getProperty(key);
return !"false".equals(prop);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@

import com.mojang.blaze3d.pipeline.BlendFunction;
import com.mojang.blaze3d.pipeline.ColorTargetState;
import com.mojang.blaze3d.pipeline.DepthStencilState;
import com.mojang.blaze3d.pipeline.RenderPipeline;
import com.mojang.blaze3d.platform.CompareOp;
import com.mojang.blaze3d.shaders.UniformType;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.blaze3d.vertex.VertexFormatElement;
import dev.anvilcraft.lib.v2.rendering.bloom.TransformsUbo;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RegisterRenderPipelinesEvent;
import org.jetbrains.annotations.ApiStatus;

import java.util.Optional;

@EventBusSubscriber(Dist.CLIENT)
public class ALRPipelines {
public static final RenderPipeline.Snippet POST_PASS = RenderPipeline.builder()
Expand Down Expand Up @@ -76,6 +81,17 @@ public class ALRPipelines {
.withCull(false)
.build();

public static final RenderPipeline OCCLUSION_QUERY = RenderPipeline.builder()
.withLocation(AnvilLibRendering.location("occlusion_query"))
.withVertexFormat(DefaultVertexFormat.POSITION, VertexFormat.Mode.QUADS)
.withUniform("Transforms", UniformType.UNIFORM_BUFFER)
.withVertexShader(AnvilLibRendering.location("core/occlusion_query"))
.withFragmentShader(AnvilLibRendering.location("core/occlusion_query"))
.withColorTargetState(new ColorTargetState(Optional.empty(), ColorTargetState.WRITE_NONE))
.withDepthStencilState(new DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, false))
.withCull(true)
.build();


@ApiStatus.Internal
@SubscribeEvent
Expand All @@ -86,5 +102,7 @@ public static void on(RegisterRenderPipelinesEvent event) {
event.registerPipeline(UPSAMPLE);

event.registerPipeline(SDF_GRAPHICS);

event.registerPipeline(OCCLUSION_QUERY);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import dev.anvilcraft.lib.v2.rendering.foundation.buffers.object.ShaderBufferObjectUsage;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.ApiStatus;

@Setter
@Getter
@ApiStatus.Internal
public class BloomParametersUbo extends BufferObject<BloomParametersUbo> {

public static final BufferObjectLayoutDefinition<BloomParametersUbo> DEFINITION = BufferObjectLayoutDefinition.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import dev.anvilcraft.lib.v2.rendering.foundation.buffers.object.ShaderBufferObjectUsage;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.ApiStatus;
import org.joml.Vector2f;

@Getter
@Setter
@ApiStatus.Internal
public class BloomPipelineParametersUbo extends BufferObject<BloomPipelineParametersUbo> {

public static final BufferObjectLayoutDefinition<BloomPipelineParametersUbo> DEFINITION = BufferObjectLayoutDefinition.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import dev.anvilcraft.lib.v2.rendering.foundation.buffers.object.ShaderBufferObjectUsage;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.ApiStatus;
import org.joml.Matrix4f;

@Setter
@Getter
@ApiStatus.Internal
public class TransformsUbo extends BufferObject<TransformsUbo> {

public static final BufferObjectLayoutDefinition<TransformsUbo> DEFINITION = BufferObjectLayoutDefinition.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
import dev.anvilcraft.lib.v2.rendering.foundation.buffers.object.ShaderBufferObjectUsage;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.ApiStatus;
import org.joml.Vector2f;

@Setter
@Getter
@ApiStatus.Internal
public class BlurParametersUbo extends BufferObject<BlurParametersUbo> {

public static final BufferObjectLayoutDefinition<BlurParametersUbo> DEFINITION = BufferObjectLayoutDefinition.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.ApiStatus;
import org.joml.Matrix4fStack;
import org.joml.Vector3f;
import org.joml.Vector4f;
Expand All @@ -44,6 +45,7 @@
/**
* @author ZhuRuoLing
*/
@ApiStatus.Internal
public class CachedRenderingChunk implements VertexBufferHost {
@Getter
private final ChunkPos chunkPos;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d;

import org.jetbrains.annotations.ApiStatus;

import com.mojang.blaze3d.buffers.GpuBufferSlice;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline.ALRComputePass;
import org.jetbrains.annotations.ApiStatus;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,36 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d;

import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline.ALRComputePass;
import com.mojang.blaze3d.textures.GpuTexture;
import org.jetbrains.annotations.ApiStatus;

import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.shader.ALRComputeProgramInstance;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.shader.ALRComputeProgramInstanceKey;
import org.jetbrains.annotations.ApiStatus;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.query.GpuQueryObject;
import org.jspecify.annotations.Nullable;

import java.util.function.Supplier;

@ApiStatus.Internal
public interface ALRGpuDeviceBackendExtension {
ALRComputeProgramInstance alrCompileComputeShader(ALRComputeProgramInstanceKey instanceKey);

void alrDestroyComputeShader(ALRComputeProgramInstance instance);

void alrPushDebugGroup(String name);
void alrPushDebugGroup(Supplier<String> name);

void alrPopDebugGroup();

GpuQueryObject alrCreateSamplesQuery();

ALRHICapabilities alrhiCreateCapabilities();

GpuTexture alrCreateExtendedTexture(
@Nullable String label,
@GpuTexture.Usage int usage,
ExtendedTextureFormat format,
int width,
int height,
int depthOrLayers,
int mipLevels
);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,34 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d;

import com.mojang.blaze3d.textures.GpuTexture;
import com.mojang.blaze3d.textures.TextureFormat;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.shader.ALRComputeProgramInstance;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.shader.ALRComputeProgramInstanceKey;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.query.GpuQueryObject;
import org.jspecify.annotations.Nullable;

import java.util.function.Supplier;

public interface ALRGpuDeviceExtension {
ALRComputeProgramInstance alrCompileComputeShader(ALRComputeProgramInstanceKey instanceKey);

void alrDestroyComputeShader(ALRComputeProgramInstance instance);

GpuQueryObject alrCreateSamplesQuery();

void alrPushDebugGroup(Supplier<String> message);

void alrPopDebugGroup();

ALRHICapabilities alrhiCreateCapabilities();

GpuTexture alrCreateExtendedTexture(
@Nullable String label,
@GpuTexture.Usage int usage,
ExtendedTextureFormat format,
int width,
int height,
int depthOrLayers,
int mipLevels
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d;

import com.mojang.blaze3d.systems.RenderSystem;

public record ALRHICapabilities(
boolean compute
) {

public static ALRHICapabilities getInstance() {
return ((ALRGpuDeviceExtension) RenderSystem.getDevice()).alrhiCreateCapabilities();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d;

import net.neoforged.neoforge.internal.NonExhaustiveEnum;

@SuppressWarnings("UnstableApiUsage")
@NonExhaustiveEnum(reason = "Additional texture formats may be added")
public enum ExtendedTextureFormat {
/// Single-channel 32-bit float, GL_R32F. Depth/Hi-Z pipelines.
R32F(4),
/// Four-channel 16-bit float, GL_RGBA16F. Common HDR color target.
RGBA16F(8),
/// Four-channel 32-bit float, GL_RGBA32F
RGBA32F(16),
/// 10-bit RGB with 2-bit alpha, GL_RGB10_A2
RGB10_A2(4);

private final int pixelSize;

ExtendedTextureFormat(int pixelSize) {
this.pixelSize = pixelSize;
}

public int pixelSize() {
return this.pixelSize;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute;

import org.lwjgl.opengl.GL;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.ALRHICapabilities;

public class ALRComputeCapabilities {
private static boolean COMPUTE_SUPPORTED;

public static void init() {
COMPUTE_SUPPORTED = GL.getCapabilities().GL_ARB_compute_shader;
COMPUTE_SUPPORTED = ALRHICapabilities.getInstance().compute();
}

public static boolean isComputeSupported() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline.bindings.TextureBinding;

import java.util.List;
import java.util.function.Supplier;

public class ALRComputePass implements AutoCloseable {
private ALRComputePipeline pipeline;
Expand All @@ -16,11 +17,11 @@ public ALRComputePass(ALRComputePassBackend backend) {
this.backend = backend;
}

public void pushDebugGroup(String name) {
public void pushDebugGroup(Supplier<String> name) {
this.backend.pushDebugGroup(name);
}

public void popDebugGroup(String name) {
public void popDebugGroup() {
this.backend.popDebugGroup();
}

Expand All @@ -33,7 +34,7 @@ public void dispatchWorkgroups(
int groupCountY,
int groupCountZ
) {
this.backend.pushDebugGroup("Compute " + pipeline.identifier());
this.backend.pushDebugGroup(() -> "ALRComputePass " + pipeline.identifier());
this.backend.dispatchWorkgroups(groupCountX, groupCountY, groupCountZ);
this.backend.popDebugGroup();
}
Expand All @@ -58,12 +59,12 @@ public void setPipeline(ALRComputePipeline pipeline) {
public void bindAll(List<?> elements) {
int bindingPoint = 0;
for (ComputeBindingLayout binding : pipeline.bindings()) {
this.bind(bindingPoint++, binding, elements.get(bindingPoint - 1));
bindingPoint += this.bind(bindingPoint, binding, elements.get(bindingPoint - 1));
}
}

public <T> void bind(int bindingPoint, ComputeBindingLayout<T> layout, T resource) {
layout.apply(bindingPoint, resource, this);
public <T> int bind(int bindingPointStart, ComputeBindingLayout<T> layout, T resource) {
return layout.applyOrdered(bindingPointStart, resource, this);
}

public void bindTexture(int bindingPoint, TextureBinding.SamplerAndTexture resource) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline;

import com.mojang.blaze3d.buffers.GpuBuffer;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.textures.GpuTexture;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.MemoryBarrierFlag;
import dev.anvilcraft.lib.v2.rendering.extension.blaze3d.compute.pipeline.bindings.TextureBinding;
import org.jetbrains.annotations.ApiStatus;

import java.util.function.Supplier;

@ApiStatus.Internal
public interface ALRComputePassBackend {
void setPipeline(ALRComputePipeline pipeline);

void pushDebugGroup(String name);
void pushDebugGroup(Supplier<String> name);

void popDebugGroup();

Expand Down
Loading
Loading