@@ -7089,7 +7089,152 @@ void Debugger::ParseDebugData()
7089
7089
usage->rows = rows;
7090
7090
usage->columns = columns;
7091
7091
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
7093
7238
{
7094
7239
// Remove mappings : this mapping covers everything
7095
7240
usage->debugVarSSAName = mapping.debugVarSSAName ;
0 commit comments