mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-07-08 08:40:55 +00:00
Add tracking of which extensions are in the module
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user