mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-06 06:41:05 +00:00
Handle forward referenced function members in debuginfo types
This commit is contained in:
@@ -238,14 +238,14 @@ struct OpExtInstHelper
|
||||
rdcarray<uint32_t> params;
|
||||
|
||||
template <typename T>
|
||||
T arg(uint32_t idx)
|
||||
T arg(uint32_t idx) const
|
||||
{
|
||||
return T(params[idx]);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
inline Id OpExtInstHelper::arg<Id>(uint32_t idx)
|
||||
inline Id OpExtInstHelper::arg<Id>(uint32_t idx) const
|
||||
{
|
||||
return Id::fromWord(params[idx]);
|
||||
}
|
||||
|
||||
@@ -434,6 +434,8 @@ private:
|
||||
virtual void PostParse();
|
||||
virtual void RegisterOp(Iter it);
|
||||
|
||||
void SetDebugTypeMember(const OpShaderDbg &member, TypeData &resultType, size_t memberIndex);
|
||||
|
||||
template <typename ShaderVarType, bool allocate>
|
||||
uint32_t WalkVariable(const Decorations &curDecorations, const DataType &type,
|
||||
uint64_t offsetOrLocation, ShaderVarType &var, const rdcstr &accessSuffix,
|
||||
@@ -512,6 +514,8 @@ private:
|
||||
{
|
||||
bool valid = false;
|
||||
|
||||
rdcarray<std::function<void()>> deferredMembers;
|
||||
|
||||
SparseIdMap<TypeData> types;
|
||||
SparseIdMap<ScopeData> scopes;
|
||||
SparseIdMap<InlineData> inlined;
|
||||
|
||||
@@ -3762,6 +3762,10 @@ void Debugger::PostParse()
|
||||
{
|
||||
Processor::PostParse();
|
||||
|
||||
for(std::function<void()> &f : m_DebugInfo.deferredMembers)
|
||||
f();
|
||||
m_DebugInfo.deferredMembers.clear();
|
||||
|
||||
// declare pointerTypes for all declared physical pointer types. This will match the reflection
|
||||
for(auto it = dataTypes.begin(); it != dataTypes.end(); ++it)
|
||||
{
|
||||
@@ -3814,6 +3818,31 @@ void Debugger::PostParse()
|
||||
memberNames.clear();
|
||||
}
|
||||
|
||||
void Debugger::SetDebugTypeMember(const OpShaderDbg &member, TypeData &resultType, size_t memberIndex)
|
||||
{
|
||||
rdcstr memberName;
|
||||
Id memberType;
|
||||
uint32_t memberOffset = 0;
|
||||
|
||||
switch(member.inst)
|
||||
{
|
||||
case ShaderDbg::TypeMember:
|
||||
memberName = strings[member.arg<Id>(0)];
|
||||
memberType = member.arg<Id>(1);
|
||||
memberOffset = EvaluateConstant(member.arg<Id>(5), {}).value.u32v[0];
|
||||
break;
|
||||
case ShaderDbg::Function:
|
||||
memberName = strings[member.arg<Id>(0)];
|
||||
memberType = member.arg<Id>(1);
|
||||
break;
|
||||
case ShaderDbg::TypeInheritance: memberName = "Inheritence"; break;
|
||||
default: RDCERR("Unhandled DebugTypeComposite entry %u", member.inst);
|
||||
}
|
||||
|
||||
resultType.structMembers[memberIndex] = {memberName, memberType};
|
||||
resultType.memberOffsets[memberIndex] = memberOffset;
|
||||
}
|
||||
|
||||
void Debugger::RegisterOp(Iter it)
|
||||
{
|
||||
Processor::RegisterOp(it);
|
||||
@@ -4010,30 +4039,28 @@ void Debugger::RegisterOp(Iter it)
|
||||
// ignore arg 7 size
|
||||
// ignore arg 8 flags
|
||||
|
||||
TypeData &resultType = m_DebugInfo.types[dbg.result];
|
||||
for(uint32_t i = 9; i < dbg.params.size(); i++)
|
||||
{
|
||||
OpShaderDbg member(GetID(dbg.arg<Id>(i)));
|
||||
resultType.structMembers.push_back({});
|
||||
resultType.memberOffsets.push_back(0);
|
||||
size_t memberIndex = resultType.structMembers.size() - 1;
|
||||
|
||||
rdcstr memberName;
|
||||
Id memberType;
|
||||
uint32_t memberOffset = 0;
|
||||
switch(member.inst)
|
||||
Id memberId = dbg.arg<Id>(i);
|
||||
ConstIter memberIt = GetID(memberId);
|
||||
|
||||
if(!memberIt)
|
||||
{
|
||||
case ShaderDbg::TypeMember:
|
||||
memberName = strings[member.arg<Id>(0)];
|
||||
memberType = member.arg<Id>(1);
|
||||
memberOffset = EvaluateConstant(member.arg<Id>(5), {}).value.u32v[0];
|
||||
break;
|
||||
case ShaderDbg::TypeFunction:
|
||||
memberName = strings[member.arg<Id>(0)];
|
||||
memberType = member.arg<Id>(1);
|
||||
break;
|
||||
case ShaderDbg::TypeInheritance: memberName = "Inheritence"; break;
|
||||
default: RDCERR("Unhandled DebugTypeComposite entry %u", member.inst);
|
||||
m_DebugInfo.deferredMembers.push_back(
|
||||
[this, resultId = dbg.result, memberIndex, memberId]() {
|
||||
SetDebugTypeMember(OpShaderDbg(GetID(memberId)), m_DebugInfo.types[resultId],
|
||||
memberIndex);
|
||||
});
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
m_DebugInfo.types[dbg.result].structMembers.push_back({memberName, memberType});
|
||||
m_DebugInfo.types[dbg.result].memberOffsets.push_back(memberOffset);
|
||||
SetDebugTypeMember(OpShaderDbg(memberIt), resultType, memberIndex);
|
||||
}
|
||||
|
||||
name = tagString[tag % 3] + name;
|
||||
|
||||
Reference in New Issue
Block a user