diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index b8886f6f0..0e6f2cb41 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -143,6 +143,10 @@ void Editor::CreateEmpty(uint32_t major, uint32_t minor) Editor::~Editor() { + for(const Operation &op : m_DeferredConstants) + AddConstant(op); + m_DeferredConstants.clear(); + m_ExternalSPIRV.clear(); m_ExternalSPIRV.reserve(m_SPIRV.size()); diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.h b/renderdoc/driver/shaders/spirv/spirv_editor.h index 954926539..6f2d28271 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.h +++ b/renderdoc/driver/shaders/spirv/spirv_editor.h @@ -210,6 +210,22 @@ public: return ret; } + template + Id AddConstantDeferred(T t) + { + Id typeId = DeclareType(scalar()); + Id retId = MakeId(); + rdcarray words = {typeId.value(), retId.value()}; + + words.resize(words.size() + (sizeof(T) + 3) / 4); + + memcpy(&words[2], &t, sizeof(T)); + + m_DeferredConstants.add(Operation(Op::Constant, words)); + + return retId; + } + private: using Processor::Parse; inline void addWords(size_t offs, size_t num) { addWords(offs, (int32_t)num); } @@ -246,6 +262,8 @@ private: template const std::map &GetTable() const; + OperationList m_DeferredConstants; + rdcarray &m_ExternalSPIRV; };