summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-01-21 19:08:43 -0300
committerGravatar ReinUsesLisp2021-01-21 19:16:06 -0300
commit0e9a6759f90cd45ef708c17b2fb1f74db5c8fce7 (patch)
tree9335990fbbea3bcfb81d26744dd1eef3916adf4a /src
parentvideo_core/memory_manager: Add GPU address based flush method (diff)
downloadyuzu-0e9a6759f90cd45ef708c17b2fb1f74db5c8fce7.tar.gz
yuzu-0e9a6759f90cd45ef708c17b2fb1f74db5c8fce7.tar.xz
yuzu-0e9a6759f90cd45ef708c17b2fb1f74db5c8fce7.zip
video_core/memory_manager: Flush destination buffer on CopyBlock
When we copy into a buffer, it might contain data modified from the GPU on the same pages. Because of this, we have to flush the contents before writing new data. An alternative approach would be to write the data in place, but games can also write data in other ways, invalidating our contents. Fixes geometry in Zombie Panic in Wonderland DX.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/memory_manager.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 1926bb025..e5d357773 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -332,6 +332,10 @@ void MemoryManager::FlushRegion(GPUVAddr gpu_addr, size_t size) const {
332void 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) {
333 std::vector<u8> tmp_buffer(size); 333 std::vector<u8> tmp_buffer(size);
334 ReadBlock(gpu_src_addr, tmp_buffer.data(), size); 334 ReadBlock(gpu_src_addr, tmp_buffer.data(), size);
335
336 // The output block must be flushed in case it has data modified from the GPU.
337 // Fixes NPC geometry in Zombie Panic in Wonderland DX
338 FlushRegion(gpu_dest_addr, size);
335 WriteBlock(gpu_dest_addr, tmp_buffer.data(), size); 339 WriteBlock(gpu_dest_addr, tmp_buffer.data(), size);
336} 340}
337 341