diff --git a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp index d9f8e370..f98faf69 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp @@ -131,15 +131,22 @@ namespace MobileGL { const char* src[] = {sourceStr.data()}; tshader->setStrings(src, 1); tshader->setInvertY(true); - tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450); - tshader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3); - tshader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); + if (attrib.flags & ShaderCompileBits::CompileForOpenGL) { + tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientOpenGL, 450); + tshader->setEnvClient(glslang::EShClientOpenGL, glslang::EShTargetOpenGL_450); + tshader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); + } else { + tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450); + tshader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3); + tshader->setEnvTarget(glslang::EShTargetSpv, + ((attrib.flags & ShaderCompileBits::EmitDiscardAsDemote) ? glslang::EShTargetSpv_1_6 : glslang::EShTargetSpv_1_5)); + } tshader->setAutoMapLocations(true); tshader->setAutoMapBindings(true); tshader->setEnvInputVulkanRulesRelaxed(); // using EXT_vulkan_glsl_relaxed for gl_VertexID and // gl_InstanceID? tshader->setGlobalUniformBlockName(GLOBAL_UBO_NAME); - if (!tshader->parse(&GetTBuiltInResourceInstance(), 150, ECoreProfile, + if (!tshader->parse(&GetTBuiltInResourceInstance(), 460, ECoreProfile, /*forceDefaultVersionAndProfile: */ false, /*forwardCompatible: */ true, EShMsgDefault)) { ResultInfo r; diff --git a/MobileGL/MG_Util/ShaderTranspiler/Types.h b/MobileGL/MG_Util/ShaderTranspiler/Types.h index 90761a66..dc0fc2c8 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/Types.h +++ b/MobileGL/MG_Util/ShaderTranspiler/Types.h @@ -9,7 +9,8 @@ namespace MobileGL { struct EmptyType {}; enum class ShaderCompileBits : Uint { - EmitDiscardAsDemote = 1 << 0, + CompileForOpenGL = 1 << 0, + EmitDiscardAsDemote = 1 << 1, }; struct ShaderAttrib {