Add tracking of which extensions are in the module

This commit is contained in:
baldurk
2018-12-20 13:32:08 +00:00
parent 36a4de8170
commit b33e5e018a
2 changed files with 36 additions and 0 deletions
@@ -373,6 +373,30 @@ void SPIRVEditor::AddCapability(spv::Capability cap)
addWords(FirstRealWord, op.size());
}
void SPIRVEditor::AddExtension(const std::string &extension)
{
// don't add duplicate extensions
if(extensions.find(extension) != extensions.end())
return;
// start at the beginning
SPIRVIterator it(spirv, FirstRealWord);
// skip past any capabilities
while(it.opcode() == spv::OpCapability)
it++;
// insert the extension instruction
size_t sz = extension.size();
std::vector<uint32_t> uintName((sz / 4) + 1);
memcpy(&uintName[0], extension.c_str(), sz);
SPIRVOperation op(spv::OpExtension, uintName);
spirv.insert(spirv.begin() + it.offset, op.begin(), op.end());
RegisterOp(it);
addWords(it.offset, op.size());
}
SPIRVId SPIRVEditor::ImportExtInst(const char *setname)
{
SPIRVId ret = extSets[setname];
@@ -578,6 +602,11 @@ void SPIRVEditor::RegisterOp(SPIRVIterator it)
{
capabilities.insert((spv::Capability)it.word(1));
}
else if(opcode == spv::OpExtension)
{
const char *name = (const char *)&it.word(1);
extensions.insert(name);
}
else if(opcode == spv::OpExtInstImport)
{
SPIRVId id = it.word(1);
@@ -716,6 +745,11 @@ void SPIRVEditor::UnregisterOp(SPIRVIterator it)
{
capabilities.erase((spv::Capability)it.word(1));
}
else if(opcode == spv::OpExtension)
{
const char *name = (const char *)&it.word(1);
extensions.erase(name);
}
else if(opcode == spv::OpExtInstImport)
{
const char *name = (const char *)&it.word(2);
@@ -384,6 +384,7 @@ public:
void SetName(uint32_t id, const char *name);
void AddDecoration(const SPIRVOperation &op);
void AddCapability(spv::Capability cap);
void AddExtension(const std::string &extension);
SPIRVId ImportExtInst(const char *setname);
SPIRVId AddType(const SPIRVOperation &op);
SPIRVId AddVariable(const SPIRVOperation &op);
@@ -487,6 +488,7 @@ private:
std::vector<SPIRVEntry> entries;
std::vector<SPIRVId> functions;
std::set<std::string> extensions;
std::set<spv::Capability> capabilities;
std::map<std::string, SPIRVId> extSets;