mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-02-05 01:34:58 +01:00
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:
parent
f8e05d7f8a
commit
de8e324d32
4 changed files with 13 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.");
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue