From 8ba23ccea0387699813fd55269b908604d5fc65e Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 11 Oct 2023 12:24:00 +0100 Subject: [PATCH] Process member decorations immediately in SPIR-V editor after parse --- .../driver/shaders/spirv/spirv_editor.cpp | 2 +- .../driver/shaders/spirv/spirv_processor.cpp | 34 +++++++++++++++++-- .../driver/shaders/spirv/spirv_processor.h | 3 ++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index 9e7e9d3e6..c45a0fc9a 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -186,7 +186,7 @@ Id Editor::MakeId() { uint32_t ret = m_SPIRV[3]; m_SPIRV[3]++; - Processor::PreParse(m_SPIRV[3]); + Processor::UpdateMaxID(m_SPIRV[3]); return Id::fromWord(ret); } diff --git a/renderdoc/driver/shaders/spirv/spirv_processor.cpp b/renderdoc/driver/shaders/spirv/spirv_processor.cpp index f347d98f4..64a816956 100644 --- a/renderdoc/driver/shaders/spirv/spirv_processor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_processor.cpp @@ -498,6 +498,13 @@ void Processor::Parse(const rdcarray &spirvWords) } void Processor::PreParse(uint32_t maxId) +{ + UpdateMaxID(maxId); + + m_DeferMemberDecorations = true; +} + +void Processor::UpdateMaxID(uint32_t maxId) { decorations.resize(maxId); idOffsets.resize(maxId); @@ -806,13 +813,35 @@ void Processor::RegisterOp(Iter it) { OpMemberDecorate decoded(it); - m_MemberDecorations.push_back({decoded.structureType, decoded.member, decoded.decoration}); + if(m_DeferMemberDecorations) + { + m_MemberDecorations.push_back({decoded.structureType, decoded.member, decoded.decoration}); + } + else + { + if(decoded.member < dataTypes[decoded.structureType].children.size()) + dataTypes[decoded.structureType].children[decoded.member].decorations.Register( + decoded.decoration); + else + RDCERR("Non-deferred member decoration referenced invalid type member"); + } } else if(opdata.op == Op::MemberDecorateString) { OpMemberDecorateString decoded(it); - m_MemberDecorations.push_back({decoded.structType, decoded.member, decoded.decoration}); + if(m_DeferMemberDecorations) + { + m_MemberDecorations.push_back({decoded.structType, decoded.member, decoded.decoration}); + } + else + { + if(decoded.member < dataTypes[decoded.structType].children.size()) + dataTypes[decoded.structType].children[decoded.member].decorations.Register( + decoded.decoration); + else + RDCERR("Non-deferred member decoration referenced invalid type member"); + } } else if(opdata.op == Op::DecorationGroup || opdata.op == Op::GroupDecorate || opdata.op == Op::GroupMemberDecorate) @@ -961,6 +990,7 @@ void Processor::PostParse() dataTypes[dec.id].children[dec.member].decorations.Register(dec.dec); m_MemberDecorations.clear(); + m_DeferMemberDecorations = false; } Iter Processor::GetID(Id id) diff --git a/renderdoc/driver/shaders/spirv/spirv_processor.h b/renderdoc/driver/shaders/spirv/spirv_processor.h index ee8026107..a814087eb 100644 --- a/renderdoc/driver/shaders/spirv/spirv_processor.h +++ b/renderdoc/driver/shaders/spirv/spirv_processor.h @@ -536,6 +536,8 @@ protected: rdcarray m_SPIRV; + void UpdateMaxID(uint32_t maxId); + // before parsing - e.g. to prepare any arrays that are max-id sized virtual void PreParse(uint32_t maxId); // even though we only need UnregisterOp when editing, we declare it here for ease of organisation @@ -607,6 +609,7 @@ private: }; rdcarray m_MemberDecorations; + bool m_DeferMemberDecorations = false; }; }; // namespace rdcspv