summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2021-01-24 22:57:00 -0800
committerGravatar GitHub2021-01-24 22:57:00 -0800
commit62766b13264fd61e92ee287e6fb9cad0b5d00781 (patch)
tree9136e03ad81c345c0966caced9c9a7d2a152939a /src
parentMerge pull request #5823 from ReinUsesLisp/revert-flags (diff)
parentvideo_core/memory_manager: Remove unused CopyBlockUnsafe (diff)
downloadyuzu-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.cpp26
-rw-r--r--src/video_core/memory_manager.h3
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
317void 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
317void MemoryManager::CopyBlock(GPUVAddr gpu_dest_addr, GPUVAddr gpu_src_addr, std::size_t size) { 332void 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
323void 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
330bool MemoryManager::IsGranularRange(GPUVAddr gpu_addr, std::size_t size) const { 342bool 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 }