diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index 85abcce8d..f2ff16c2b 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -7451,6 +7451,57 @@ ScopedDebugData *Debugger::AddScopedDebugData(const DXIL::Metadata *scopeMD) return scope; } +void Debugger::AddStructMembers(const DXIL::DICompositeType *structTypeData, TypeData &structType) +{ + if(structTypeData->type != DXIL::DIBase::Type::CompositeType) + { + RDCERR("Invalid dwarf struct type %s", ToStr(structTypeData->type).c_str()); + return; + } + + if(structTypeData->tag != DXIL::DW_TAG_structure_type && + structTypeData->tag != DXIL::DW_TAG_class_type) + { + RDCERR("Invalid composite tag %s", ToStr(structTypeData->tag).c_str()); + return; + } + + const Metadata *elementsMD = structTypeData->elements; + size_t countMembers = elementsMD->children.size(); + for(size_t i = 0; i < countMembers; ++i) + { + const Metadata *memberMD = elementsMD->children[i]; + const DXIL::DIBase *memberBase = memberMD->dwarf; + // Ignore member functions + if(memberBase->type == DXIL::DIBase::Subprogram) + continue; + RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType); + // Ignore anything that isn't DIBase::DerivedType + if(memberBase->type != DXIL::DIBase::DerivedType) + continue; + + const DXIL::DIDerivedType *member = memberBase->As(); + if(member->tag == DXIL::DW_TAG_inheritance) + { + const Metadata *parentMD = member->base; + const DXIL::DIBase *parentBase = parentMD->dwarf; + RDCASSERTEQUAL(parentBase->type, DXIL::DIBase::Type::CompositeType); + const DICompositeType *parentType = parentBase->As(); + AddStructMembers(parentType, structType); + continue; + } + // Ignore any member tag that isn't DXIL::DW_TAG_member + if(member->tag != DXIL::DW_TAG_member) + continue; + AddDebugType(member->base); + RDCASSERT(member->name); + rdcstr memberName = member->name ? *member->name : "NULL"; + structType.structMembers.push_back({memberName, member->base}); + uint32_t offset = (uint32_t)member->offsetInBits / 8; + structType.memberOffsets.push_back(offset); + } +} + const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD) { { @@ -7643,31 +7694,7 @@ const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD) RDCASSERT(!isVector && !isMatrix, isVector, isMatrix, typeData.name); typeData.type = VarType::Struct; - const Metadata *elementsMD = compositeType->elements; - size_t countMembers = elementsMD->children.size(); - for(size_t i = 0; i < countMembers; ++i) - { - const Metadata *memberMD = elementsMD->children[i]; - const DXIL::DIBase *memberBase = memberMD->dwarf; - // Ignore member functions - if(memberBase->type == DXIL::DIBase::Subprogram) - continue; - RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType); - // Ignore anything that isn't DIBase::DerivedType - if(memberBase->type != DXIL::DIBase::DerivedType) - continue; - - const DXIL::DIDerivedType *member = memberBase->As(); - // Ignore any member tag that isn't DXIL::DW_TAG_member - if(member->tag != DXIL::DW_TAG_member) - continue; - AddDebugType(member->base); - RDCASSERT(member->name); - rdcstr memberName = member->name ? *member->name : "NULL"; - typeData.structMembers.push_back({memberName, member->base}); - uint32_t offset = (uint32_t)member->offsetInBits / 8; - typeData.memberOffsets.push_back(offset); - } + AddStructMembers(compositeType, typeData); } break; } diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.h b/renderdoc/driver/shaders/dxil/dxil_debug.h index 5448106ad..891895e60 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.h +++ b/renderdoc/driver/shaders/dxil/dxil_debug.h @@ -612,6 +612,7 @@ private: ScopedDebugData *AddScopedDebugData(const DXIL::Metadata *scopeMD); ScopedDebugData *FindScopedDebugData(const DXIL::Metadata *md) const; const TypeData &AddDebugType(const DXIL::Metadata *typeMD); + void AddStructMembers(const DXIL::DICompositeType *structTypeData, TypeData &structType); void AddLocalVariable(const DXIL::SourceMappingInfo &srcMapping, uint32_t instructionIndex); void ParseDebugData();