diff --git a/modules/shader_compiler/src/vkcv/shader/GLSLCompiler.cpp b/modules/shader_compiler/src/vkcv/shader/GLSLCompiler.cpp index b8cf72100445549dd59970f41941996f2bd970ce..341e219fdbbe3ea815925e295069b8a719aca8a4 100644 --- a/modules/shader_compiler/src/vkcv/shader/GLSLCompiler.cpp +++ b/modules/shader_compiler/src/vkcv/shader/GLSLCompiler.cpp @@ -212,8 +212,30 @@ namespace vkcv::shader { glslang::TShader shader (language); glslang::TProgram program; + std::string source (shaderSource); + + std::strstream defines; + for (const auto& define : m_defines) { + defines << "#define " << define.first << " " << define.second << std::endl; + } + + defines << '\0'; + + size_t pos = source.find("#version") + 8; + if (pos >= source.length()) { + pos = 0; + } + + const size_t epos = source.find_last_of("#extension", pos) + 10; + if (epos < source.length()) { + pos = epos; + } + + pos = source.find('\n', pos) + 1; + source = source.insert(pos, defines.str()); + const char *shaderStrings [1]; - shaderStrings[0] = shaderSource; + shaderStrings[0] = source.c_str(); shader.setStrings(shaderStrings, 1); @@ -224,11 +246,6 @@ namespace vkcv::shader { EShMsgSpvRules | EShMsgVulkanRules ); - - std::strstream defines; - for (const auto& define : m_defines) { - defines << "#define " << define.first << " " << define.second << std::endl; - } std::string preprocessedGLSL; @@ -243,19 +260,6 @@ namespace vkcv::shader { return false; } - size_t pos = preprocessedGLSL.find("#version") + 8; - if (pos >= preprocessedGLSL.length()) { - pos = 0; - } - - const size_t epos = preprocessedGLSL.find_last_of("#extension", pos) + 10; - if (epos < preprocessedGLSL.length()) { - pos = epos; - } - - pos = preprocessedGLSL.find('\n', pos) + 1; - preprocessedGLSL.insert(pos, defines.str(), defines.width()); - const char* preprocessedCString = preprocessedGLSL.c_str(); shader.setStrings(&preprocessedCString, 1);