Skip to content

Commit b5ba9bd

Browse files
committed
Detect vector and matrix debug types from DXIL template params
1 parent 86ff77a commit b5ba9bd

File tree

1 file changed

+92
-26
lines changed

1 file changed

+92
-26
lines changed

renderdoc/driver/shaders/dxil/dxil_debug.cpp

+92-26
Original file line numberDiff line numberDiff line change
@@ -6342,24 +6342,93 @@ const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD)
63426342
case DW_TAG_class_type:
63436343
case DW_TAG_structure_type:
63446344
{
6345-
typeData.name = *compositeType->name;
6346-
typeData.type = VarType::Struct;
63476345
typeData.sizeInBytes = (uint32_t)(compositeType->sizeInBits / 8);
63486346
typeData.alignInBytes = (uint32_t)(compositeType->alignInBits / 8);
6349-
const Metadata *elementsMD = compositeType->elements;
6350-
size_t countMembers = elementsMD->children.size();
6351-
for(size_t i = 0; i < countMembers; ++i)
6347+
6348+
bool isVector = compositeType->name->beginsWith("vector<");
6349+
bool isMatrix = !isVector && compositeType->name->beginsWith("matrix<");
6350+
6351+
if((compositeType->templateParams) && (isVector || isMatrix))
63526352
{
6353-
const Metadata *memberMD = elementsMD->children[i];
6354-
const DXIL::DIBase *memberBase = memberMD->dwarf;
6355-
RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType);
6356-
const DXIL::DIDerivedType *member = memberBase->As<DIDerivedType>();
6357-
RDCASSERTEQUAL(member->tag, DXIL::DW_TAG_member);
6358-
// const TypeData &memberType = AddDebugType(member->base);
6359-
AddDebugType(member->base);
6360-
typeData.structMembers.push_back({*member->name, member->base});
6361-
uint32_t offset = (uint32_t)member->offsetInBits / 8;
6362-
typeData.memberOffsets.push_back(offset);
6353+
const Metadata *params = compositeType->templateParams;
6354+
uint32_t countParams = (uint32_t)params->children.size();
6355+
if(isVector)
6356+
RDCASSERTEQUAL(countParams, 2);
6357+
else if(isMatrix)
6358+
RDCASSERTEQUAL(countParams, 3);
6359+
// Vector needs at least two parameters
6360+
isVector &= (countParams >= 2);
6361+
// Matrix needs at least three parameters
6362+
isMatrix &= (countParams >= 3);
6363+
}
6364+
6365+
if((compositeType->templateParams) && (isVector || isMatrix))
6366+
{
6367+
const Metadata *params = compositeType->templateParams;
6368+
{
6369+
RDCASSERTEQUAL(params->children[1]->dwarf->type, DXIL::DIBase::TemplateValueParameter);
6370+
const DITemplateValueParameter *firstDim =
6371+
params->children[1]->dwarf->As<DITemplateValueParameter>();
6372+
6373+
// don't need the template value parameter name, it should be 'element_count' or
6374+
// 'row_count', just need the value
6375+
RDCASSERT(getival<uint32_t>(firstDim->value->value, typeData.vecSize));
6376+
}
6377+
6378+
if(isMatrix)
6379+
{
6380+
RDCASSERTEQUAL(params->children[2]->dwarf->type, DXIL::DIBase::TemplateValueParameter);
6381+
const DITemplateValueParameter *secondDim =
6382+
params->children[1]->dwarf->As<DITemplateValueParameter>();
6383+
6384+
// don't need the template value parameter name, it should be 'col_count', just need the value
6385+
RDCASSERT(getival<uint32_t>(secondDim->value->value, typeData.matSize));
6386+
6387+
// for now treat all matrices as column major. This way secondDim = matSize =
6388+
// columns and we don't need to flip for matrices
6389+
typeData.colMajorMat = true;
6390+
}
6391+
6392+
RDCASSERTEQUAL(params->children[0]->dwarf->type, DXIL::DIBase::TemplateTypeParameter);
6393+
const DITemplateTypeParameter *baseType =
6394+
params->children[0]->dwarf->As<DITemplateTypeParameter>();
6395+
6396+
typeData.baseType = baseType->type;
6397+
6398+
// don't need the template type parameter name, it should be 'element', just need the base type
6399+
const TypeData &baseTypeData = AddDebugType(typeData.baseType);
6400+
6401+
typeData.type = baseTypeData.type;
6402+
6403+
if(isVector)
6404+
typeData.name =
6405+
StringFormat::Fmt("%s%u", ToStr(typeData.type).c_str(), typeData.vecSize);
6406+
else if(isMatrix)
6407+
typeData.name = StringFormat::Fmt("%s%ux%u", ToStr(typeData.type).c_str(),
6408+
typeData.vecSize, typeData.matSize);
6409+
}
6410+
else
6411+
{
6412+
typeData.name = *compositeType->name;
6413+
6414+
RDCASSERT(!isVector && !isMatrix, isVector, isMatrix, typeData.name);
6415+
6416+
typeData.type = VarType::Struct;
6417+
const Metadata *elementsMD = compositeType->elements;
6418+
size_t countMembers = elementsMD->children.size();
6419+
for(size_t i = 0; i < countMembers; ++i)
6420+
{
6421+
const Metadata *memberMD = elementsMD->children[i];
6422+
const DXIL::DIBase *memberBase = memberMD->dwarf;
6423+
RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType);
6424+
const DXIL::DIDerivedType *member = memberBase->As<DIDerivedType>();
6425+
RDCASSERTEQUAL(member->tag, DXIL::DW_TAG_member);
6426+
// const TypeData &memberType = AddDebugType(member->base);
6427+
AddDebugType(member->base);
6428+
typeData.structMembers.push_back({*member->name, member->base});
6429+
uint32_t offset = (uint32_t)member->offsetInBits / 8;
6430+
typeData.memberOffsets.push_back(offset);
6431+
}
63636432
}
63646433
break;
63656434
}
@@ -6753,12 +6822,12 @@ void Debugger::ParseDebugData()
67536822

67546823
if(typeWalk->colMajorMat)
67556824
{
6756-
rows = RDCMAX(1U, vec.vecSize);
6825+
rows = RDCMAX(1U, typeWalk->vecSize);
67576826
columns = RDCMAX(1U, typeWalk->matSize);
67586827
}
67596828
else
67606829
{
6761-
columns = RDCMAX(1U, vec.vecSize);
6830+
columns = RDCMAX(1U, typeWalk->vecSize);
67626831
rows = RDCMAX(1U, typeWalk->matSize);
67636832
}
67646833
}
@@ -6821,12 +6890,12 @@ void Debugger::ParseDebugData()
68216890
elementType = scalar.type;
68226891
if(childType->colMajorMat)
68236892
{
6824-
childRows = RDCMAX(1U, vec.vecSize);
6893+
childRows = RDCMAX(1U, childType->vecSize);
68256894
childColumns = RDCMAX(1U, childType->matSize);
68266895
}
68276896
else
68286897
{
6829-
childColumns = RDCMAX(1U, vec.vecSize);
6898+
childColumns = RDCMAX(1U, childType->vecSize);
68306899
childRows = RDCMAX(1U, childType->matSize);
68316900
}
68326901
}
@@ -6945,12 +7014,12 @@ void Debugger::ParseDebugData()
69457014
elementType = scalar.type;
69467015
if(memberType->colMajorMat)
69477016
{
6948-
memberRows = RDCMAX(1U, vec.vecSize);
7017+
memberRows = RDCMAX(1U, memberType->vecSize);
69497018
memberColumns = RDCMAX(1U, memberType->matSize);
69507019
}
69517020
else
69527021
{
6953-
memberColumns = RDCMAX(1U, vec.vecSize);
7022+
memberColumns = RDCMAX(1U, memberType->vecSize);
69547023
memberRows = RDCMAX(1U, memberType->matSize);
69557024
}
69567025
}
@@ -7000,20 +7069,17 @@ void Debugger::ParseDebugData()
70007069

70017070
if(typeWalk->colMajorMat)
70027071
{
7003-
rows = RDCMAX(1U, vec.vecSize);
7072+
rows = RDCMAX(1U, typeWalk->vecSize);
70047073
columns = RDCMAX(1U, typeWalk->matSize);
70057074
}
70067075
else
70077076
{
7008-
columns = RDCMAX(1U, vec.vecSize);
7077+
columns = RDCMAX(1U, typeWalk->vecSize);
70097078
rows = RDCMAX(1U, typeWalk->matSize);
70107079
}
70117080
usage->rows = rows;
70127081
usage->columns = columns;
70137082

7014-
RDCERR("Matrix types not handled yet %s %u %u", typeWalk->name.c_str(), byteOffset,
7015-
bytesRemaining);
7016-
70177083
if(bytesRemaining == 0)
70187084
{
70197085
// Remove mappings : this mapping covers everything

0 commit comments

Comments
 (0)