-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
OpenGL shaders with derivatives cause fatal errors (using shader profiles higher than 1.0) #3085
Comments
The fix appears to be in shaderc.cpp, where the logic to append precision should exist much further down |
Provide shader source that has this issue. |
Any shader that uses dFdx or dFdy, for example you could try adding something like this to one of the shaders:
But there isn't much need, the issue starts at line 2373 of shaderc.cpp, where precision is injected before many other extensions. The same problems would occur with GL_EXT_shader_texture_lod, GL_OES_texture_3D and so on. |
See example 42-bunny... Type |
Did you use target profile 310_es or 320_es? It won’t occur for 100_es due to the logic surrounding precision injection in shaderc.cpp |
Target 4 will build glsl, for android gles it is:
And the parameter to shaderc would need to be -p 300_es, so in my makefile I have something like:
Which should be fine since the default for BGFX_CONFIG_RENDERER_OPENGLES_MIN_VERSION is 30. |
I'm having this same exact issue with GLES shaders while trying to get our BGFX port of Visual Pinball running on Android. (I'm testing on a Pixel 7) I quickly hacked if (usesTextureArray)
{
bx::stringPrintf(code
, "#extension GL_EXT_texture_array : enable\n"
);
}
std::istringstream stream(code);
std::string line;
std::vector<std::string> extensions;
std::vector<std::string> otherLines;
std::string versionLine;
bool versionLineFound = false;
while (std::getline(stream, line)) {
if (line.find("#version") == 0) {
versionLine = line;
versionLineFound = true;
} else if (line.find("#extension") == 0) {
extensions.push_back(line);
} else {
otherLines.push_back(line);
}
}
std::ostringstream output;
if (versionLineFound) {
output << versionLine << "\n";
}
for (const auto& ext : extensions) {
output << ext << "\n";
}
for (const auto& other : otherLines) {
output << other << "\n";
}
code = output.str();
if (glsl_profile == 100)
{ Would a nicer fix be considered for inclusion in shaderc? |
Describe the bug
Using derivatives with OpenGL ES shaders (version 3.2 on Android in this case) leads to runtime errors because extensions are being defined after other preprocessor lines.
Shader output starts:
Which leads to this fatal error:
To Reproduce
Create shader using derivatives and attempt to load.
Expected behavior
That it would not define them after other preprocessor defines.
The text was updated successfully, but these errors were encountered: