mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-29 21:30:53 +00:00
Process member decorations immediately in SPIR-V editor after parse
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user