Added profiling (will be removed)

This commit is contained in:
Lander Gallastegi 2025-05-17 20:49:21 +02:00
parent 0093f00b18
commit ec391a4739
3 changed files with 13 additions and 0 deletions

View File

@ -7,6 +7,7 @@
#include <deque> #include <deque>
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
#include "common/debug.h"
#include "common/types.h" #include "common/types.h"
#include "video_core/buffer_cache/word_manager.h" #include "video_core/buffer_cache/word_manager.h"
@ -85,6 +86,7 @@ private:
*/ */
template <bool create_region_on_fail, typename Func> template <bool create_region_on_fail, typename Func>
bool IteratePages(VAddr cpu_address, size_t size, Func&& func) { bool IteratePages(VAddr cpu_address, size_t size, Func&& func) {
RENDERER_TRACE;
using FuncReturn = typename std::invoke_result<Func, RegionManager*, u64, size_t>::type; using FuncReturn = typename std::invoke_result<Func, RegionManager*, u64, size_t>::type;
static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>; static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>;
std::size_t remaining_size{size}; std::size_t remaining_size{size};

View File

@ -13,6 +13,7 @@
#else #else
#include "common/spin_lock.h" #include "common/spin_lock.h"
#endif #endif
#include "common/debug.h"
#include "common/types.h" #include "common/types.h"
#include "video_core/page_manager.h" #include "video_core/page_manager.h"
@ -74,6 +75,7 @@ public:
template <typename Func> template <typename Func>
void IterateWords(size_t offset, size_t size, Func&& func) const { void IterateWords(size_t offset, size_t size, Func&& func) const {
RENDERER_TRACE;
using FuncReturn = std::invoke_result_t<Func, std::size_t, u64>; using FuncReturn = std::invoke_result_t<Func, std::size_t, u64>;
static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>; static constexpr bool BOOL_BREAK = std::is_same_v<FuncReturn, bool>;
const size_t start = static_cast<size_t>(std::max<s64>(static_cast<s64>(offset), 0LL)); const size_t start = static_cast<size_t>(std::max<s64>(static_cast<s64>(offset), 0LL));
@ -106,6 +108,7 @@ public:
} }
void IteratePages(u64 mask, auto&& func) const { void IteratePages(u64 mask, auto&& func) const {
RENDERER_TRACE;
size_t offset = 0; size_t offset = 0;
while (mask != 0) { while (mask != 0) {
const size_t empty_bits = std::countr_zero(mask); const size_t empty_bits = std::countr_zero(mask);
@ -157,6 +160,7 @@ public:
*/ */
template <Type type, bool clear> template <Type type, bool clear>
void ForEachModifiedRange(VAddr query_cpu_range, s64 size, auto&& func) { void ForEachModifiedRange(VAddr query_cpu_range, s64 size, auto&& func) {
RENDERER_TRACE;
std::scoped_lock lk{lock}; std::scoped_lock lk{lock};
static_assert(type != Type::Untracked); static_assert(type != Type::Untracked);
@ -170,6 +174,7 @@ public:
(pending_pointer - pending_offset) * BYTES_PER_PAGE); (pending_pointer - pending_offset) * BYTES_PER_PAGE);
}; };
IterateWords(offset, size, [&](size_t index, u64 mask) { IterateWords(offset, size, [&](size_t index, u64 mask) {
RENDERER_TRACE;
if constexpr (type == Type::GPU) { if constexpr (type == Type::GPU) {
mask &= ~untracked[index]; mask &= ~untracked[index];
} }
@ -183,6 +188,7 @@ public:
} }
const size_t base_offset = index * PAGES_PER_WORD; const size_t base_offset = index * PAGES_PER_WORD;
IteratePages(word, [&](size_t pages_offset, size_t pages_size) { IteratePages(word, [&](size_t pages_offset, size_t pages_size) {
RENDERER_TRACE;
const auto reset = [&]() { const auto reset = [&]() {
pending_offset = base_offset + pages_offset; pending_offset = base_offset + pages_offset;
pending_pointer = base_offset + pages_offset + pages_size; pending_pointer = base_offset + pages_offset + pages_size;
@ -243,6 +249,7 @@ private:
*/ */
template <bool add_to_tracker> template <bool add_to_tracker>
void UpdateProtection(u64 word_index, u64 current_bits, u64 new_bits) const { void UpdateProtection(u64 word_index, u64 current_bits, u64 new_bits) const {
RENDERER_TRACE;
constexpr s32 delta = add_to_tracker ? 1 : -1; constexpr s32 delta = add_to_tracker ? 1 : -1;
u64 changed_bits = (add_to_tracker ? current_bits : ~current_bits) & new_bits; u64 changed_bits = (add_to_tracker ? current_bits : ~current_bits) & new_bits;
VAddr addr = cpu_addr + word_index * BYTES_PER_WORD; VAddr addr = cpu_addr + word_index * BYTES_PER_WORD;

View File

@ -3,6 +3,7 @@
#include <boost/container/small_vector.hpp> #include <boost/container/small_vector.hpp>
#include "common/assert.h" #include "common/assert.h"
#include "common/debug.h"
#include "common/signal_context.h" #include "common/signal_context.h"
#include "core/memory.h" #include "core/memory.h"
#include "core/signals.h" #include "core/signals.h"
@ -174,6 +175,7 @@ struct PageManager::Impl {
} }
void Protect(VAddr address, size_t size, Core::MemoryPermission perms) { void Protect(VAddr address, size_t size, Core::MemoryPermission perms) {
RENDERER_TRACE;
auto* memory = Core::Memory::Instance(); auto* memory = Core::Memory::Instance();
auto& impl = memory->GetAddressSpace(); auto& impl = memory->GetAddressSpace();
impl.Protect(address, size, perms); impl.Protect(address, size, perms);
@ -190,6 +192,7 @@ struct PageManager::Impl {
#endif #endif
template <s32 delta> template <s32 delta>
void UpdatePageWatchers(VAddr addr, u64 size) { void UpdatePageWatchers(VAddr addr, u64 size) {
RENDERER_TRACE;
boost::container::small_vector<UpdateProtectRange, 16> update_ranges; boost::container::small_vector<UpdateProtectRange, 16> update_ranges;
{ {
std::scoped_lock lk(lock); std::scoped_lock lk(lock);
@ -201,6 +204,7 @@ struct PageManager::Impl {
const auto release_pending = [&] { const auto release_pending = [&] {
if (range_bytes > 0) { if (range_bytes > 0) {
RENDERER_TRACE;
// Add pending (un)protect action // Add pending (un)protect action
update_ranges.push_back({range_begin << PAGE_BITS, range_bytes, perms}); update_ranges.push_back({range_begin << PAGE_BITS, range_bytes, perms});
range_bytes = 0; range_bytes = 0;