diff options
| author | 2021-01-24 22:57:00 -0800 | |
|---|---|---|
| committer | 2021-01-24 22:57:00 -0800 | |
| commit | 62766b13264fd61e92ee287e6fb9cad0b5d00781 (patch) | |
| tree | 9136e03ad81c345c0966caced9c9a7d2a152939a /src | |
| parent | Merge pull request #5823 from ReinUsesLisp/revert-flags (diff) | |
| parent | video_core/memory_manager: Remove unused CopyBlockUnsafe (diff) | |
| download | yuzu-62766b13264fd61e92ee287e6fb9cad0b5d00781.tar.gz yuzu-62766b13264fd61e92ee287e6fb9cad0b5d00781.tar.xz yuzu-62766b13264fd61e92ee287e6fb9cad0b5d00781.zip | |
Merge pull request #5785 from ReinUsesLisp/buffer-dma
video_core/memory_manager: Flush destination buffer on CopyBlock
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 26 | ||||
| -rw-r--r-- | src/video_core/memory_manager.h | 3 |
2 files changed, 21 insertions, 8 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 65feff588..f5cdf548e 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -314,17 +314,29 @@ 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); |
| 320 | WriteBlock(gpu_dest_addr, tmp_buffer.data(), size); | ||
| 321 | } | ||
| 322 | 335 | ||
| 323 | void MemoryManager::CopyBlockUnsafe(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, | 336 | // The output block must be flushed in case it has data modified from the GPU. |
| 324 | std::size_t size) { | 337 | // Fixes NPC geometry in Zombie Panic in Wonderland DX |
| 325 | std::vector<u8> tmp_buffer(size); | 338 | FlushRegion(gpu_dest_addr, size); |
| 326 | ReadBlockUnsafe(gpu_src_addr, tmp_buffer.data(), size); | 339 | WriteBlock(gpu_dest_addr, tmp_buffer.data(), size); |
| 327 | WriteBlockUnsafe(gpu_dest_addr, tmp_buffer.data(), size); | ||
| 328 | } | 340 | } |
| 329 | 341 | ||
| 330 | bool MemoryManager::IsGranularRange(GPUVAddr gpu_addr, std::size_t size) const { | 342 | bool MemoryManager::IsGranularRange(GPUVAddr gpu_addr, std::size_t size) const { |
diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index c35e57689..a52fbbd8c 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h | |||
| @@ -107,7 +107,6 @@ public: | |||
| 107 | */ | 107 | */ |
| 108 | void ReadBlockUnsafe(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size) const; | 108 | void ReadBlockUnsafe(GPUVAddr gpu_src_addr, void* dest_buffer, std::size_t size) const; |
| 109 | void WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size); | 109 | void WriteBlockUnsafe(GPUVAddr gpu_dest_addr, const void* src_buffer, std::size_t size); |
| 110 | void CopyBlockUnsafe(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size); | ||
| 111 | 110 | ||
| 112 | /** | 111 | /** |
| 113 | * IsGranularRange checks if a gpu region can be simply read with a pointer. | 112 | * IsGranularRange checks if a gpu region can be simply read with a pointer. |
| @@ -131,6 +130,8 @@ private: | |||
| 131 | void TryLockPage(PageEntry page_entry, std::size_t size); | 130 | void TryLockPage(PageEntry page_entry, std::size_t size); |
| 132 | void TryUnlockPage(PageEntry page_entry, std::size_t size); | 131 | void TryUnlockPage(PageEntry page_entry, std::size_t size); |
| 133 | 132 | ||
| 133 | void FlushRegion(GPUVAddr gpu_addr, size_t size) const; | ||
| 134 | |||
| 134 | [[nodiscard]] static constexpr std::size_t PageEntryIndex(GPUVAddr gpu_addr) { | 135 | [[nodiscard]] static constexpr std::size_t PageEntryIndex(GPUVAddr gpu_addr) { |
| 135 | return (gpu_addr >> page_bits) & page_table_mask; | 136 | return (gpu_addr >> page_bits) & page_table_mask; |
| 136 | } | 137 | } |