Process member decorations immediately in SPIR-V editor after parse

This commit is contained in:
baldurk
2023-10-11 12:24:00 +01:00
parent 29a2925eef
commit 8ba23ccea0
3 changed files with 36 additions and 3 deletions
@@ -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);
}
@@ -498,6 +498,13 @@ void Processor::Parse(const rdcarray<uint32_t> &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)
@@ -536,6 +536,8 @@ protected:
rdcarray<uint32_t> 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<DeferredMemberDecoration> m_MemberDecorations;
bool m_DeferMemberDecorations = false;
};
}; // namespace rdcspv