Merge pull request #314 from mre4ce/master
Added -x option to save SPIR-V as 32-bit hexadecimal numbers to a text file.
This commit is contained in:
commit
c45dddae5f
@ -49,8 +49,10 @@ namespace spv {
|
|||||||
#include "../glslang/MachineIndependent/localintermediate.h"
|
#include "../glslang/MachineIndependent/localintermediate.h"
|
||||||
#include "../glslang/MachineIndependent/SymbolTable.h"
|
#include "../glslang/MachineIndependent/SymbolTable.h"
|
||||||
#include "../glslang/Include/Common.h"
|
#include "../glslang/Include/Common.h"
|
||||||
|
#include "../glslang/Include/revision.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
@ -4448,7 +4450,7 @@ void GetSpirvVersion(std::string& version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write SPIR-V out to a binary file
|
// Write SPIR-V out to a binary file
|
||||||
void OutputSpv(const std::vector<unsigned int>& spirv, const char* baseName)
|
void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName)
|
||||||
{
|
{
|
||||||
std::ofstream out;
|
std::ofstream out;
|
||||||
out.open(baseName, std::ios::binary | std::ios::out);
|
out.open(baseName, std::ios::binary | std::ios::out);
|
||||||
@ -4459,6 +4461,27 @@ void OutputSpv(const std::vector<unsigned int>& spirv, const char* baseName)
|
|||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write SPIR-V out to a text file with 32-bit hexadecimal words
|
||||||
|
void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName)
|
||||||
|
{
|
||||||
|
std::ofstream out;
|
||||||
|
out.open(baseName, std::ios::binary | std::ios::out);
|
||||||
|
out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl;
|
||||||
|
const int WORDS_PER_LINE = 8;
|
||||||
|
for (int i = 0; i < (int)spirv.size(); i += WORDS_PER_LINE) {
|
||||||
|
out << "\t";
|
||||||
|
for (int j = 0; j < WORDS_PER_LINE && i + j < (int)spirv.size(); ++j) {
|
||||||
|
const unsigned int word = spirv[i + j];
|
||||||
|
out << "0x" << std::hex << std::setw(8) << std::setfill('0') << word;
|
||||||
|
if (i + j + 1 < (int)spirv.size()) {
|
||||||
|
out << ",";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << std::endl;
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set up the glslang traversal
|
// Set up the glslang traversal
|
||||||
//
|
//
|
||||||
|
@ -44,6 +44,7 @@ namespace glslang {
|
|||||||
void GetSpirvVersion(std::string&);
|
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);
|
||||||
void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger);
|
void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger);
|
||||||
void OutputSpv(const std::vector<unsigned int>& spirv, const char* baseName);
|
void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);
|
||||||
|
void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,8 @@ enum TOptions {
|
|||||||
EOptionVulkanRules = 0x2000,
|
EOptionVulkanRules = 0x2000,
|
||||||
EOptionDefaultDesktop = 0x4000,
|
EOptionDefaultDesktop = 0x4000,
|
||||||
EOptionOutputPreprocessed = 0x8000,
|
EOptionOutputPreprocessed = 0x8000,
|
||||||
EOptionReadHlsl = 0x10000,
|
EOptionOutputHexadecimal = 0x10000,
|
||||||
|
EOptionReadHlsl = 0x20000,
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -302,6 +303,9 @@ void ProcessArguments(int argc, char* argv[])
|
|||||||
case 'w':
|
case 'w':
|
||||||
Options |= EOptionSuppressWarnings;
|
Options |= EOptionSuppressWarnings;
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
Options |= EOptionOutputHexadecimal;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
@ -319,7 +323,7 @@ void ProcessArguments(int argc, char* argv[])
|
|||||||
if ((Options & EOptionOutputPreprocessed) && (Options & EOptionLinkProgram))
|
if ((Options & EOptionOutputPreprocessed) && (Options & EOptionLinkProgram))
|
||||||
Error("can't use -E when linking is selected");
|
Error("can't use -E when linking is selected");
|
||||||
|
|
||||||
// -o makes no sense if there is no target binary
|
// -o or -x makes no sense if there is no target binary
|
||||||
if (binaryFileName && (Options & EOptionSpv) == 0)
|
if (binaryFileName && (Options & EOptionSpv) == 0)
|
||||||
Error("no binary generation requested (e.g., -V)");
|
Error("no binary generation requested (e.g., -V)");
|
||||||
}
|
}
|
||||||
@ -489,7 +493,11 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
|
|||||||
// memory/perf testing, as it's not internal to programmatic use.
|
// memory/perf testing, as it's not internal to programmatic use.
|
||||||
if (! (Options & EOptionMemoryLeakMode)) {
|
if (! (Options & EOptionMemoryLeakMode)) {
|
||||||
printf("%s", logger.getAllMessages().c_str());
|
printf("%s", logger.getAllMessages().c_str());
|
||||||
glslang::OutputSpv(spirv, GetBinaryName((EShLanguage)stage));
|
if (Options & EOptionOutputHexadecimal) {
|
||||||
|
glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage));
|
||||||
|
} else {
|
||||||
|
glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage));
|
||||||
|
}
|
||||||
if (Options & EOptionHumanReadableSpv) {
|
if (Options & EOptionHumanReadableSpv) {
|
||||||
spv::Disassemble(std::cout, spirv);
|
spv::Disassemble(std::cout, spirv);
|
||||||
}
|
}
|
||||||
@ -757,7 +765,6 @@ void usage()
|
|||||||
"Each option must be specified separately.\n"
|
"Each option must be specified separately.\n"
|
||||||
" -V create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
|
" -V create SPIR-V binary, under Vulkan semantics; turns on -l;\n"
|
||||||
" default file name is <stage>.spv (-o overrides this)\n"
|
" default file name is <stage>.spv (-o overrides this)\n"
|
||||||
" (unless -o is specified, which overrides the default file name)\n"
|
|
||||||
" -G create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
|
" -G create SPIR-V binary, under OpenGL semantics; turns on -l;\n"
|
||||||
" default file name is <stage>.spv (-o overrides this)\n"
|
" default file name is <stage>.spv (-o overrides this)\n"
|
||||||
" -H print human readable form of SPIR-V; turns on -V\n"
|
" -H print human readable form of SPIR-V; turns on -V\n"
|
||||||
@ -773,13 +780,14 @@ void usage()
|
|||||||
" -i intermediate tree (glslang AST) is printed out\n"
|
" -i intermediate tree (glslang AST) is printed out\n"
|
||||||
" -l link all input files together to form a single module\n"
|
" -l link all input files together to form a single module\n"
|
||||||
" -m memory leak mode\n"
|
" -m memory leak mode\n"
|
||||||
" -o <file> save binary into <file>, requires a binary option (e.g., -V)\n"
|
" -o <file> save binary to <file>, requires a binary option (e.g., -V)\n"
|
||||||
" -q dump reflection query database\n"
|
" -q dump reflection query database\n"
|
||||||
" -r relaxed semantic error-checking mode\n"
|
" -r relaxed semantic error-checking mode\n"
|
||||||
" -s silent mode\n"
|
" -s silent mode\n"
|
||||||
" -t multi-threaded mode\n"
|
" -t multi-threaded mode\n"
|
||||||
" -v print version strings\n"
|
" -v print version strings\n"
|
||||||
" -w suppress warnings (except as required by #extension : warn)\n"
|
" -w suppress warnings (except as required by #extension : warn)\n"
|
||||||
|
" -x save 32-bit hexadecimal numbers as text, requires a binary option (e.g., -V)\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
exit(EFailUsage);
|
exit(EFailUsage);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user