diff --git a/src/main/java/com/jozufozu/flywheel/Flywheel.java b/src/main/java/com/jozufozu/flywheel/Flywheel.java index 36d954cc3..86a3c6b9b 100644 --- a/src/main/java/com/jozufozu/flywheel/Flywheel.java +++ b/src/main/java/com/jozufozu/flywheel/Flywheel.java @@ -10,7 +10,6 @@ import com.jozufozu.flywheel.api.visualization.VisualizationManager; import com.jozufozu.flywheel.backend.Backends; import com.jozufozu.flywheel.backend.MaterialShaderIndices; import com.jozufozu.flywheel.backend.compile.FlwPrograms; -import com.jozufozu.flywheel.backend.compile.Pipelines; import com.jozufozu.flywheel.backend.engine.UniformBuffer; import com.jozufozu.flywheel.backend.engine.batching.DrawBuffer; import com.jozufozu.flywheel.config.BackendArgument; @@ -120,7 +119,6 @@ public class Flywheel { ShadersModHandler.init(); - Pipelines.init(); Backends.init(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java b/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java index 440ae600d..0563de5ac 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java @@ -104,6 +104,6 @@ public class IndirectPrograms { } private static final class Files { - public static final ResourceLocation INDIRECT_CULL = Flywheel.rl("internal/indirect_cull.glsl"); + public static final ResourceLocation INDIRECT_CULL = Flywheel.rl("internal/indirect/cull.glsl"); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/Pipeline.java b/src/main/java/com/jozufozu/flywheel/backend/compile/Pipeline.java index 6f1736424..b8839ad00 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/Pipeline.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/Pipeline.java @@ -1,5 +1,7 @@ package com.jozufozu.flywheel.backend.compile; +import java.util.Objects; + import com.jozufozu.flywheel.api.instance.InstanceType; import com.jozufozu.flywheel.api.vertex.VertexType; import com.jozufozu.flywheel.glsl.GLSLVersion; @@ -7,8 +9,8 @@ import com.jozufozu.flywheel.glsl.SourceComponent; import net.minecraft.resources.ResourceLocation; -// TODO: move shader api redefinition to a separate file? -public record Pipeline(GLSLVersion glslVersion, ResourceLocation vertexShader, ResourceLocation fragmentShader, InstanceAssembler assembler) { +public record Pipeline(GLSLVersion glslVersion, ResourceLocation vertexShader, ResourceLocation fragmentShader, + ResourceLocation vertexAPI, ResourceLocation fragmentAPI, InstanceAssembler assembler) { @FunctionalInterface public interface InstanceAssembler { /** @@ -30,6 +32,8 @@ public record Pipeline(GLSLVersion glslVersion, ResourceLocation vertexShader, R private GLSLVersion glslVersion; private ResourceLocation vertex; private ResourceLocation fragment; + private ResourceLocation vertexAPI; + private ResourceLocation fragmentAPI; private InstanceAssembler assembler; public Builder glslVersion(GLSLVersion glslVersion) { @@ -47,13 +51,29 @@ public record Pipeline(GLSLVersion glslVersion, ResourceLocation vertexShader, R return this; } + public Builder vertexAPI(ResourceLocation vertex) { + this.vertexAPI = vertex; + return this; + } + + public Builder fragmentAPI(ResourceLocation fragment) { + this.fragmentAPI = fragment; + return this; + } + public Builder assembler(InstanceAssembler assembler) { this.assembler = assembler; return this; } public Pipeline build() { - return new Pipeline(glslVersion, vertex, fragment, assembler); + Objects.requireNonNull(glslVersion); + Objects.requireNonNull(vertex); + Objects.requireNonNull(fragment); + Objects.requireNonNull(vertexAPI); + Objects.requireNonNull(fragmentAPI); + Objects.requireNonNull(assembler); + return new Pipeline(glslVersion, vertex, fragment, vertexAPI, fragmentAPI, assembler); } } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/PipelineCompiler.java b/src/main/java/com/jozufozu/flywheel/backend/compile/PipelineCompiler.java index 4737ca44d..89baf2302 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/PipelineCompiler.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/PipelineCompiler.java @@ -17,21 +17,23 @@ public class PipelineCompiler { .withComponent(uniformComponent) .withComponent(key -> pipeline.assembler() .assemble(new Pipeline.InstanceAssemblerContext(key.vertexType(), key.instanceType()))) - .withResource(pipeline.vertexShader()) + .withResource(pipeline.vertexAPI()) .withComponent(vertexMaterialComponent) .withResource(key -> key.vertexType() .layoutShader()) .withResource(key -> key.instanceType() .instanceShader()) .withResource(key -> key.contextShader() - .vertexShader())) + .vertexShader()) + .withResource(pipeline.vertexShader())) .link(PIPELINE.shader(pipeline.glslVersion(), ShaderType.FRAGMENT) .enableExtension("GL_ARB_conservative_depth") .withComponent(uniformComponent) - .withResource(pipeline.fragmentShader()) + .withResource(pipeline.fragmentAPI()) .withComponent(fragmentMaterialComponent) .withResource(key -> key.contextShader() - .fragmentShader())) + .fragmentShader()) + .withResource(pipeline.fragmentShader())) .then((key, program) -> { key.contextShader() .onProgramLink(program); diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/Pipelines.java b/src/main/java/com/jozufozu/flywheel/backend/compile/Pipelines.java index 04ad2d099..a9aa7c8e7 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/Pipelines.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/Pipelines.java @@ -5,28 +5,21 @@ import com.jozufozu.flywheel.backend.compile.component.IndirectComponent; import com.jozufozu.flywheel.backend.compile.component.InstancedArraysComponent; import com.jozufozu.flywheel.glsl.GLSLVersion; -import net.minecraft.resources.ResourceLocation; - public final class Pipelines { public static final Pipeline INSTANCED_ARRAYS = Pipeline.builder() .glslVersion(GLSLVersion.V330) - .vertex(Files.INSTANCED_ARRAYS_DRAW) - .fragment(Files.DRAW_FRAGMENT) + .vertex(Flywheel.rl("internal/instancing/draw.vert")) + .fragment(Flywheel.rl("internal/instancing/draw.frag")) + .vertexAPI(Flywheel.rl("internal/instancing/api/vertex.glsl")) + .fragmentAPI(Flywheel.rl("internal/instancing/api/fragment.glsl")) .assembler(InstancedArraysComponent::new) .build(); public static final Pipeline INDIRECT = Pipeline.builder() .glslVersion(GLSLVersion.V460) - .vertex(Files.INDIRECT_DRAW) - .fragment(Files.DRAW_FRAGMENT) + .vertex(Flywheel.rl("internal/indirect/draw.vert")) + .fragment(Flywheel.rl("internal/indirect/draw.frag")) + .vertexAPI(Flywheel.rl("internal/indirect/api/vertex.glsl")) + .fragmentAPI(Flywheel.rl("internal/indirect/api/fragment.glsl")) .assembler(IndirectComponent::create) .build(); - - public static void init() { - } - - public static final class Files { - public static final ResourceLocation INSTANCED_ARRAYS_DRAW = Flywheel.rl("internal/instanced_arrays_draw.vert"); - public static final ResourceLocation INDIRECT_DRAW = Flywheel.rl("internal/indirect_draw.vert"); - public static final ResourceLocation DRAW_FRAGMENT = Flywheel.rl("internal/draw.frag"); - } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectBuffers.java b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectBuffers.java index e7b1b8bfd..686dd17e0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectBuffers.java +++ b/src/main/java/com/jozufozu/flywheel/backend/engine/indirect/IndirectBuffers.java @@ -29,7 +29,7 @@ public class IndirectBuffers { public static final long PTR_SIZE = Pointer.POINTER_SIZE; // DRAW COMMAND - public static final long DRAW_COMMAND_STRIDE = 44; + public static final long DRAW_COMMAND_STRIDE = 48; public static final long DRAW_COMMAND_OFFSET = 0; // BITS @@ -39,6 +39,9 @@ public class IndirectBuffers { private static final int GPU_ONLY_BITS = 0; // OFFSETS + private static final long OBJECT_OFFSET = 0; + private static final long TARGET_OFFSET = INT_SIZE; + private static final long DRAW_OFFSET = INT_SIZE * 2; private static final long OFFSET_OFFSET = BUFFER_COUNT * INT_SIZE; private static final long SIZE_OFFSET = OFFSET_OFFSET + BUFFER_COUNT * PTR_SIZE; private static final long BUFFERS_SIZE_BYTES = SIZE_OFFSET + BUFFER_COUNT * PTR_SIZE; @@ -47,6 +50,18 @@ public class IndirectBuffers { private static final long TARGET_SIZE_OFFSET = OBJECT_SIZE_OFFSET + PTR_SIZE; private static final long DRAW_SIZE_OFFSET = TARGET_SIZE_OFFSET + PTR_SIZE; + /** + * A small block of memory divided into 3 contiguous segments: + *
+ * {@code buffers}: an array of {@link IndirectBuffers#INT_SIZE} buffer handles. + *
+ * {@code offsets}: an array of {@link IndirectBuffers#PTR_SIZE} offsets into the buffers, currently just zeroed. + *
+ * {@code sizes}: an array of {@link IndirectBuffers#PTR_SIZE} byte lengths of the buffers. + *
+ * Each segment stores {@link IndirectBuffers#BUFFER_COUNT} elements, + * one for the object buffer, one for the target buffer, and one for the draw buffer. + */ private final MemoryBlock buffers; private final long objectStride; private int object; @@ -70,9 +85,9 @@ public class IndirectBuffers { void createBuffers() { final long ptr = buffers.ptr(); nglCreateBuffers(BUFFER_COUNT, ptr); - object = MemoryUtil.memGetInt(ptr); - target = MemoryUtil.memGetInt(ptr + 4); - draw = MemoryUtil.memGetInt(ptr + 8); + object = MemoryUtil.memGetInt(ptr + OBJECT_OFFSET); + target = MemoryUtil.memGetInt(ptr + TARGET_OFFSET); + draw = MemoryUtil.memGetInt(ptr + DRAW_OFFSET); } void updateCounts(int objectCount, int drawCount) { @@ -102,8 +117,8 @@ public class IndirectBuffers { final long ptr = buffers.ptr(); nglCreateBuffers(BUFFER_COUNT - 1, ptr); - int objectNew = MemoryUtil.memGetInt(ptr); - int targetNew = MemoryUtil.memGetInt(ptr + 4); + int objectNew = MemoryUtil.memGetInt(ptr + OBJECT_OFFSET); + int targetNew = MemoryUtil.memGetInt(ptr + TARGET_OFFSET); glNamedBufferStorage(objectNew, objectSize, PERSISTENT_BITS); glNamedBufferStorage(targetNew, targetSize, GPU_ONLY_BITS); @@ -138,7 +153,7 @@ public class IndirectBuffers { glDeleteBuffers(draw); - MemoryUtil.memPutInt(buffers.ptr() + INT_SIZE * 2, drawNew); + MemoryUtil.memPutInt(buffers.ptr() + DRAW_OFFSET, drawNew); draw = drawNew; drawPtr = MemoryUtil.nmemRealloc(drawPtr, drawSize); } else { diff --git a/src/main/resources/assets/flywheel/flywheel/internal/draw.frag b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl similarity index 65% rename from src/main/resources/assets/flywheel/flywheel/internal/draw.frag rename to src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl index 8211e3975..707383754 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/draw.frag +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/fragment.glsl @@ -1,3 +1,6 @@ +// API +// ------------------------------------------ + in vec4 flw_vertexPos; in vec4 flw_vertexColor; in vec2 flw_vertexTexCoord; @@ -12,9 +15,6 @@ in vec4 flw_var1; in vec4 flw_var2; in vec4 flw_var3; -flat in uint _flw_materialFragmentID; -flat in uint _flw_packedMaterialProperties; - vec4 flw_sampleColor; vec4 flw_fragColor; @@ -29,8 +29,11 @@ void flw_initFragment(); void flw_materialFragment(); void flw_contextFragment(); -void main() { - flw_initFragment(); - flw_materialFragment(); - flw_contextFragment(); -} +// ------------------------------------------ +// INTERNAL +// ------------------------------------------ + +uint _flw_materialFragmentID; +uint _flw_packedMaterialProperties; + +// ------------------------------------------ diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl new file mode 100644 index 000000000..236f82666 --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/api/vertex.glsl @@ -0,0 +1,34 @@ +// API +// ------------------------------------------ + +out vec4 flw_vertexPos; +out vec4 flw_vertexColor; +out vec2 flw_vertexTexCoord; +flat out ivec2 flw_vertexOverlay; +out vec2 flw_vertexLight; +out vec3 flw_vertexNormal; + +out float flw_distance; + +out vec4 flw_var0; +out vec4 flw_var1; +out vec4 flw_var2; +out vec4 flw_var3; + +void flw_layoutVertex(); +void flw_initVertex(); +void flw_instanceVertex(FlwInstance i); +void flw_materialVertex(); +void flw_contextVertex(); + +// ------------------------------------------ +// INTERNAL +// ------------------------------------------ + +uint _flw_materialVertexID; +uint _flw_materialFragmentID; +uint _flw_packedMaterialProperties; + +FlwInstance _flw_unpackInstance(FlwPackedInstance i); + +// ------------------------------------------ diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect_cull.glsl b/src/main/resources/assets/flywheel/flywheel/internal/indirect/cull.glsl similarity index 97% rename from src/main/resources/assets/flywheel/flywheel/internal/indirect_cull.glsl rename to src/main/resources/assets/flywheel/flywheel/internal/indirect/cull.glsl index a7eb47433..a9f7e2ca2 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect_cull.glsl +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/cull.glsl @@ -1,6 +1,6 @@ layout(local_size_x = FLW_SUBGROUP_SIZE) in; -#include "flywheel:internal/indirect_draw_command.glsl" +#include "flywheel:internal/indirect/mesh.glsl" // need to add stubs so the instance shader compiles. vec4 flw_vertexPos; diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag new file mode 100644 index 000000000..c1b735732 --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.frag @@ -0,0 +1,12 @@ +#include "flywheel:internal/indirect/api/fragment.glsl" + +flat in uvec2 _flw_material; + +void main() { + _flw_materialFragmentID = _flw_material.x; + _flw_packedMaterialProperties = _flw_material.y; + + flw_initFragment(); + flw_materialFragment(); + flw_contextFragment(); +} diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect_draw.vert b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert similarity index 59% rename from src/main/resources/assets/flywheel/flywheel/internal/indirect_draw.vert rename to src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert index 7401e8baa..006ee3370 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/indirect_draw.vert +++ b/src/main/resources/assets/flywheel/flywheel/internal/indirect/draw.vert @@ -1,29 +1,13 @@ -#include "flywheel:internal/indirect_draw_command.glsl" +#include "flywheel:internal/indirect/api/vertex.glsl" +#include "flywheel:internal/indirect/mesh.glsl" -out vec4 flw_vertexPos; -out vec4 flw_vertexColor; -out vec2 flw_vertexTexCoord; -flat out ivec2 flw_vertexOverlay; -out vec2 flw_vertexLight; -out vec3 flw_vertexNormal; - -out float flw_distance; - -out vec4 flw_var0; -out vec4 flw_var1; -out vec4 flw_var2; -out vec4 flw_var3; - -uint _flw_materialVertexID; -flat out uint _flw_materialFragmentID; -flat out uint _flw_packedMaterialProperties; +flat out uvec2 _flw_material; struct Object { uint batchID; FlwPackedInstance instance; }; - layout(std430, binding = 0) restrict readonly buffer ObjectBuffer { Object objects[]; }; @@ -36,14 +20,6 @@ layout(std430, binding = 2) restrict readonly buffer DrawCommands { MeshDrawCommand drawCommands[]; }; -FlwInstance _flw_unpackInstance(FlwPackedInstance i); - -void flw_layoutVertex(); -void flw_initVertex(); -void flw_instanceVertex(FlwInstance i); -void flw_materialVertex(); -void flw_contextVertex(); - void main() { uint instanceIndex = objectIDs[gl_BaseInstance + gl_InstanceID]; uint batchID = objects[instanceIndex].batchID; @@ -53,6 +29,8 @@ void main() { _flw_materialFragmentID = drawCommands[batchID].fragmentMaterialID; _flw_packedMaterialProperties = drawCommands[batchID].packedMaterialProperties; + _flw_material = uvec2(_flw_materialFragmentID, _flw_packedMaterialProperties); + flw_layoutVertex(); flw_initVertex(); flw_instanceVertex(i); diff --git a/src/main/resources/assets/flywheel/flywheel/internal/indirect_draw_command.glsl b/src/main/resources/assets/flywheel/flywheel/internal/indirect/mesh.glsl similarity index 100% rename from src/main/resources/assets/flywheel/flywheel/internal/indirect_draw_command.glsl rename to src/main/resources/assets/flywheel/flywheel/internal/indirect/mesh.glsl diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl new file mode 100644 index 000000000..796891579 --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/fragment.glsl @@ -0,0 +1,41 @@ +// API +// ----------------------------------------- +in vec4 flw_vertexPos; +in vec4 flw_vertexColor; +in vec2 flw_vertexTexCoord; +flat in ivec2 flw_vertexOverlay; +in vec2 flw_vertexLight; +in vec3 flw_vertexNormal; + +in float flw_distance; + +in vec4 flw_var0; +in vec4 flw_var1; +in vec4 flw_var2; +in vec4 flw_var3; + +vec4 flw_sampleColor; + +vec4 flw_fragColor; +ivec2 flw_fragOverlay; +vec2 flw_fragLight; + +vec4 flw_fogFilter(vec4 color); + +bool flw_discardPredicate(vec4 finalColor); + +void flw_initFragment(); +void flw_materialFragment(); +void flw_contextFragment(); + +// ----------------------------------------- +// INTERNAL +// ----------------------------------------- + +uint _flw_materialVertexID; +uint _flw_materialFragmentID; +uint _flw_packedMaterialProperties; + +uniform uvec3 _flw_material_instancing; + +// ----------------------------------------- diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instanced_arrays_draw.vert b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl similarity index 51% rename from src/main/resources/assets/flywheel/flywheel/internal/instanced_arrays_draw.vert rename to src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl index 784f043ac..5f56bf704 100644 --- a/src/main/resources/assets/flywheel/flywheel/internal/instanced_arrays_draw.vert +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/api/vertex.glsl @@ -1,3 +1,5 @@ +// API +// ------------------------------------ out vec4 flw_vertexPos; out vec4 flw_vertexColor; out vec2 flw_vertexTexCoord; @@ -12,29 +14,22 @@ out vec4 flw_var1; out vec4 flw_var2; out vec4 flw_var3; -uint _flw_materialVertexID; -flat out uint _flw_materialFragmentID; -flat out uint _flw_packedMaterialProperties; - - -uniform uvec3 _flw_material_instancing; - void flw_layoutVertex(); void flw_initVertex(); void flw_instanceVertex(FlwInstance i); void flw_materialVertex(); void flw_contextVertex(); -void main() { - _flw_materialVertexID = _flw_material_instancing.x; - _flw_materialFragmentID = _flw_material_instancing.y; - _flw_packedMaterialProperties = _flw_material_instancing.z; +// ------------------------------------ +// INTERNAL +// ------------------------------------ - FlwInstance i = _flw_unpackInstance(); +uint _flw_materialVertexID; +uint _flw_materialFragmentID; +uint _flw_packedMaterialProperties; - flw_layoutVertex(); - flw_initVertex(); - flw_instanceVertex(i); - flw_materialVertex(); - flw_contextVertex(); -} +FlwInstance _flw_unpackInstance(); + +uniform uvec3 _flw_material_instancing; + +// ------------------------------------ diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag new file mode 100644 index 000000000..0432299f3 --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.frag @@ -0,0 +1,11 @@ +#include "flywheel:internal/instancing/api/fragment.glsl" + +void main() { + _flw_materialVertexID = _flw_material_instancing.x; + _flw_materialFragmentID = _flw_material_instancing.y; + _flw_packedMaterialProperties = _flw_material_instancing.z; + + flw_initFragment(); + flw_materialFragment(); + flw_contextFragment(); +} diff --git a/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert new file mode 100644 index 000000000..21923825e --- /dev/null +++ b/src/main/resources/assets/flywheel/flywheel/internal/instancing/draw.vert @@ -0,0 +1,15 @@ +#include "flywheel:internal/instancing/api/vertex.glsl" + +void main() { + _flw_materialVertexID = _flw_material_instancing.x; + _flw_materialFragmentID = _flw_material_instancing.y; + _flw_packedMaterialProperties = _flw_material_instancing.z; + + FlwInstance i = _flw_unpackInstance(); + + flw_layoutVertex(); + flw_initVertex(); + flw_instanceVertex(i); + flw_materialVertex(); + flw_contextVertex(); +}