From 9dec087fca5944b6e4ee5f0f76c0716a93a9fe4d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Apr 2019 20:18:27 -0400 Subject: [PATCH 1/5] video_core/memory_manager: Make GpuToCpuAddress() a const member function This doesn't modify any internal state, so it can be made a const member function to allow its use in const contexts. --- src/video_core/memory_manager.cpp | 4 ++-- src/video_core/memory_manager.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index e76b598424..124a3c6d2e 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -99,12 +99,12 @@ bool MemoryManager::IsAddressValid(GPUVAddr addr) const { return (addr >> page_bits) < page_table.pointers.size(); } -std::optional MemoryManager::GpuToCpuAddress(GPUVAddr addr) { +std::optional MemoryManager::GpuToCpuAddress(GPUVAddr addr) const { if (!IsAddressValid(addr)) { return {}; } - VAddr cpu_addr{page_table.backing_addr[addr >> page_bits]}; + const VAddr cpu_addr{page_table.backing_addr[addr >> page_bits]}; if (cpu_addr) { return cpu_addr + (addr & page_mask); } diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 34744bb27f..c3b4d7ae76 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -50,7 +50,7 @@ public: GPUVAddr MapBufferEx(VAddr cpu_addr, u64 size); GPUVAddr MapBufferEx(VAddr cpu_addr, GPUVAddr addr, u64 size); GPUVAddr UnmapBuffer(GPUVAddr addr, u64 size); - std::optional GpuToCpuAddress(GPUVAddr addr); + std::optional GpuToCpuAddress(GPUVAddr addr) const; template T Read(GPUVAddr addr); From 085b388a7aaa37663cec84d06a0c2cb674bee73a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Apr 2019 20:22:53 -0400 Subject: [PATCH 2/5] video_core/memory_manager: Make FindFreeRegion() a const member function This doesn't modify internal state, so it can be made a const member function. --- src/video_core/memory_manager.cpp | 17 +++++++++-------- src/video_core/memory_manager.h | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 124a3c6d2e..11b1d022ad 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -77,16 +77,17 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) { return gpu_addr; } -GPUVAddr MemoryManager::FindFreeRegion(GPUVAddr region_start, u64 size) { +GPUVAddr MemoryManager::FindFreeRegion(GPUVAddr region_start, u64 size) const { // Find the first Free VMA. - const VMAHandle vma_handle{std::find_if(vma_map.begin(), vma_map.end(), [&](const auto& vma) { - if (vma.second.type != VirtualMemoryArea::Type::Unmapped) { - return false; - } + const VMAHandle vma_handle{ + std::find_if(vma_map.begin(), vma_map.end(), [region_start, size](const auto& vma) { + if (vma.second.type != VirtualMemoryArea::Type::Unmapped) { + return false; + } - const VAddr vma_end{vma.second.base + vma.second.size}; - return vma_end > region_start && vma_end >= region_start + size; - })}; + const VAddr vma_end{vma.second.base + vma.second.size}; + return vma_end > region_start && vma_end >= region_start + size; + })}; if (vma_handle == vma_map.end()) { return {}; diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index c3b4d7ae76..d75c1c5c09 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -127,7 +127,7 @@ private: void UpdatePageTableForVMA(const VirtualMemoryArea& vma); /// Finds a free (unmapped region) of the specified size starting at the specified address. - GPUVAddr FindFreeRegion(GPUVAddr region_start, u64 size); + GPUVAddr FindFreeRegion(GPUVAddr region_start, u64 size) const; private: static constexpr u64 page_bits{16}; From 34510bcda84aa0d3acc6af543eb4b38e76e6ab84 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Apr 2019 20:25:25 -0400 Subject: [PATCH 3/5] video_core/memory_manager: Add a const qualified variant of GetPointer() Allows retrieving read-only pointers from a const context externally. --- src/video_core/memory_manager.cpp | 18 ++++++++++++++++-- src/video_core/memory_manager.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 11b1d022ad..bb7e21e7d0 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -180,8 +180,22 @@ u8* MemoryManager::GetPointer(GPUVAddr addr) { return {}; } - u8* page_pointer{page_table.pointers[addr >> page_bits]}; - if (page_pointer) { + u8* const page_pointer{page_table.pointers[addr >> page_bits]}; + if (page_pointer != nullptr) { + return page_pointer + (addr & page_mask); + } + + LOG_ERROR(HW_GPU, "Unknown GetPointer @ 0x{:016X}", addr); + return {}; +} + +const u8* MemoryManager::GetPointer(GPUVAddr addr) const { + if (!IsAddressValid(addr)) { + return {}; + } + + const u8* const page_pointer{page_table.pointers[addr >> page_bits]}; + if (page_pointer != nullptr) { return page_pointer + (addr & page_mask); } diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index d75c1c5c09..4309bfce7e 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -59,6 +59,7 @@ public: void Write(GPUVAddr addr, T data); u8* GetPointer(GPUVAddr addr); + const u8* GetPointer(GPUVAddr addr) const; void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size); void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); From 76ef6e5c2be2d3d31fdc7bf16c499c1f257b9e97 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Apr 2019 20:27:57 -0400 Subject: [PATCH 4/5] video_core/memory_manager: Make ReadBlock() a const qualifier member function Now, since we have a const qualified variant of GetPointer(), we can put it to use in ReadBlock() to retrieve the source pointer that is passed into memcpy. Now block reading may be done from a const context. --- src/video_core/memory_manager.cpp | 2 +- src/video_core/memory_manager.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index bb7e21e7d0..2b3651f206 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -203,7 +203,7 @@ const u8* MemoryManager::GetPointer(GPUVAddr addr) const { return {}; } -void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) { +void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const { std::memcpy(dest_buffer, GetPointer(src_addr), size); } void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size) { diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 4309bfce7e..273d538b81 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -61,7 +61,7 @@ public: u8* GetPointer(GPUVAddr addr); const u8* GetPointer(GPUVAddr addr) const; - void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size); + void ReadBlock(GPUVAddr src_addr, void* dest_buffer, std::size_t size) const; void WriteBlock(GPUVAddr dest_addr, const void* src_buffer, std::size_t size); void CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, std::size_t size); From c13fbe6a41a8e496e6b7de38a15669344e9cab7a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 5 Apr 2019 20:30:46 -0400 Subject: [PATCH 5/5] video_core/memory_manager: Make Read() a const qualified member function Given this doesn't actually alter internal state, this can be made a const member function. --- src/video_core/memory_manager.cpp | 10 +++++----- src/video_core/memory_manager.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 2b3651f206..8417324ffd 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -114,7 +114,7 @@ std::optional MemoryManager::GpuToCpuAddress(GPUVAddr addr) const { } template -T MemoryManager::Read(GPUVAddr addr) { +T MemoryManager::Read(GPUVAddr addr) const { if (!IsAddressValid(addr)) { return {}; } @@ -166,10 +166,10 @@ void MemoryManager::Write(GPUVAddr addr, T data) { } } -template u8 MemoryManager::Read(GPUVAddr addr); -template u16 MemoryManager::Read(GPUVAddr addr); -template u32 MemoryManager::Read(GPUVAddr addr); -template u64 MemoryManager::Read(GPUVAddr addr); +template u8 MemoryManager::Read(GPUVAddr addr) const; +template u16 MemoryManager::Read(GPUVAddr addr) const; +template u32 MemoryManager::Read(GPUVAddr addr) const; +template u64 MemoryManager::Read(GPUVAddr addr) const; template void MemoryManager::Write(GPUVAddr addr, u8 data); template void MemoryManager::Write(GPUVAddr addr, u16 data); template void MemoryManager::Write(GPUVAddr addr, u32 data); diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 273d538b81..178e2f6552 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -53,7 +53,7 @@ public: std::optional GpuToCpuAddress(GPUVAddr addr) const; template - T Read(GPUVAddr addr); + T Read(GPUVAddr addr) const; template void Write(GPUVAddr addr, T data);