Skip to content

Commit 06b13f5

Browse files
committed
Handle source variable mapping of sub-parts of matrix
single element single row or column
1 parent d76d0c3 commit 06b13f5

File tree

1 file changed

+146
-1
lines changed

1 file changed

+146
-1
lines changed

renderdoc/driver/shaders/dxil/dxil_debug.cpp

+146-1
Original file line numberDiff line numberDiff line change
@@ -7089,7 +7089,152 @@ void Debugger::ParseDebugData()
70897089
usage->rows = rows;
70907090
usage->columns = columns;
70917091

7092-
if(bytesRemaining == 0)
7092+
if(bytesRemaining > 0)
7093+
{
7094+
if(usage->children.isEmpty())
7095+
{
7096+
// Matrices are stored as [row][col]
7097+
const char swizzle[] = "xyzw";
7098+
usage->children.resize(rows);
7099+
for(uint32_t r = 0; r < rows; ++r)
7100+
{
7101+
usage->children[r].emitSourceVar = false;
7102+
usage->children[r].name = usage->name + StringFormat::Fmt(".row%u", r);
7103+
usage->children[r].type = scalar.type;
7104+
usage->children[r].debugVarSSAName = usage->debugVarSSAName;
7105+
usage->children[r].debugVarComponent = 0;
7106+
usage->children[r].rows = 1U;
7107+
usage->children[r].columns = columns;
7108+
usage->children[r].offset = usage->offset + r * rows;
7109+
usage->children[r].children.resize(columns);
7110+
for(uint32_t c = 0; c < columns; ++c)
7111+
{
7112+
usage->children[r].children[c].emitSourceVar = false;
7113+
usage->children[r].children[c].name =
7114+
usage->name + StringFormat::Fmt(".row%u.%c", r, swizzle[RDCMIN(c, 3U)]);
7115+
usage->children[r].children[c].type = scalar.type;
7116+
usage->children[r].children[c].debugVarSSAName = usage->debugVarSSAName;
7117+
usage->children[r].children[c].debugVarComponent = r;
7118+
usage->children[r].children[c].rows = 1U;
7119+
usage->children[r].children[c].columns = 1U;
7120+
usage->children[r].children[c].offset = usage->children[r].offset + c;
7121+
}
7122+
}
7123+
}
7124+
RDCASSERTEQUAL(usage->children.size(), rows);
7125+
7126+
// assigning to a single element
7127+
if(bytesRemaining == scalar.sizeInBytes)
7128+
{
7129+
bytesRemaining -= scalar.sizeInBytes;
7130+
uint32_t componentIndex = byteOffset / scalar.sizeInBytes;
7131+
uint32_t row, col;
7132+
7133+
if(typeWalk->colMajorMat)
7134+
{
7135+
col = componentIndex % columns;
7136+
row = componentIndex / columns;
7137+
}
7138+
else
7139+
{
7140+
col = componentIndex % rows;
7141+
row = componentIndex / rows;
7142+
}
7143+
RDCASSERT(row < rows, row, rows);
7144+
RDCASSERT(col < columns, col, columns);
7145+
7146+
RDCASSERTEQUAL(usage->children[row].children.size(), columns);
7147+
usage->children[row].children[col].emitSourceVar =
7148+
!usage->children[row].emitSourceVar;
7149+
usage->children[row].children[col].debugVarSSAName = mapping.debugVarSSAName;
7150+
usage->children[row].children[col].debugVarComponent = 0;
7151+
7152+
// try to recombine matrix rows to a single source var display
7153+
if(!usage->children[row].emitSourceVar)
7154+
{
7155+
bool collapseVector = true;
7156+
for(uint32_t c = 0; c < columns; ++c)
7157+
{
7158+
collapseVector = usage->children[row].children[c].emitSourceVar;
7159+
if(!collapseVector)
7160+
break;
7161+
}
7162+
if(collapseVector)
7163+
{
7164+
usage->children[row].emitSourceVar = true;
7165+
for(uint32_t c = 0; c < columns; ++c)
7166+
usage->children[row].children[c].emitSourceVar = false;
7167+
}
7168+
}
7169+
}
7170+
else
7171+
{
7172+
// assigning to a vector (row or column)
7173+
uint32_t vecSize = (typeWalk->colMajorMat) ? columns : rows;
7174+
if(bytesRemaining == scalar.sizeInBytes * vecSize)
7175+
{
7176+
uint32_t componentIndex = byteOffset / scalar.sizeInBytes;
7177+
if(typeWalk->colMajorMat)
7178+
{
7179+
uint32_t col = componentIndex % columns;
7180+
RDCASSERT(col < columns, col, columns);
7181+
// one remaining index selects a column within the matrix.
7182+
// source vars are displayed as row-major, need <rows> mappings
7183+
for(uint32_t r = 0; r < rows; ++r)
7184+
{
7185+
RDCASSERTEQUAL(usage->children[r].children.size(), columns);
7186+
usage->children[r].children[col].emitSourceVar =
7187+
!usage->children[r].emitSourceVar;
7188+
usage->children[r].children[col].debugVarSSAName = mapping.debugVarSSAName;
7189+
usage->children[r].children[col].debugVarComponent = r;
7190+
}
7191+
}
7192+
else
7193+
{
7194+
uint32_t row = componentIndex % rows;
7195+
RDCASSERT(row < rows, row, rows);
7196+
RDCASSERTEQUAL(usage->children.size(), rows);
7197+
RDCASSERTEQUAL(usage->children[row].children.size(), columns);
7198+
// one remaining index selects a row within the matrix.
7199+
// source vars are displayed as row-major, need <rows> mappings
7200+
for(uint32_t c = 0; c < columns; ++c)
7201+
{
7202+
usage->children[row].children[c].emitSourceVar =
7203+
!usage->children[row].emitSourceVar;
7204+
usage->children[row].children[c].debugVarSSAName = mapping.debugVarSSAName;
7205+
usage->children[row].children[c].debugVarComponent = c;
7206+
}
7207+
}
7208+
}
7209+
else
7210+
{
7211+
RDCERR("Unhandled matrix source variable mapping %u %u", bytesRemaining,
7212+
byteOffset);
7213+
}
7214+
}
7215+
// try to recombine matrix rows to a single source var display
7216+
for(uint32_t r = 0; r < rows; ++r)
7217+
{
7218+
if(!usage->children[r].emitSourceVar)
7219+
{
7220+
bool collapseVector = true;
7221+
RDCASSERTEQUAL(usage->children[r].children.size(), columns);
7222+
for(uint32_t c = 0; c < columns; ++c)
7223+
{
7224+
collapseVector = usage->children[r].children[c].emitSourceVar;
7225+
if(!collapseVector)
7226+
break;
7227+
}
7228+
if(collapseVector)
7229+
{
7230+
usage->children[r].emitSourceVar = true;
7231+
for(uint32_t c = 0; c < columns; ++c)
7232+
usage->children[r].children[c].emitSourceVar = false;
7233+
}
7234+
}
7235+
}
7236+
}
7237+
else
70937238
{
70947239
// Remove mappings : this mapping covers everything
70957240
usage->debugVarSSAName = mapping.debugVarSSAName;

0 commit comments

Comments
 (0)