diff --git a/MG/MG_GL/State/Program/ProgramState.cpp b/MG/MG_GL/State/Program/ProgramState.cpp index 6ea85b71..745772bb 100644 --- a/MG/MG_GL/State/Program/ProgramState.cpp +++ b/MG/MG_GL/State/Program/ProgramState.cpp @@ -110,7 +110,21 @@ GLenum ProgramState::FinalizeProgramPipeline(GLuint program) { std::vector> allSpirv = MG_Util::Program::CompileMultipleShadersToSPIRV(*this, prog, prog.infoLog); + if (!prog.infoLog.empty() || allSpirv.empty()) { + prog.linked = UncertainBool::False; + prog.linkStatus = GL_FALSE; + prog.infoLog = "Program linking failed during SPIR-V compilation: " + prog.infoLog; + MG_Util::Debug::LogE("MG_State: Program: FinalizeProgramPipeline error: %s", prog.infoLog.c_str()); + return GL_INVALID_OPERATION; + } + MG_Util::Program::ReflectSPIRVUniforms(allSpirv, prog, prog.infoLog); + + for (size_t i = 0; i < prog.attachedShaders.size(); ++i) { + GLuint shaderId = prog.attachedShaders[i]; + shaders_[shaderId].source = MG_Util::Program::CompileSPIRVToGLSL(allSpirv[i], 450, false, false); + } + if (!prog.infoLog.empty()) { prog.linked = UncertainBool::False; prog.linkStatus = GL_FALSE; diff --git a/MG/MG_UTIL/Program/GLSLTool.cpp b/MG/MG_UTIL/Program/GLSLTool.cpp index 1643400e..aa6d9e2a 100644 --- a/MG/MG_UTIL/Program/GLSLTool.cpp +++ b/MG/MG_UTIL/Program/GLSLTool.cpp @@ -658,6 +658,21 @@ namespace MG_Util::Program { return {}; } + std::unique_ptr resolver; + for (unsigned stage = 0; stage < EShLangCount; stage++) { + auto* pResolver = program.getGlslIoResolver((EShLanguage)stage); + if (pResolver) { + resolver = std::unique_ptr(pResolver); + break; + } + } + auto ioMapper = std::unique_ptr(glslang::GetGlslIoMapper()); + + if (!program.mapIO(resolver.get(), ioMapper.get())) { + infoLog = "Error: [glslang] Cannot mapIO:\n" + std::to_string(program.getInfoLog()); + return {}; + } + SpvOptions spvOptions; spvOptions.disableOptimizer = false;