From 8fc56df0e0c40d645ae61f834448ccaa0263d727 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 8 Jan 2018 15:58:30 +0000 Subject: [PATCH] Add utility function that expands an operation in-place with new words --- .../driver/shaders/spirv/spirv_editor.cpp | 23 +++++++++++++++++++ renderdoc/driver/shaders/spirv/spirv_editor.h | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index c91859173..eef62e533 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -439,6 +439,29 @@ SPIRVId SPIRVEditor::DeclareStructType(std::vector members) AddType(SPIRVOperation(spv::OpTypeStruct, members)); return typeId; } + +void SPIRVEditor::AddWord(SPIRVIterator entry, uint32_t word) +{ + if(!entry) + return; + + // if it's just pointing at a SPIRVOperation, we can just push_back immediately + if(entry.words != &spirv) + { + entry.words->push_back(word); + return; + } + + // add word + spirv.insert(spirv.begin() + entry.offset + entry.size(), word); + + // fix up header + entry.word(0) = SPIRVOperation::MakeHeader(entry.opcode(), entry.size() + 1); + + // update offsets + addWords(entry.offset + entry.size(), 1); +} + void SPIRVEditor::addWords(size_t offs, int32_t num) { // look through every section, any that are >= this point, adjust the offsets diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.h b/renderdoc/driver/shaders/spirv/spirv_editor.h index 47b9b13fd..3cea93739 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.h +++ b/renderdoc/driver/shaders/spirv/spirv_editor.h @@ -153,7 +153,7 @@ private: std::vector::const_iterator begin() const { return iter.it(); } std::vector::const_iterator end() const { return iter.it() + size(); } - inline uint32_t MakeHeader(spv::Op op, size_t WordCount) + inline static uint32_t MakeHeader(spv::Op op, size_t WordCount) { return (uint32_t(op) & spv::OpCodeMask) | (uint16_t(WordCount) << spv::WordCountShift); } @@ -315,6 +315,8 @@ public: SPIRVId MakeId(); + void AddWord(SPIRVIterator entry, uint32_t word); + void SetName(uint32_t id, const char *name); void AddDecoration(const SPIRVOperation &op); void AddType(const SPIRVOperation &op);