diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index 9b19401c2..a2b0630a0 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -238,14 +238,14 @@ struct OpExtInstHelper rdcarray params; template - T arg(uint32_t idx) + T arg(uint32_t idx) const { return T(params[idx]); } }; template <> -inline Id OpExtInstHelper::arg(uint32_t idx) +inline Id OpExtInstHelper::arg(uint32_t idx) const { return Id::fromWord(params[idx]); } diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.h b/renderdoc/driver/shaders/spirv/spirv_debug.h index 93df298b8..d52a2543f 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.h +++ b/renderdoc/driver/shaders/spirv/spirv_debug.h @@ -434,6 +434,8 @@ private: virtual void PostParse(); virtual void RegisterOp(Iter it); + void SetDebugTypeMember(const OpShaderDbg &member, TypeData &resultType, size_t memberIndex); + template 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> deferredMembers; + SparseIdMap types; SparseIdMap scopes; SparseIdMap inlined; diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index 9376f5985..3c5a83595 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -3762,6 +3762,10 @@ void Debugger::PostParse() { Processor::PostParse(); + for(std::function &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(0)]; + memberType = member.arg(1); + memberOffset = EvaluateConstant(member.arg(5), {}).value.u32v[0]; + break; + case ShaderDbg::Function: + memberName = strings[member.arg(0)]; + memberType = member.arg(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(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(i); + ConstIter memberIt = GetID(memberId); + + if(!memberIt) { - case ShaderDbg::TypeMember: - memberName = strings[member.arg(0)]; - memberType = member.arg(1); - memberOffset = EvaluateConstant(member.arg(5), {}).value.u32v[0]; - break; - case ShaderDbg::TypeFunction: - memberName = strings[member.arg(0)]; - memberType = member.arg(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;