diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-01-21 19:08:15 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-01-21 19:16:05 -0300 | 
| commit | dd790abab00379c232ea508fc43e87bd05d003f6 (patch) | |
| tree | bb1225fbebd8ef6981b35d300a55881b13a9387a /src/video_core | |
| parent | 4cd8b2f1f7837ad3f138148474846b5bdd8c824e (diff) | |
video_core/memory_manager: Add GPU address based flush method
Allow flushing rasterizer contents based on a GPU address.
Diffstat (limited to 'src/video_core')
| -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      }  } +void MemoryManager::FlushRegion(GPUVAddr gpu_addr, size_t size) const { +    size_t remaining_size{size}; +    size_t page_index{gpu_addr >> page_bits}; +    size_t page_offset{gpu_addr & page_mask}; +    while (remaining_size > 0) { +        const size_t num_bytes{std::min(page_size - page_offset, remaining_size)}; +        if (const auto page_addr{GpuToCpuAddress(page_index << page_bits)}; page_addr) { +            rasterizer->FlushRegion(*page_addr + page_offset, num_bytes); +        } +        ++page_index; +        page_offset = 0; +        remaining_size -= num_bytes; +    } +} +  void MemoryManager::CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size) {      std::vector<u8> tmp_buffer(size);      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:      void TryLockPage(PageEntry page_entry, std::size_t size);      void TryUnlockPage(PageEntry page_entry, std::size_t size); +    void FlushRegion(GPUVAddr gpu_addr, size_t size) const; +      [[nodiscard]] static constexpr std::size_t PageEntryIndex(GPUVAddr gpu_addr) {          return (gpu_addr >> page_bits) & page_table_mask;      } | 
