diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index 1f4efeb0e..610289b45 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -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) { diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.h b/renderdoc/driver/shaders/spirv/spirv_editor.h index 477de3d2a..beebec7c9 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.h +++ b/renderdoc/driver/shaders/spirv/spirv_editor.h @@ -26,6 +26,7 @@ #include #include +#include #include #include #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 entries; std::vector functions; + std::set capabilities; std::map scalarTypes; std::map vectorTypes;