diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 0b48dfcdd530a3dbac4d65447707c80d3a93e9b8..09566c906b74a7aeb534b509ed34f2b444eb4608 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -5254,11 +5254,15 @@ void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName) } // Write SPIR-V out to a text file with 32-bit hexadecimal words -void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName) +void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName) { std::ofstream out; out.open(baseName, std::ios::binary | std::ios::out); out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl; + if (varName != nullptr) { + out << "\t #pragma once" << std::endl; + out << "const uint32_t " << varName << "[] = {" << std::endl; + } const int WORDS_PER_LINE = 8; for (int i = 0; i < (int)spirv.size(); i += WORDS_PER_LINE) { out << "\t"; @@ -5271,6 +5275,9 @@ void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName) } out << std::endl; } + if (varName != nullptr) { + out << "};"; + } out.close(); } diff --git a/SPIRV/GlslangToSpv.h b/SPIRV/GlslangToSpv.h index ceb23b5a5a9abbe84004cd0bda1c191864eab530..11e22f5888c493c3c08e79da4195a747cc041e6b 100644 --- a/SPIRV/GlslangToSpv.h +++ b/SPIRV/GlslangToSpv.h @@ -49,6 +49,6 @@ void GetSpirvVersion(std::string&); void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv); void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger); void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName); -void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName); +void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName); } diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp index d133b5948741a688d4a17ad274a0a0f6c2c31149..fb37f8f2b705e488e2a33c9459950dde041f1e3b 100644 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -163,6 +163,7 @@ const char* binaryFileName = nullptr; const char* entryPointName = nullptr; const char* sourceEntryPointName = nullptr; const char* shaderStageName = nullptr; +const char* variableName = nullptr; std::array<unsigned int, EShLangCount> baseSamplerBinding; std::array<unsigned int, EShLangCount> baseTextureBinding; @@ -302,7 +303,20 @@ void ProcessArguments(int argc, char* argv[]) } else if (lowerword == "no-storage-format" || // synonyms lowerword == "nsf") { Options |= EOptionNoStorageFormat; - } else if (lowerword == "source-entrypoint" || // synonyms + } + else if (lowerword == "variable-name" || // synonyms + lowerword == "vn") { + Options |= EOptionOutputHexadecimal; + variableName = argv[1]; + if (argc > 0) { + argc--; + argv++; + } + else + Error("no <C-variable-name> provided for --variable-name"); + break; + } + else if (lowerword == "source-entrypoint" || // synonyms lowerword == "sep") { sourceEntryPointName = argv[1]; if (argc > 0) { @@ -650,7 +664,7 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits) if (! (Options & EOptionMemoryLeakMode)) { printf("%s", logger.getAllMessages().c_str()); if (Options & EOptionOutputHexadecimal) { - glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage)); + glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage), variableName); } else { glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage)); } @@ -987,6 +1001,8 @@ void usage() "\n" " --keep-uncalled don't eliminate uncalled functions when linking\n" " --ku synonym for --keep-uncalled\n" + " --variable-name <name> Creates a C header file that contains a uint32_t array named <name> initialized with the shader binary code.\n" + " --vn <name> synonym for --variable-name <name>.\n" ); exit(EFailUsage);