I can't think of any complex game codebase I worked on that has shaders all in one file. They all need #include support. When I try to compile our GL shaders (really Vulkan), I get the following failures. Can I use this offline compiler on real .vert and .frag files? I'm trying to figure out why Mali driver puts out VK_DEVICE_LOST on our terrain shaders, and thought seeing the shader analysis might help.
malioc -c Mali-G76 --vulkan --vertex DebugMesh.vert
ERROR: 0X0000: SPIR-V require version 310 or higher. <- fixed below
ERROR: 0:4: X0000: '#include' : required extension not requested: GL_GOOGLE_include_directive
ERROR: 0:4: X0000: '#include' : must be followed by a header name
ERROR: 0ssing entry point: X0000: Each stage requires one entry point <- printing problem
After putting #version 310 es at the top of the file. We don't typically do this, since we need to compile the shaders using spriv-opt for many different versions. There also doesn't seem to be a compile option for this.
ERROR: 0ssing entry point: X0000: Each stage requires one entry point. <- how to specify this ?
Here are the reported extensions, but include support isn't in there.
Vulkan SPIR-V Extensions
Yes, it's not very practical to keep complex shaders within a single file. However, normally include directives are resolved either at runtime, before passing the shader source to the compiler, or when using an offline compiler tool to produce a binary, such as SPIR-V.
You can pass multiple files to Mali Offline Compiler at once, but they will be just concatenated in the order you specify:
Could you try to replace #include "Shader.h" with the actual contents of the file and see if it helps?
Seems like we can hand off spv files to the compiler, and those already have everything concatenated. I need to be able to process several hundred shader variants with minimal effort, so modifying the sources isn't possible. Now I can automate it off the spv files. I couldn't tell what formats were inputs vs. outputs in the help.
Now at least we can get a little analysis on the shaders.
Compile a SPIR-V binary module.
Shouldn't the compiler tell me how many varyings a shader uses if that's critical to the 180MB limit on Mali driver? I don't see anything related to that in the output. Or is that "Work registers"?
Work registers: 30
Uniform registers: 102
Stack spilling: false
16-bit arithmetic: 0%