From cbf63dd2b637ecb8069bbce8cf5febc2d195707e Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 21 Jun 2025 19:34:13 +0800 Subject: [PATCH] [Fix] (MG_Util/Program): Allow GLSL For Vulkan to be converted into spirv. --- MG/MG_UTIL/Program/GLSLTool.cpp | 14 ++++++++------ MG/MG_UTIL/Program/GLSLTool.h | 6 ++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/MG/MG_UTIL/Program/GLSLTool.cpp b/MG/MG_UTIL/Program/GLSLTool.cpp index f63bcd98..a65dd079 100644 --- a/MG/MG_UTIL/Program/GLSLTool.cpp +++ b/MG/MG_UTIL/Program/GLSLTool.cpp @@ -592,7 +592,8 @@ namespace MG_Util::Program { } } - std::string CompileGLSLToTShader(GLenum shaderType, const std::string& source, glslang::TShader *&shader) { + std::string CompileGLSLToTShader(GLenum shaderType, const std::string& source, + glslang::TShader *&shader, bool isVkGLSL) { std::string infoLog; using namespace glslang; @@ -609,7 +610,7 @@ namespace MG_Util::Program { const char *src = source.c_str(); shader->setStrings(&src, 1); shader->setEnvInput(EShSourceGlsl, language, EShClientVulkan, glslVersion); - shader->setEnvClient(EShClientOpenGL, EShTargetOpenGL_450); + shader->setEnvClient(EShClientOpenGL, isVkGLSL ? EShTargetVulkan_1_3 : EShTargetOpenGL_450); shader->setEnvTarget(EShTargetSpv, EShTargetSpv_1_6); shader->setAutoMapLocations(true); shader->setAutoMapBindings(true); @@ -617,7 +618,7 @@ namespace MG_Util::Program { // Is InitResources() really correct? TBuiltInResource resources = InitResources(); - if (!shader->parse(&resources, glslVersion, true, EShMsgDefault)) { + if (!shader->parse(&resources, glslVersion, true, isVkGLSL ? EShMsgVulkanRules : EShMsgDefault)) { infoLog += "Error: [glslang] Cannot compile the " + GetShaderTypeName(shaderType) + ":\n" + std::to_string(shader->getInfoLog()); return infoLog; @@ -662,18 +663,19 @@ namespace MG_Util::Program { return allSpirv; } - std::vector CompileGLSLToSPIRV(GLenum shaderType, const std::string &source, std::string &infoLog) { + std::vector CompileGLSLToSPIRV(GLenum shaderType, const std::string &source, + std::string &infoLog, bool isVkGLSL) { using namespace glslang; TShader* shader = nullptr; - std::string infoLogOfShader = CompileGLSLToTShader(shaderType, source, shader); + std::string infoLogOfShader = CompileGLSLToTShader(shaderType, source, shader, isVkGLSL); if (!infoLogOfShader.empty()) { infoLog = "Error: [glslang] Cannot compile " + GetShaderTypeName(shaderType) + ":\n" + infoLogOfShader; return {}; } TProgram program; program.addShader(shader); - if (!program.link(EShMsgDefault)) { + if (!program.link(isVkGLSL ? EShMsgVulkanRules : EShMsgDefault)) { infoLog = "Error: [glslang] Cannot link the program of the single shader:\n" + std::to_string(program.getInfoLog()); return {}; } diff --git a/MG/MG_UTIL/Program/GLSLTool.h b/MG/MG_UTIL/Program/GLSLTool.h index f135f534..dbe625ae 100644 --- a/MG/MG_UTIL/Program/GLSLTool.h +++ b/MG/MG_UTIL/Program/GLSLTool.h @@ -173,8 +173,10 @@ namespace MG_Util::Program { } } - std::vector CompileGLSLToSPIRV(GLenum shaderType, const std::string& source, std::string& infoLog); - std::string CompileGLSLToTShader(GLenum shaderType, const std::string& source, glslang::TShader *&shader); + std::vector CompileGLSLToSPIRV(GLenum shaderType, const std::string& source, + std::string& infoLog, bool isVkGLSL = false); + std::string CompileGLSLToTShader(GLenum shaderType, const std::string& source, + glslang::TShader *&shader, bool isVkGLSL = false); std::vector> CompileMultipleShadersToSPIRV(const ProgramState& state, ProgramObject& prog, std::string& infoLog); void ReflectSPIRVUniforms(const std::vector>& allSpirv, ProgramObject& prog, std::string& infoLog); std::string CompileSPIRVToGLSL(std::vector spirv, uint glslVersion, bool isES);