SPV reflection: Add OpModuleProcessed for compile options.
This commit is contained in:
parent
3d1b709676
commit
2a27116cae
11 changed files with 336 additions and 40 deletions
|
|
@ -150,6 +150,54 @@ struct TXfbBuffer {
|
|||
bool containsDouble;
|
||||
};
|
||||
|
||||
// Track a set of strings describing how the module was processed.
|
||||
// Using the form:
|
||||
// process arg0 arg1 arg2 ...
|
||||
// process arg0 arg1 arg2 ...
|
||||
// where everything is textual, and there can be zero or more arguments
|
||||
class TProcesses {
|
||||
public:
|
||||
TProcesses() {}
|
||||
~TProcesses() {}
|
||||
|
||||
void addProcess(const char* process)
|
||||
{
|
||||
processes.push_back(process);
|
||||
}
|
||||
void addProcess(const std::string& process)
|
||||
{
|
||||
processes.push_back(process);
|
||||
}
|
||||
void addArgument(int arg)
|
||||
{
|
||||
processes.back().append(" ");
|
||||
std::string argString = std::to_string(arg);
|
||||
processes.back().append(argString);
|
||||
}
|
||||
void addArgument(const char* arg)
|
||||
{
|
||||
processes.back().append(" ");
|
||||
processes.back().append(arg);
|
||||
}
|
||||
void addArgument(const std::string& arg)
|
||||
{
|
||||
processes.back().append(" ");
|
||||
processes.back().append(arg);
|
||||
}
|
||||
void addIfNonZero(const char* process, int value)
|
||||
{
|
||||
if (value != 0) {
|
||||
addProcess(process);
|
||||
addArgument(value);
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<std::string>& getProcesses() const { return processes; }
|
||||
|
||||
private:
|
||||
std::vector<std::string> processes;
|
||||
};
|
||||
|
||||
class TSymbolTable;
|
||||
class TSymbol;
|
||||
class TVariable;
|
||||
|
|
@ -201,46 +249,135 @@ public:
|
|||
|
||||
void setSource(EShSource s) { source = s; }
|
||||
EShSource getSource() const { return source; }
|
||||
void setEntryPointName(const char* ep) { entryPointName = ep; }
|
||||
void setEntryPointName(const char* ep)
|
||||
{
|
||||
entryPointName = ep;
|
||||
processes.addProcess("entry-point");
|
||||
processes.addArgument(entryPointName);
|
||||
}
|
||||
void setEntryPointMangledName(const char* ep) { entryPointMangledName = ep; }
|
||||
const std::string& getEntryPointName() const { return entryPointName; }
|
||||
const std::string& getEntryPointMangledName() const { return entryPointMangledName; }
|
||||
|
||||
void setShiftSamplerBinding(unsigned int shift) { shiftSamplerBinding = shift; }
|
||||
void setShiftSamplerBinding(unsigned int shift)
|
||||
{
|
||||
shiftSamplerBinding = shift;
|
||||
processes.addIfNonZero("shift-sampler-binding", shift);
|
||||
}
|
||||
unsigned int getShiftSamplerBinding() const { return shiftSamplerBinding; }
|
||||
void setShiftTextureBinding(unsigned int shift) { shiftTextureBinding = shift; }
|
||||
void setShiftTextureBinding(unsigned int shift)
|
||||
{
|
||||
shiftTextureBinding = shift;
|
||||
processes.addIfNonZero("shift-texture-binding", shift);
|
||||
}
|
||||
unsigned int getShiftTextureBinding() const { return shiftTextureBinding; }
|
||||
void setShiftImageBinding(unsigned int shift) { shiftImageBinding = shift; }
|
||||
void setShiftImageBinding(unsigned int shift)
|
||||
{
|
||||
shiftImageBinding = shift;
|
||||
processes.addIfNonZero("shift-image-binding", shift);
|
||||
}
|
||||
unsigned int getShiftImageBinding() const { return shiftImageBinding; }
|
||||
void setShiftUboBinding(unsigned int shift) { shiftUboBinding = shift; }
|
||||
unsigned int getShiftUboBinding() const { return shiftUboBinding; }
|
||||
void setShiftSsboBinding(unsigned int shift) { shiftSsboBinding = shift; }
|
||||
unsigned int getShiftSsboBinding() const { return shiftSsboBinding; }
|
||||
void setShiftUavBinding(unsigned int shift) { shiftUavBinding = shift; }
|
||||
unsigned int getShiftUavBinding() const { return shiftUavBinding; }
|
||||
void setResourceSetBinding(const std::vector<std::string>& shift) { resourceSetBinding = shift; }
|
||||
void setShiftUboBinding(unsigned int shift)
|
||||
{
|
||||
shiftUboBinding = shift;
|
||||
processes.addIfNonZero("shift-UBO-binding", shift);
|
||||
}
|
||||
unsigned int getShiftUboBinding() const { return shiftUboBinding; }
|
||||
void setShiftSsboBinding(unsigned int shift)
|
||||
{
|
||||
shiftSsboBinding = shift;
|
||||
processes.addIfNonZero("shift-ssbo-binding", shift);
|
||||
}
|
||||
unsigned int getShiftSsboBinding() const { return shiftSsboBinding; }
|
||||
void setShiftUavBinding(unsigned int shift)
|
||||
{
|
||||
shiftUavBinding = shift;
|
||||
processes.addIfNonZero("shift-uav-binding", shift);
|
||||
}
|
||||
unsigned int getShiftUavBinding() const { return shiftUavBinding; }
|
||||
void setResourceSetBinding(const std::vector<std::string>& shift)
|
||||
{
|
||||
resourceSetBinding = shift;
|
||||
if (shift.size() > 0) {
|
||||
processes.addProcess("resource-set-binding");
|
||||
for (int s = 0; s < (int)shift.size(); ++s)
|
||||
processes.addArgument(shift[s]);
|
||||
}
|
||||
}
|
||||
const std::vector<std::string>& getResourceSetBinding() const { return resourceSetBinding; }
|
||||
void setAutoMapBindings(bool map) { autoMapBindings = map; }
|
||||
bool getAutoMapBindings() const { return autoMapBindings; }
|
||||
void setAutoMapLocations(bool map) { autoMapLocations = map; }
|
||||
bool getAutoMapLocations() const { return autoMapLocations; }
|
||||
void setFlattenUniformArrays(bool flatten) { flattenUniformArrays = flatten; }
|
||||
bool getFlattenUniformArrays() const { return flattenUniformArrays; }
|
||||
void setNoStorageFormat(bool b) { useUnknownFormat = b; }
|
||||
bool getNoStorageFormat() const { return useUnknownFormat; }
|
||||
void setHlslOffsets() { hlslOffsets = true; }
|
||||
void setAutoMapBindings(bool map)
|
||||
{
|
||||
autoMapBindings = map;
|
||||
if (autoMapBindings)
|
||||
processes.addProcess("auto-map-bindings");
|
||||
}
|
||||
bool getAutoMapBindings() const { return autoMapBindings; }
|
||||
void setAutoMapLocations(bool map)
|
||||
{
|
||||
autoMapLocations = map;
|
||||
if (autoMapLocations)
|
||||
processes.addProcess("auto-map-locations");
|
||||
}
|
||||
bool getAutoMapLocations() const { return autoMapLocations; }
|
||||
void setFlattenUniformArrays(bool flatten)
|
||||
{
|
||||
flattenUniformArrays = flatten;
|
||||
if (flattenUniformArrays)
|
||||
processes.addProcess("flatten-uniform-arrays");
|
||||
}
|
||||
bool getFlattenUniformArrays() const { return flattenUniformArrays; }
|
||||
void setNoStorageFormat(bool b)
|
||||
{
|
||||
useUnknownFormat = b;
|
||||
if (useUnknownFormat)
|
||||
processes.addProcess("no-storage-format");
|
||||
}
|
||||
bool getNoStorageFormat() const { return useUnknownFormat; }
|
||||
void setHlslOffsets()
|
||||
{
|
||||
hlslOffsets = true;
|
||||
if (hlslOffsets)
|
||||
processes.addProcess("hlsl-offsets");
|
||||
}
|
||||
bool usingHlslOFfsets() const { return hlslOffsets; }
|
||||
void setUseStorageBuffer() { useStorageBuffer = true; }
|
||||
void setUseStorageBuffer()
|
||||
{
|
||||
useStorageBuffer = true;
|
||||
processes.addProcess("use-storage-buffer");
|
||||
}
|
||||
bool usingStorageBuffer() const { return useStorageBuffer; }
|
||||
void setHlslIoMapping(bool b) { hlslIoMapping = b; }
|
||||
bool usingHlslIoMapping() { return hlslIoMapping; }
|
||||
void setHlslIoMapping(bool b)
|
||||
{
|
||||
hlslIoMapping = b;
|
||||
if (hlslIoMapping)
|
||||
processes.addProcess("hlsl-iomap");
|
||||
}
|
||||
bool usingHlslIoMapping() { return hlslIoMapping; }
|
||||
|
||||
void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { textureSamplerTransformMode = mode; }
|
||||
|
||||
void setVersion(int v) { version = v; }
|
||||
int getVersion() const { return version; }
|
||||
void setProfile(EProfile p) { profile = p; }
|
||||
EProfile getProfile() const { return profile; }
|
||||
void setSpv(const SpvVersion& s) { spvVersion = s; }
|
||||
void setSpv(const SpvVersion& s)
|
||||
{
|
||||
spvVersion = s;
|
||||
|
||||
// client processes
|
||||
if (spvVersion.vulkan > 0)
|
||||
processes.addProcess("client vulkan100");
|
||||
if (spvVersion.openGl > 0)
|
||||
processes.addProcess("client opengl100");
|
||||
|
||||
// target-environment processes
|
||||
if (spvVersion.vulkan == 100)
|
||||
processes.addProcess("target-env vulkan1.0");
|
||||
else if (spvVersion.vulkan > 0)
|
||||
processes.addProcess("target-env vulkanUnknown");
|
||||
if (spvVersion.openGl > 0)
|
||||
processes.addProcess("target-env opengl");
|
||||
}
|
||||
const SpvVersion& getSpv() const { return spvVersion; }
|
||||
EShLanguage getStage() const { return language; }
|
||||
void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
|
||||
|
|
@ -462,6 +599,13 @@ public:
|
|||
const std::string& getSourceFile() const { return sourceFile; }
|
||||
void addSourceText(const char* text) { sourceText = sourceText + text; }
|
||||
const std::string& getSourceText() const { return sourceText; }
|
||||
void addProcesses(const std::vector<std::string>& p) {
|
||||
for (int i = 0; i < (int)p.size(); ++i)
|
||||
processes.addProcess(p[i]);
|
||||
}
|
||||
void addProcess(const std::string& process) { processes.addProcess(process); }
|
||||
void addProcessArgument(const std::string& arg) { processes.addArgument(arg); }
|
||||
const std::vector<std::string>& getProcesses() const { return processes.getProcesses(); }
|
||||
|
||||
const char* const implicitThisName = "@this";
|
||||
|
||||
|
|
@ -558,6 +702,9 @@ protected:
|
|||
std::string sourceFile;
|
||||
std::string sourceText;
|
||||
|
||||
// for OpModuleProcessed, or equivalent
|
||||
TProcesses processes;
|
||||
|
||||
private:
|
||||
void operator=(TIntermediate&); // prevent assignments
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue