From 6b305d71788d7a6a4c823864d4a9ebbc8c2e5af2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 10 Jan 2018 14:32:38 +0000 Subject: [PATCH] Add ability to add capability flags to a shader --- .../driver/shaders/spirv/spirv_editor.cpp | 21 +++++++++++++++++++ renderdoc/driver/shaders/spirv/spirv_editor.h | 3 +++ 2 files changed, 24 insertions(+) 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;