Skip to content

Commit 01519c7

Browse files
committed
OpDebugValue handling improve offset for nested complex types
Use member offset data from DebugTypeComposite for member offsets Use type dimensions to compute offset for children Propagate the parent offset as a base for the children to offset from
1 parent 3852d21 commit 01519c7

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

renderdoc/driver/shaders/spirv/spirv_debug.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ struct TypeData
266266
Id baseType;
267267
rdcarray<uint32_t> arrayDimensions;
268268
rdcarray<rdcpair<rdcstr, Id>> structMembers;
269+
rdcarray<uint32_t> memberOffsets;
269270
};
270271

271272
struct LocalMapping

renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,6 +1768,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
17681768
uint32_t childRows = 1U;
17691769
uint32_t childColumns = 1U;
17701770
VarType elementType = childType->type;
1771+
uint32_t elementSize = 1;
17711772
if(childType->matSize != 0)
17721773
{
17731774
const TypeData &vec = m_DebugInfo.types[childType->baseType];
@@ -1795,6 +1796,11 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
17951796
childRows = 1U;
17961797
childColumns = vecColumns;
17971798
}
1799+
else if(!childType->structMembers.empty())
1800+
{
1801+
elementSize += childType->memberOffsets[childType->memberOffsets.count() - 1];
1802+
}
1803+
elementSize *= childRows * childColumns;
17981804
const uint32_t countDims = RDCMIN(arrayDimension, numIdxs);
17991805
// handle N dimensional arrays
18001806
for(uint32_t d = 0; d < countDims; ++d)
@@ -1817,7 +1823,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
18171823
usage->children[x].type = elementType;
18181824
usage->children[x].rows = childRows;
18191825
usage->children[x].columns = childColumns;
1820-
usage->children[x].offset = x;
1826+
usage->children[x].offset = usage->offset + x * elementSize;
18211827
}
18221828
}
18231829
RDCASSERTEQUAL(usage->children.size(), rows);
@@ -1851,7 +1857,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
18511857
usage->children[x].debugVar = usage->debugVar;
18521858
usage->children[x].debugVarSuffix = usage->debugVarSuffix + suffix;
18531859
usage->children[x].name = usage->name + suffix;
1854-
usage->children[x].offset = x;
1860+
usage->children[x].offset = usage->offset + typeWalk->memberOffsets[x];
18551861
uint32_t memberRows = 1U;
18561862
uint32_t memberColumns = 1U;
18571863
const TypeData *memberType = &m_DebugInfo.types[typeWalk->structMembers[x].second];
@@ -1946,7 +1952,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
19461952
usage->children[r].debugVarComponent = 0;
19471953
usage->children[r].rows = 1U;
19481954
usage->children[r].columns = columns;
1949-
usage->children[r].offset = r;
1955+
usage->children[r].offset = usage->offset + r * rows;
19501956
usage->children[r].children.resize(columns);
19511957
for(uint32_t c = 0; c < columns; ++c)
19521958
{
@@ -1958,7 +1964,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
19581964
usage->children[r].children[c].debugVarComponent = r;
19591965
usage->children[r].children[c].rows = 1U;
19601966
usage->children[r].children[c].columns = 1U;
1961-
usage->children[r].children[c].offset = c;
1967+
usage->children[r].children[c].offset = usage->children[r].offset + c;
19621968
}
19631969
}
19641970
}
@@ -2099,7 +2105,7 @@ void Debugger::FillDebugSourceVars(rdcarray<InstructionSourceInfo> &instInfo)
20992105
usage->children[x].debugVarComponent = x;
21002106
usage->children[x].rows = 1U;
21012107
usage->children[x].columns = 1U;
2102-
usage->children[x].offset = x;
2108+
usage->children[x].offset = usage->offset + x;
21032109
}
21042110
usage->emitSourceVar = false;
21052111
}
@@ -3982,6 +3988,14 @@ void Debugger::RegisterOp(Iter it)
39823988

39833989
break;
39843990
}
3991+
case ShaderDbg::TypeMember:
3992+
{
3993+
rdcstr name = strings[dbg.arg<Id>(0)];
3994+
Id type = dbg.arg<Id>(1);
3995+
uint32_t offset = EvaluateConstant(dbg.arg<Id>(4), {}).value.u32v[0];
3996+
(void)offset;
3997+
break;
3998+
}
39853999
case ShaderDbg::TypeComposite:
39864000
{
39874001
rdcstr name = strings[dbg.arg<Id>(0)];
@@ -4004,8 +4018,26 @@ void Debugger::RegisterOp(Iter it)
40044018
{
40054019
OpShaderDbg member(GetID(dbg.arg<Id>(i)));
40064020

4007-
m_DebugInfo.types[dbg.result].structMembers.push_back(
4008-
{strings[member.arg<Id>(0)], member.arg<Id>(1)});
4021+
rdcstr memberName;
4022+
Id memberType;
4023+
uint32_t memberOffset = 0;
4024+
switch(member.inst)
4025+
{
4026+
case ShaderDbg::TypeMember:
4027+
memberName = strings[member.arg<Id>(0)];
4028+
memberType = member.arg<Id>(1);
4029+
memberOffset = EvaluateConstant(member.arg<Id>(5), {}).value.u32v[0];
4030+
break;
4031+
case ShaderDbg::TypeFunction:
4032+
memberName = strings[member.arg<Id>(0)];
4033+
memberType = member.arg<Id>(1);
4034+
break;
4035+
case ShaderDbg::TypeInheritance: memberName = "Inheritence"; break;
4036+
default: RDCERR("Unhandled DebugTypeComposite entry %u", member.inst);
4037+
}
4038+
4039+
m_DebugInfo.types[dbg.result].structMembers.push_back({memberName, memberType});
4040+
m_DebugInfo.types[dbg.result].memberOffsets.push_back(memberOffset);
40094041
}
40104042

40114043
name = tagString[tag % 3] + name;

0 commit comments

Comments
 (0)