From e03f0c08e4339ebae02d1f48881a8dc61dbd1f22 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Jul 2019 14:20:21 +0100 Subject: [PATCH] Add ConstIter for read-only SPIR-V processing --- renderdoc/driver/shaders/spirv/spirv_common.h | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index 0fa1e783d..393dcce4f 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -54,20 +54,18 @@ private: class Operation; -class Iter +template +class IterBase { public: - // constructors - Iter() = default; - Iter(std::vector &w, size_t o) : words(&w), offset(o) {} // increment to the next op - Iter operator++(int) + IterBase operator++(int) { - Iter ret = *this; + IterBase ret = *this; operator++(); return ret; } - Iter operator++() + IterBase operator++() { do { @@ -77,18 +75,48 @@ public: return *this; } - bool operator==(const Iter &it) const = delete; - bool operator!=(const Iter &it) const = delete; - bool operator<(const Iter &it) const { return words == it.words && offset < it.offset; } + bool operator==(const IterBase &it) const = delete; + bool operator!=(const IterBase &it) const = delete; + bool operator<(const IterBase &it) const + { + return words == it.words && offset < it.offset; + } // utility functions explicit operator bool() const { return words != NULL && offset < words->size(); } - uint32_t &operator*() { return cur(); } const uint32_t &operator*() const { return cur(); } - spv::Op opcode() { return spv::Op(cur() & spv::OpCodeMask); } - uint32_t &word(size_t idx) { return words->at(offset + idx); } + spv::Op opcode() const { return spv::Op(cur() & spv::OpCodeMask); } const uint32_t &word(size_t idx) const { return words->at(offset + idx); } size_t offs() const { return offset; } size_t size() const { return cur() >> spv::WordCountShift; } +protected: + IterBase() = default; + IterBase(ConstOrNotVector &w, size_t o) : words(&w), offset(o) {} + inline const uint32_t &cur() const { return words->at(offset); } + size_t offset = 0; + ConstOrNotVector *words = NULL; +}; + +class ConstIter : public IterBase> +{ +public: + // constructors + ConstIter() = default; + ConstIter(const std::vector &w, size_t o) : IterBase>(w, o) + { + } +}; + +class Iter : public ConstIter +{ +public: + // constructors + Iter() = default; + Iter(std::vector &w, size_t o) : ConstIter(w, o) {} + // mutable utility functions + using ConstIter::operator*; + uint32_t &operator*() { return cur(); } + using ConstIter::word; + uint32_t &word(size_t idx) { return mutable_words()->at(offset + idx); } // replace part of this operation with NOPs and update the length. Cannot completely erase the // operation, or expand it void nopRemove(size_t idx, size_t count = 0); @@ -97,12 +125,10 @@ public: private: friend class Operation; - inline uint32_t &cur() { return words->at(offset); } - inline const uint32_t &cur() const { return words->at(offset); } - std::vector::iterator it() { return words->begin() + offset; } + inline uint32_t &cur() { return mutable_words()->at(offset); } + std::vector::iterator it() { return mutable_words()->begin() + offset; } std::vector::const_iterator it() const { return words->cbegin() + offset; } - size_t offset = 0; - std::vector *words = NULL; + std::vector *mutable_words() { return (std::vector *)words; } }; class Operation