diff options
| author | 2021-01-21 19:08:15 -0300 | |
|---|---|---|
| committer | 2021-01-21 19:16:05 -0300 | |
| commit | dd790abab00379c232ea508fc43e87bd05d003f6 (patch) | |
| tree | bb1225fbebd8ef6981b35d300a55881b13a9387a /src | |
| parent | Merge pull request #5755 from FearlessTobi/port-5344 (diff) | |
| download | yuzu-dd790abab00379c232ea508fc43e87bd05d003f6.tar.gz yuzu-dd790abab00379c232ea508fc43e87bd05d003f6.tar.xz yuzu-dd790abab00379c232ea508fc43e87bd05d003f6.zip | |
video_core/memory_manager: Add GPU address based flush method
Allow flushing rasterizer contents based on a GPU address.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 2 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 65feff588..1926bb025 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -314,6 +314,21 @@ void MemoryManager::WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buf | |||
| 314 | } | 314 | } |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | void MemoryManager::FlushRegion(GPUVAddr gpu_addr, size_t size) const { | ||
| 318 | size_t remaining_size{size}; | ||
| 319 | size_t page_index{gpu_addr >> page_bits}; | ||
| 320 | size_t page_offset{gpu_addr & page_mask}; | ||
| 321 | while (remaining_size > 0) { | ||
| 322 | const size_t num_bytes{std::min(page_size - page_offset, remaining_size)}; | ||
| 323 | if (const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; page_addr) { | ||
| 324 | rasterizer->FlushRegion(*page_addr + page_offset, num_bytes); | ||
| 325 | } | ||
| 326 | ++page_index; | ||
| 327 | page_offset = 0; | ||
| 328 | remaining_size -= num_bytes; | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 317 | void MemoryManager::CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size) { | 332 | void MemoryManager::CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size) { |
| 318 | std::vector<u8> tmp_buffer(size); | 333 | std::vector<u8> tmp_buffer(size); |
| 319 | ReadBlock(gpu_src_addr, tmp_buffer.data(), size); | 334 | ReadBlock(gpu_src_addr, tmp_buffer.data(), size); |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index c35e57689..e3c0c53a9 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -131,6 +131,8 @@ private: | |||
| 131 | void TryLockPage(PageEntry page_entry, std::size_t size); | 131 | void TryLockPage(PageEntry page_entry, std::size_t size); |
| 132 | void TryUnlockPage(PageEntry page_entry, std::size_t size); | 132 | void TryUnlockPage(PageEntry page_entry, std::size_t size); |
| 133 | 133 | ||
| 134 | void FlushRegion(GPUVAddr gpu_addr, size_t size) const; | ||
| 135 | |||
| 134 | [[nodiscard]] static constexpr std::size_t PageEntryIndex(GPUVAddr gpu_addr) { | 136 | [[nodiscard]] static constexpr std::size_t PageEntryIndex(GPUVAddr gpu_addr) { |
| 135 | return (gpu_addr >> page_bits) & page_table_mask; | 137 | return (gpu_addr >> page_bits) & page_table_mask; |
| 136 | } | 138 | } |