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.");
}
materialRegistry.put(name, spec);
log.debug("registered material '" + name + "' with vertex size " + spec.getModelFormat().getStride() + " and instance size " + spec.getInstanceFormat().getStride());
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.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.");

View file

@ -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() {

View file

@ -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) {