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)
This commit is contained in:
JozsefA 2021-06-24 14:20:24 -07:00
parent f8e05d7f8a
commit de8e324d32
4 changed files with 13 additions and 10 deletions

View file

@ -110,6 +110,9 @@ public class Backend {
throw new IllegalStateException("Material spec '" + name + "' already registered."); throw new IllegalStateException("Material spec '" + name + "' already registered.");
} }
materialRegistry.put(name, spec); materialRegistry.put(name, spec);
log.debug("registered material '" + name + "' with vertex size " + spec.getModelFormat().getStride() + " and instance size " + spec.getInstanceFormat().getStride());
return spec; return spec;
} }

View file

@ -28,6 +28,7 @@ public class GlShader extends GlObject {
Backend.log.error("Shader compilation log for " + shader.name + ": " + log); Backend.log.error("Shader compilation log for " + shader.name + ": " + log);
Backend.log.error(shader.printSource()); Backend.log.error(shader.printSource());
} }
Backend.log.debug(shader.printSource());
if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) {
throw new RuntimeException("Could not compile " + shader.name + ". See log for details."); throw new RuntimeException("Could not compile " + shader.name + ". See log for details.");

View file

@ -14,7 +14,6 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.ShaderSources; import com.jozufozu.flywheel.backend.ShaderSources;
import com.jozufozu.flywheel.backend.gl.shader.ShaderType; import com.jozufozu.flywheel.backend.gl.shader.ShaderType;
@ -53,19 +52,18 @@ public class Shader {
} }
public TaggedStruct getTag(String tag) { public TaggedStruct getTag(String tag) {
checkAndParse(); checkIfParsed();
return tag2Struct.get(tag); return tag2Struct.get(tag);
} }
public TaggedStruct getStruct(String name) { public TaggedStruct getStruct(String name) {
checkAndParse(); checkIfParsed();
return name2Struct.get(name); return name2Struct.get(name);
} }
private void checkAndParse() { private void checkIfParsed() {
if (!parsed) { if (!parsed) {
parsed = true; throw new IllegalStateException("tagged structs must be explicitly parsed before use");
parseStructs();
} }
} }
@ -94,7 +92,8 @@ public class Shader {
structs.add(struct); 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); tag2Struct.put(struct.tag, struct);
name2Struct.put(struct.name, struct); name2Struct.put(struct.name, struct);
@ -102,6 +101,7 @@ public class Shader {
structMatcher.appendTail(strippedSrc); structMatcher.appendTail(strippedSrc);
this.source = strippedSrc.toString(); this.source = strippedSrc.toString();
parsed = true;
} }
public void processIncludes() { public void processIncludes() {

View file

@ -32,10 +32,9 @@ public class ShaderTemplate {
} }
public String apply(Shader shader) { public String apply(Shader shader) {
shader.parseStructs();
return header + return header + shader.getSource() + processBody(shader);
shader.getSource() +
processBody(shader);
} }
public String processBody(Shader shader) { public String processBody(Shader shader) {