diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/FlwPrograms.java b/src/main/java/com/jozufozu/flywheel/backend/compile/FlwPrograms.java index 8175ffd14..b01e35f4b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/FlwPrograms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/FlwPrograms.java @@ -2,6 +2,7 @@ package com.jozufozu.flywheel.backend.compile; import java.util.List; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,26 +23,37 @@ import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; public final class FlwPrograms { - public static final Logger LOGGER = LoggerFactory.getLogger(Flywheel.ID + "/compile"); + public static final Logger LOGGER = LoggerFactory.getLogger(Flywheel.ID + "/shaders"); private FlwPrograms() { } private static void reload(ResourceManager resourceManager) { + // Reset the programs in case the ubershader load fails. + InstancingPrograms.setInstance(null); + IndirectPrograms.setInstance(null); + var sources = new ShaderSources(resourceManager); - var preLoadStats = new CompilerStats("Preload"); - var loadChecker = new SourceLoader(sources, preLoadStats); + var stats = new CompilerStats("ubershaders"); + var loadChecker = new SourceLoader(sources, stats); + + var vertexMaterialComponent = createVertexMaterialComponent(loadChecker); + var fragmentMaterialComponent = createFragmentMaterialComponent(loadChecker); + var fogComponent = createFogComponent(loadChecker); + var cutoutComponent = createCutoutComponent(loadChecker); + + if (stats.errored() || vertexMaterialComponent == null || fragmentMaterialComponent == null || fogComponent == null || cutoutComponent == null) { + // Probably means the shader sources are missing. + stats.emitErrorLog(); + return; + } + + List vertexComponents = List.of(vertexMaterialComponent); + List fragmentComponents = List.of(fragmentMaterialComponent, fogComponent, cutoutComponent); var pipelineKeys = createPipelineKeys(); - List vertexComponents = List.of(createVertexMaterialComponent(loadChecker)); - List fragmentComponents = List.of(createFragmentMaterialComponent(loadChecker), createFogComponent(loadChecker), createCutoutComponent(loadChecker)); - InstancingPrograms.reload(sources, pipelineKeys, vertexComponents, fragmentComponents); IndirectPrograms.reload(sources, pipelineKeys, vertexComponents, fragmentComponents); - - if (preLoadStats.errored()) { - preLoadStats.emitErrorLog(); - } } private static ImmutableList createPipelineKeys() { @@ -54,6 +66,7 @@ public final class FlwPrograms { return builder.build(); } + @Nullable private static UberShaderComponent createVertexMaterialComponent(SourceLoader loadChecker) { return UberShaderComponent.builder(Flywheel.rl("uber_material_vertex")) .materialSources(ShaderIndices.materialVertex() @@ -63,6 +76,7 @@ public final class FlwPrograms { .build(loadChecker); } + @Nullable private static UberShaderComponent createFragmentMaterialComponent(SourceLoader loadChecker) { return UberShaderComponent.builder(Flywheel.rl("uber_material_fragment")) .materialSources(ShaderIndices.materialFragment() @@ -72,6 +86,7 @@ public final class FlwPrograms { .build(loadChecker); } + @Nullable private static UberShaderComponent createFogComponent(SourceLoader loadChecker) { return UberShaderComponent.builder(Flywheel.rl("uber_fog")) .materialSources(ShaderIndices.fog() @@ -85,6 +100,7 @@ public final class FlwPrograms { .build(loadChecker); } + @Nullable private static UberShaderComponent createCutoutComponent(SourceLoader loadChecker) { return UberShaderComponent.builder(Flywheel.rl("uber_cutout")) .materialSources(ShaderIndices.cutout() 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 d0cc23574..b8fc8fec6 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/IndirectPrograms.java @@ -3,6 +3,7 @@ package com.jozufozu.flywheel.backend.compile; import java.util.List; import java.util.Map; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import com.google.common.collect.ImmutableList; @@ -102,7 +103,8 @@ public class IndirectPrograms extends AbstractPrograms { return builder.build(); } - private static void setInstance(@Nullable IndirectPrograms newInstance) { + @ApiStatus.Internal + public static void setInstance(@Nullable IndirectPrograms newInstance) { if (instance != null) { instance.release(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/InstancingPrograms.java b/src/main/java/com/jozufozu/flywheel/backend/compile/InstancingPrograms.java index 4af2eee68..6a6fd5397 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/InstancingPrograms.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/InstancingPrograms.java @@ -3,6 +3,7 @@ package com.jozufozu.flywheel.backend.compile; import java.util.List; import java.util.Map; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import com.google.common.collect.ImmutableList; @@ -42,7 +43,8 @@ public class InstancingPrograms extends AbstractPrograms { setInstance(newInstance); } - private static void setInstance(@Nullable InstancingPrograms newInstance) { + @ApiStatus.Internal + public static void setInstance(@Nullable InstancingPrograms newInstance) { if (instance != null) { instance.release(); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/compile/component/UberShaderComponent.java b/src/main/java/com/jozufozu/flywheel/backend/compile/component/UberShaderComponent.java index 3ec4614a7..d80a63c67 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/compile/component/UberShaderComponent.java +++ b/src/main/java/com/jozufozu/flywheel/backend/compile/component/UberShaderComponent.java @@ -108,6 +108,7 @@ public class UberShaderComponent implements SourceComponent { private final ResourceLocation name; private final List materialSources = new ArrayList<>(); private final List adaptedFunctions = new ArrayList<>(); + @Nullable private GlslExpr switchArg; public Builder(ResourceLocation name) { @@ -134,6 +135,7 @@ public class UberShaderComponent implements SourceComponent { return this; } + @Nullable public UberShaderComponent build(SourceLoader sources) { if (switchArg == null) { throw new NullPointerException("Switch argument must be set");