Add ability to add capability flags to a shader

This commit is contained in:
baldurk
2018-01-10 14:32:38 +00:00
parent e2f6cf956e
commit 6b305d7178
2 changed files with 24 additions and 0 deletions
@@ -257,6 +257,19 @@ void SPIRVEditor::AddDecoration(const SPIRVOperation &op)
addWords(decorationSection.endOffset, op.size());
}
void SPIRVEditor::AddCapability(spv::Capability cap)
{
// don't add duplicate capabilities
if(capabilities.find(cap) != capabilities.end())
return;
// insert the operation at the very start
SPIRVOperation op(spv::OpCapability, {(uint32_t)cap});
spirv.insert(spirv.begin() + FirstRealWord, op.begin(), op.end());
RegisterOp(SPIRVIterator(spirv, FirstRealWord));
addWords(FirstRealWord, op.size());
}
SPIRVId SPIRVEditor::AddType(const SPIRVOperation &op)
{
SPIRVId id = op[1];
@@ -425,6 +438,10 @@ void SPIRVEditor::RegisterOp(SPIRVIterator it)
entries.push_back(entry);
}
else if(opcode == spv::OpCapability)
{
capabilities.insert((spv::Capability)it.word(1));
}
else if(opcode == spv::OpFunction)
{
SPIRVId id = it.word(2);
@@ -553,6 +570,10 @@ void SPIRVEditor::UnregisterOp(SPIRVIterator it)
}
}
}
else if(opcode == spv::OpCapability)
{
capabilities.erase((spv::Capability)it.word(1));
}
else if(opcode == spv::OpTypeVoid || opcode == spv::OpTypeBool || opcode == spv::OpTypeInt ||
opcode == spv::OpTypeFloat)
{
@@ -26,6 +26,7 @@
#include <stdint.h>
#include <map>
#include <set>
#include <string>
#include <vector>
#include "3rdparty/glslang/SPIRV/spirv.hpp"
@@ -374,6 +375,7 @@ public:
void SetName(uint32_t id, const char *name);
void AddDecoration(const SPIRVOperation &op);
void AddCapability(spv::Capability cap);
SPIRVId AddType(const SPIRVOperation &op);
SPIRVId AddVariable(const SPIRVOperation &op);
SPIRVId AddConstant(const SPIRVOperation &op);
@@ -476,6 +478,7 @@ private:
std::vector<SPIRVEntry> entries;
std::vector<SPIRVId> functions;
std::set<spv::Capability> capabilities;
std::map<SPIRVScalar, SPIRVId> scalarTypes;
std::map<SPIRVVector, SPIRVId> vectorTypes;