diff --git a/Crafter.Build-Shader.cpp b/Crafter.Build-Shader.cpp index 997029b..2453bc6 100644 --- a/Crafter.Build-Shader.cpp +++ b/Crafter.Build-Shader.cpp @@ -37,67 +37,66 @@ Shader::Shader(fs::path path, std::string entrypoint, EShLanguage type): path(pa void Shader::Compile(fs::path outputDir) { if(!fs::exists((outputDir/path.filename()).replace_extension("spirv")) || fs::last_write_time(path) > fs::last_write_time((outputDir/path.filename()).replace_extension("spirv"))) { - return; + glslang::InitializeProcess(); + EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); + std::ifstream fileStream(path, std::ios::in | std::ios::binary); + if (!fileStream) { + throw std::ios_base::failure("Failed to open file: " + path.string()); + } + std::ostringstream contents; + contents << fileStream.rdbuf(); + std::string src = contents.str(); + + const char *file_name_list[1] = {""}; + const char *shader_source = reinterpret_cast(src.data()); + + glslang::TShader shader(type); + shader.setStringsWithLengthsAndNames(&shader_source, nullptr, file_name_list, 1); + shader.setEntryPoint(entrypoint.c_str()); + shader.setSourceEntryPoint(entrypoint.c_str()); + shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); + DirStackFileIncluder includeDir; + includeDir.pushExternalLocalDirectory(path.parent_path().generic_string()); + std::string info_log; + if (!shader.parse(GetDefaultResources(), 100, false, messages, includeDir)) + { + info_log = std::string(shader.getInfoLog()) + std::string(shader.getInfoDebugLog()); + } + // Add shader to new program object. + glslang::TProgram program; + program.addShader(&shader); + + // Link program. + if (!program.link(messages)) + { + info_log = std::string(program.getInfoLog()) + std::string(program.getInfoDebugLog()); + } + + // Save any info log that was generated. + if (shader.getInfoLog()) + { + info_log += std::string(shader.getInfoLog()) + std::string(shader.getInfoDebugLog()); + } + + if (program.getInfoLog()) + { + info_log += std::string(program.getInfoLog()) + std::string(program.getInfoDebugLog()); + } + + glslang::TIntermediate* intermediate = program.getIntermediate(type); + if (!intermediate) + { + info_log += "Failed to get shared intermediate code."; + } + + spv::SpvBuildLogger logger; + std::vector spirv; + std::cout << info_log; + glslang::GlslangToSpv(*intermediate, spirv, &logger); + std::cout << logger.getAllMessages(); + glslang::FinalizeProcess(); + fs::path filename = path.filename().replace_extension("spirv"); + std::ofstream file(outputDir/filename, std::ios::binary); + file.write(reinterpret_cast(spirv.data()), spirv.size() * sizeof(std::uint32_t)); } - glslang::InitializeProcess(); - EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - std::ifstream fileStream(path, std::ios::in | std::ios::binary); - if (!fileStream) { - throw std::ios_base::failure("Failed to open file: " + path.string()); - } - std::ostringstream contents; - contents << fileStream.rdbuf(); - std::string src = contents.str(); - - const char *file_name_list[1] = {""}; - const char *shader_source = reinterpret_cast(src.data()); - - glslang::TShader shader(type); - shader.setStringsWithLengthsAndNames(&shader_source, nullptr, file_name_list, 1); - shader.setEntryPoint(entrypoint.c_str()); - shader.setSourceEntryPoint(entrypoint.c_str()); - shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); - DirStackFileIncluder includeDir; - includeDir.pushExternalLocalDirectory(path.parent_path().generic_string()); - std::string info_log; - if (!shader.parse(GetDefaultResources(), 100, false, messages, includeDir)) - { - info_log = std::string(shader.getInfoLog()) + std::string(shader.getInfoDebugLog()); - } - // Add shader to new program object. - glslang::TProgram program; - program.addShader(&shader); - - // Link program. - if (!program.link(messages)) - { - info_log = std::string(program.getInfoLog()) + std::string(program.getInfoDebugLog()); - } - - // Save any info log that was generated. - if (shader.getInfoLog()) - { - info_log += std::string(shader.getInfoLog()) + std::string(shader.getInfoDebugLog()); - } - - if (program.getInfoLog()) - { - info_log += std::string(program.getInfoLog()) + std::string(program.getInfoDebugLog()); - } - - glslang::TIntermediate* intermediate = program.getIntermediate(type); - if (!intermediate) - { - info_log += "Failed to get shared intermediate code."; - } - - spv::SpvBuildLogger logger; - std::vector spirv; - std::cout << info_log; - glslang::GlslangToSpv(*intermediate, spirv, &logger); - std::cout << logger.getAllMessages(); - glslang::FinalizeProcess(); - fs::path filename = path.filename().replace_extension("spirv"); - std::ofstream file(outputDir/filename, std::ios::binary); - file.write(reinterpret_cast(spirv.data()), spirv.size() * sizeof(std::uint32_t)); }