From de8e324d32651f71ff64ceed99ece5b12a6465c3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 24 Jun 2021 14:20:24 -0700 Subject: [PATCH] Change behavior of tagged struct parsing in shaders - Explicit call to Shader#parseStructs is required before they can be read. - Fixes a startup crash on some drivers (apparently nvidia is cool with #[...], but other drivers fail) --- .../com/jozufozu/flywheel/backend/Backend.java | 3 +++ .../flywheel/backend/gl/shader/GlShader.java | 1 + .../jozufozu/flywheel/backend/loading/Shader.java | 14 +++++++------- .../flywheel/backend/loading/ShaderTemplate.java | 5 ++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/backend/Backend.java b/src/main/java/com/jozufozu/flywheel/backend/Backend.java index 8bede29e4..d92636604 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/Backend.java +++ b/src/main/java/com/jozufozu/flywheel/backend/Backend.java @@ -110,6 +110,9 @@ public class Backend { throw new IllegalStateException("Material spec '" + name + "' already registered."); } materialRegistry.put(name, spec); + + log.debug("registered material '" + name + "' with vertex size " + spec.getModelFormat().getStride() + " and instance size " + spec.getInstanceFormat().getStride()); + return spec; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java b/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java index cf8dafa5b..f026fccd3 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java +++ b/src/main/java/com/jozufozu/flywheel/backend/gl/shader/GlShader.java @@ -28,6 +28,7 @@ public class GlShader extends GlObject { Backend.log.error("Shader compilation log for " + shader.name + ": " + log); Backend.log.error(shader.printSource()); } + Backend.log.debug(shader.printSource()); if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { throw new RuntimeException("Could not compile " + shader.name + ". See log for details."); diff --git a/src/main/java/com/jozufozu/flywheel/backend/loading/Shader.java b/src/main/java/com/jozufozu/flywheel/backend/loading/Shader.java index c27f4183d..006398574 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/loading/Shader.java +++ b/src/main/java/com/jozufozu/flywheel/backend/loading/Shader.java @@ -14,7 +14,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.ShaderSources; import com.jozufozu.flywheel.backend.gl.shader.ShaderType; @@ -53,19 +52,18 @@ public class Shader { } public TaggedStruct getTag(String tag) { - checkAndParse(); + checkIfParsed(); return tag2Struct.get(tag); } public TaggedStruct getStruct(String name) { - checkAndParse(); + checkIfParsed(); return name2Struct.get(name); } - private void checkAndParse() { + private void checkIfParsed() { if (!parsed) { - parsed = true; - parseStructs(); + throw new IllegalStateException("tagged structs must be explicitly parsed before use"); } } @@ -94,7 +92,8 @@ public class Shader { structs.add(struct); - structMatcher.appendReplacement(strippedSrc, decorator.matcher(struct.source).replaceFirst("")); + String replacement = decorator.matcher(struct.source).replaceFirst(""); + structMatcher.appendReplacement(strippedSrc, replacement); tag2Struct.put(struct.tag, struct); name2Struct.put(struct.name, struct); @@ -102,6 +101,7 @@ public class Shader { structMatcher.appendTail(strippedSrc); this.source = strippedSrc.toString(); + parsed = true; } public void processIncludes() { diff --git a/src/main/java/com/jozufozu/flywheel/backend/loading/ShaderTemplate.java b/src/main/java/com/jozufozu/flywheel/backend/loading/ShaderTemplate.java index d2ed593f4..cb7bdbad0 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/loading/ShaderTemplate.java +++ b/src/main/java/com/jozufozu/flywheel/backend/loading/ShaderTemplate.java @@ -32,10 +32,9 @@ public class ShaderTemplate { } public String apply(Shader shader) { + shader.parseStructs(); - return header + - shader.getSource() + - processBody(shader); + return header + shader.getSource() + processBody(shader); } public String processBody(Shader shader) {