Skip to content

Commit 7b3e1fb

Browse files
authored
Merge pull request #23 from onlynovice/rmv_tweaks
Add some tweaks to rmv frontend
2 parents 2656c0d + 89de963 commit 7b3e1fb

29 files changed

Lines changed: 667 additions & 16 deletions

BUILD.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ cd build
4343
python3 pre_build.py
4444
```
4545
Some useful options of the pre_build.py script:
46-
* --vs <Visual Studio version>: generate the solution files for a specific Visual Studio version. For example, to target Visual Studio 2017, add --vs 2017 to the command.
47-
* --qt <path>: full path to the folder from where you would like the Qt binaries to be retrieved. By default, CMake would try to auto-detect Qt on the system.
46+
* --vs \<Visual Studio version\>: generate the solution files for a specific Visual Studio version. For example, to target Visual Studio 2017, add --vs 2017 to the command.
47+
* --qt \<QT Version\>: specify the version of QT to be used with the script (default: 6.7.0).
48+
* --qt-root \<path\>: full path to the folder from where you would like the Qt binaries to be retrieved. By default, CMake would try to auto-detect Qt on the system.
4849

4950
Once the script has finished, in the case of Visual Studio 2019, a sub-folder called 'vs2019' will be created containing the necessary build files.
5051
Go into the 'vs2019' folder (build/win/vs2019) and double click on the RMV.sln file and build the 64-bit Debug and Release builds.

source/frontend/models/compare/memory_leak_finder_model.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,16 +250,31 @@ namespace rmv
250250
UpdateLabels();
251251
}
252252

253+
void MemoryLeakFinderModel::FilterByMipLevelChanged(int min_value, int max_value)
254+
{
255+
const uint64_t scaled_min = rmv_util::CalculateThresholdFromStepValue(min_value, rmv::kMipSliderRange - 1);
256+
const uint64_t scaled_max = rmv_util::CalculateThresholdFromStepValue(max_value, rmv::kMipSliderRange - 1);
257+
258+
proxy_model_->SetMipLevelFilter(scaled_min, scaled_max);
259+
proxy_model_->invalidate();
260+
261+
UpdateLabels();
262+
}
263+
253264
void MemoryLeakFinderModel::UpdatePreferredHeapList(const QString& preferred_heap_filter)
254265
{
255266
proxy_model_->SetPreferredHeapFilter(preferred_heap_filter);
256267
proxy_model_->invalidate();
268+
269+
UpdateLabels();
257270
}
258271

259272
void MemoryLeakFinderModel::UpdateResourceUsageList(const QString& resource_usage_filter)
260273
{
261274
proxy_model_->SetResourceUsageFilter(resource_usage_filter);
262275
proxy_model_->invalidate();
276+
277+
UpdateLabels();
263278
}
264279

265280
MemoryLeakFinderProxyModel* MemoryLeakFinderModel::GetResourceProxyModel() const

source/frontend/models/compare/memory_leak_finder_model.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ namespace rmv
8484
/// @param [in] max_value Maximum value of slider span.
8585
void FilterBySizeChanged(int min_value, int max_value);
8686

87+
/// @brief Handle what happens when user changes the 'filter by mip level' slider.
88+
///
89+
/// @param [in] min_value Minimum value of slider span.
90+
/// @param [in] max_value Maximum value of slider span.
91+
void FilterByMipLevelChanged(int min_value, int max_value);
92+
8793
/// @brief Update the list of heaps selected. This is set up from the preferred heap combo box.
8894
///
8995
/// @param [in] preferred_heap_filter The regular expression string of selected heaps.

source/frontend/models/proxy_models/resource_proxy_model.cpp

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@ namespace rmv
3434
setSourceModel(model);
3535
SetFilterKeyColumns({kResourceColumnName,
3636
kResourceColumnVirtualAddress,
37+
kResourceColumnUsage,
38+
kResourceColumnDimension,
39+
kResourceColumnMipLevel,
40+
kResourceColumnFormat,
3741
kResourceColumnSize,
3842
kResourceColumnMappedInvisible,
3943
kResourceColumnMappedLocal,
4044
kResourceColumnMappedHost,
4145
kResourceColumnMappedNone,
42-
kResourceColumnPreferredHeap,
43-
kResourceColumnUsage});
46+
kResourceColumnPreferredHeap});
4447

4548
view->setModel(this);
4649
return model;
@@ -63,6 +66,11 @@ namespace rmv
6366
return false;
6467
}
6568

69+
if (FilterMipLevelSlider(source_row, kResourceColumnMipLevel, source_parent) == false)
70+
{
71+
return false;
72+
}
73+
6674
// Apply the range-based searching to the virtual address and resource size.
6775
// Only fail if the search string is outside the address range.
6876
bool found_range = false;
@@ -161,6 +169,48 @@ namespace rmv
161169
}
162170
return left_data < right_data;
163171
}
172+
else if ((left.column() == kResourceColumnDimension && right.column() == kResourceColumnDimension))
173+
{
174+
const QList<QVariant> left_data = left.data(Qt::UserRole).toList();
175+
const QList<QVariant> right_data = right.data(Qt::UserRole).toList();
176+
if (left_data == right_data)
177+
{
178+
return SortIdentical(left, right);
179+
}
180+
181+
qlonglong left_pixels = 1;
182+
qlonglong right_pixels = 1;
183+
for (const QVariant& data : left_data)
184+
{
185+
left_pixels *= data.toInt();
186+
}
187+
for (const QVariant& data : right_data)
188+
{
189+
right_pixels *= data.toInt();
190+
}
191+
192+
return left_pixels < right_pixels;
193+
}
194+
else if ((left.column() == kResourceColumnMipLevel && right.column() == kResourceColumnMipLevel))
195+
{
196+
const int left_data = left.data(Qt::UserRole).toInt();
197+
const int right_data = right.data(Qt::UserRole).toInt();
198+
if (left_data == right_data)
199+
{
200+
return SortIdentical(left, right);
201+
}
202+
return left_data < right_data;
203+
}
204+
else if ((left.column() == kResourceColumnFormat && right.column() == kResourceColumnFormat))
205+
{
206+
const QString left_data = left.data(Qt::UserRole).toString();
207+
const QString right_data = right.data(Qt::UserRole).toString();
208+
if (left_data == right_data)
209+
{
210+
return SortIdentical(left, right);
211+
}
212+
return left_data < right_data;
213+
}
164214
else if ((left.column() == kResourceColumnSize && right.column() == kResourceColumnSize))
165215
{
166216
const qulonglong left_data = left.data(Qt::UserRole).toULongLong();

source/frontend/models/proxy_models/table_proxy_model.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace rmv
1313
: QSortFilterProxyModel(parent)
1414
, min_size_(0)
1515
, max_size_(UINT64_MAX)
16+
, min_mip_level_(1)
17+
, max_mip_level_(UINT64_MAX)
1618
{
1719
}
1820

@@ -42,6 +44,12 @@ namespace rmv
4244
max_size_ = max;
4345
}
4446

47+
void TableProxyModel::SetMipLevelFilter(uint64_t min, uint64_t max)
48+
{
49+
min_mip_level_ = min;
50+
max_mip_level_ = max;
51+
}
52+
4553
uint64_t TableProxyModel::GetIndexValue(const QModelIndex& index) const
4654
{
4755
const QString data = sourceModel()->data(index).toString();
@@ -62,6 +70,19 @@ namespace rmv
6270
return out;
6371
}
6472

73+
QString TableProxyModel::GetDataAsStr(int row, int column)
74+
{
75+
QString out("null");
76+
77+
const QModelIndex model_index = index(row, column, QModelIndex());
78+
79+
if (model_index.isValid() == true)
80+
{
81+
out = data(model_index, Qt::DisplayRole).toString();
82+
}
83+
return out;
84+
}
85+
6586
QModelIndex TableProxyModel::FindModelIndex(qulonglong lookup, int column) const
6687
{
6788
QModelIndex out_model_index;
@@ -95,6 +116,14 @@ namespace rmv
95116
return !(size < min_size_ || size > max_size_);
96117
}
97118

119+
bool TableProxyModel::FilterMipLevelSlider(int row, int column, const QModelIndex& source_parent) const
120+
{
121+
const QModelIndex& mip_filter_index = sourceModel()->index(row, column, source_parent);
122+
const uint32_t mip_level = mip_filter_index.data(Qt::UserRole).toUInt();
123+
124+
return mip_level == 0 || !(mip_level < min_mip_level_ || mip_level > max_mip_level_);
125+
}
126+
98127
bool TableProxyModel::FilterSearchString(int row, const QModelIndex& source_parent) const
99128
{
100129
if (column_filters_.empty() == false && search_filter_.isEmpty() == false)

source/frontend/models/proxy_models/table_proxy_model.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ namespace rmv
4444
/// @param [in] max The maximum size.
4545
void SetSizeFilter(uint64_t min, uint64_t max);
4646

47+
/// @brief Specify range to use as mip level filter.
48+
///
49+
/// @param [in] min The minimum mip level.
50+
/// @param [in] max The maximum mip level.
51+
void SetMipLevelFilter(uint64_t min, uint64_t max);
52+
4753
/// @brief Get content from proxy model.
4854
///
4955
/// @param [in] row The row where the data is located.
@@ -52,6 +58,14 @@ namespace rmv
5258
/// @return The contents at row, column.
5359
qulonglong GetData(int row, int column);
5460

61+
/// @brief Get content from proxy model.
62+
///
63+
/// @param [in] row The row where the data is located.
64+
/// @param [in] column The column where the data is located.
65+
///
66+
/// @return The string contents at row, column.
67+
QString GetDataAsStr(int row, int column);
68+
5569
/// @brief Find a model index corresponding to the passed in data.
5670
///
5771
/// @param [in] lookup The value to find.
@@ -90,6 +104,15 @@ namespace rmv
90104
/// @return true if the table item at row,column is to be shown, false if not.
91105
bool FilterSizeSlider(int row, int column, const QModelIndex& source_parent) const;
92106

107+
/// @brief Filter the mip level slider.
108+
///
109+
/// @param [in] row The row to apply the mip level filter to.
110+
/// @param [in] column The column to apply the mip level filter to.
111+
/// @param [in] source_parent The parent model index in the source model.
112+
///
113+
/// @return true if the table item at row,column is to be shown, false if not.
114+
bool FilterMipLevelSlider(int row, int column, const QModelIndex& source_parent) const;
115+
93116
/// @brief Filter the search string.
94117
///
95118
/// @param [in] row The row to apply the size filter to.
@@ -109,6 +132,8 @@ namespace rmv
109132
QString search_filter_; ///< The current search string.
110133
uint64_t min_size_; ///< The minimum size of the size filter.
111134
uint64_t max_size_; ///< The maximum size of the size filter.
135+
uint64_t min_mip_level_; ///< The minimum size of the mip level filter.
136+
uint64_t max_mip_level_; ///< The maximum size of the mip level filter.
112137
};
113138
} // namespace rmv
114139

source/frontend/models/resource_item_model.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ namespace rmv
5353
resource_table->SetColumnWidthEms(kResourceColumnCompareId, 8);
5454
resource_table->SetColumnWidthEms(kResourceColumnName, 20);
5555
resource_table->SetColumnWidthEms(kResourceColumnVirtualAddress, 11);
56+
resource_table->SetColumnWidthEms(kResourceColumnDimension, 11);
57+
resource_table->SetColumnWidthEms(kResourceColumnMipLevel, 6);
58+
resource_table->SetColumnWidthEms(kResourceColumnFormat, 8);
5659
resource_table->SetColumnWidthEms(kResourceColumnSize, 8);
5760
resource_table->SetColumnWidthEms(kResourceColumnPreferredHeap, 11);
5861
resource_table->SetColumnWidthEms(kResourceColumnMappedInvisible, 13);
@@ -134,6 +137,18 @@ namespace rmv
134137
return cache_[row].resource_name;
135138
case kResourceColumnVirtualAddress:
136139
return rmv::string_util::LocalizedValueAddress(RmtResourceGetVirtualAddress(resource));
140+
case kResourceColumnDimension:
141+
return resource->resource_type == kRmtResourceTypeImage
142+
? QString::asprintf("%dx%dx%d", resource->image.dimension_x, resource->image.dimension_y, resource->image.dimension_z)
143+
: QString("-");
144+
case kResourceColumnMipLevel:
145+
return resource->resource_type == kRmtResourceTypeImage
146+
? QString::asprintf("%d", resource->image.mip_levels)
147+
: QString("-");
148+
case kResourceColumnFormat:
149+
return resource->resource_type == kRmtResourceTypeImage
150+
? QString(RmtGetFormatNameFromFormat(resource->image.format.format))
151+
: QString("-");
137152
case kResourceColumnSize:
138153
return rmv::string_util::LocalizedValueMemory(resource->size_in_bytes, false, false);
139154
case kResourceColumnMappedInvisible:
@@ -179,6 +194,18 @@ namespace rmv
179194
return QVariant::fromValue<qulonglong>(resource->identifier);
180195
case kResourceColumnVirtualAddress:
181196
return QVariant::fromValue<qulonglong>(RmtResourceGetVirtualAddress(resource));
197+
case kResourceColumnDimension:
198+
return resource->resource_type == kRmtResourceTypeImage
199+
? QList<QVariant>({resource->image.dimension_x, resource->image.dimension_y, resource->image.dimension_z})
200+
: QList<QVariant>({0, 0, 0});
201+
case kResourceColumnMipLevel:
202+
return resource->resource_type == kRmtResourceTypeImage
203+
? resource->image.mip_levels
204+
: 0;
205+
case kResourceColumnFormat:
206+
return resource->resource_type == kRmtResourceTypeImage
207+
? QString(RmtGetFormatNameFromFormat(resource->image.format.format))
208+
: QString("-");
182209
case kResourceColumnSize:
183210
return QVariant::fromValue<qulonglong>(resource->size_in_bytes);
184211
case kResourceColumnMappedInvisible:
@@ -207,6 +234,18 @@ namespace rmv
207234
{
208235
case kResourceColumnName:
209236
return cache_[row].resource_name;
237+
case kResourceColumnDimension:
238+
return resource->resource_type == kRmtResourceTypeImage
239+
? QString::asprintf("%dx%dx%d", resource->image.dimension_x, resource->image.dimension_y, resource->image.dimension_z)
240+
: QString("-");
241+
case kResourceColumnMipLevel:
242+
return resource->resource_type == kRmtResourceTypeImage
243+
? QString::asprintf("%d", resource->image.mip_levels)
244+
: QString("-");
245+
case kResourceColumnFormat:
246+
return resource->resource_type == kRmtResourceTypeImage
247+
? QString(RmtGetFormatNameFromFormat(resource->image.format.format))
248+
: QString("-");
210249
case kResourceColumnSize:
211250
return rmv::string_util::LocalizedValueBytes(resource->size_in_bytes);
212251
case kResourceColumnMappedInvisible:
@@ -243,6 +282,12 @@ namespace rmv
243282
return "Name";
244283
case kResourceColumnVirtualAddress:
245284
return "Virtual address";
285+
case kResourceColumnDimension:
286+
return "Dimension";
287+
case kResourceColumnMipLevel:
288+
return "Mip Level";
289+
case kResourceColumnFormat:
290+
return "Format";
246291
case kResourceColumnSize:
247292
return "Size";
248293
case kResourceColumnPreferredHeap:

source/frontend/models/resource_item_model.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ namespace rmv
2626
kResourceColumnCompareId,
2727
kResourceColumnName,
2828
kResourceColumnVirtualAddress,
29+
kResourceColumnUsage,
30+
kResourceColumnDimension,
31+
kResourceColumnMipLevel,
32+
kResourceColumnFormat,
2933
kResourceColumnSize,
3034
kResourceColumnPreferredHeap,
3135
kResourceColumnMappedInvisible,
3236
kResourceColumnMappedLocal,
3337
kResourceColumnMappedHost,
3438
kResourceColumnMappedNone,
35-
kResourceColumnUsage,
3639

3740
// Hidden, these columns are used as proxies for sorting by other columns.
3841
kResourceColumnAllocationIdInternal,

source/frontend/models/snapshot/resource_list_model.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,17 @@ namespace rmv
134134
UpdateBottomLabels();
135135
}
136136

137+
void ResourceListModel::FilterByMipLevelChanged(int min_value, int max_value)
138+
{
139+
const uint64_t scaled_min = rmv_util::CalculateThresholdFromStepValue(min_value, rmv::kMipSliderRange - 1);
140+
const uint64_t scaled_max = rmv_util::CalculateThresholdFromStepValue(max_value, rmv::kMipSliderRange - 1);
141+
142+
proxy_model_->SetMipLevelFilter(scaled_min, scaled_max);
143+
proxy_model_->invalidate();
144+
145+
UpdateBottomLabels();
146+
}
147+
137148
ResourceProxyModel* ResourceListModel::GetResourceProxyModel() const
138149
{
139150
return proxy_model_;

source/frontend/models/snapshot/resource_list_model.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ namespace rmv
5757
/// @param [in] max_value Maximum value of slider span.
5858
void FilterBySizeChanged(int min_value, int max_value);
5959

60+
/// @brief Handle what happens when the mip level filter changes.
61+
///
62+
/// @param [in] min_value Minimum value of slider span.
63+
/// @param [in] max_value Maximum value of slider span.
64+
void FilterByMipLevelChanged(int min_value, int max_value);
65+
6066
/// @brief Read the dataset and update model.
6167
void Update();
6268

0 commit comments

Comments
 (0)