diff options
| author | bunnei <bunneidev@gmail.com> | 2020-02-20 20:04:05 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-20 20:04:05 -0500 | 
| commit | fe8e5d8ae48072d47649f872cee793b714034a5d (patch) | |
| tree | 0fcb5f9f2c0319d56dc2820d5ceb3a073b6468ef | |
| parent | 2342c0d50e354826d28c5fbc58b76d0047ea5e72 (diff) | |
| parent | d65fa7d65cd328c9be72a659add388803ef20e3d (diff) | |
Merge pull request #3438 from bunnei/gpu-mem-manager-fix
video_core: memory_manager: Flush/invalidate asynchronously when possible.
| -rw-r--r-- | src/video_core/memory_manager.cpp | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 11848fbce..f5d33f27a 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -9,6 +9,7 @@  #include "core/hle/kernel/process.h"  #include "core/hle/kernel/vm_manager.h"  #include "core/memory.h" +#include "video_core/gpu.h"  #include "video_core/memory_manager.h"  #include "video_core/rasterizer_interface.h" @@ -84,7 +85,9 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) {      const auto cpu_addr = GpuToCpuAddress(gpu_addr);      ASSERT(cpu_addr); -    rasterizer.FlushAndInvalidateRegion(cache_addr, aligned_size); +    // Flush and invalidate through the GPU interface, to be asynchronous if possible. +    system.GPU().FlushAndInvalidateRegion(cache_addr, aligned_size); +      UnmapRange(gpu_addr, aligned_size);      ASSERT(system.CurrentProcess()                 ->VMManager() @@ -242,6 +245,8 @@ void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::s          switch (page_table.attributes[page_index]) {          case Common::PageType::Memory: {              const u8* src_ptr{page_table.pointers[page_index] + page_offset}; +            // Flush must happen on the rasterizer interface, such that memory is always synchronous +            // when it is read (even when in asynchronous GPU mode). Fixes Dead Cells title menu.              rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount);              std::memcpy(dest_buffer, src_ptr, copy_amount);              break; @@ -292,6 +297,8 @@ void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const          switch (page_table.attributes[page_index]) {          case Common::PageType::Memory: {              u8* dest_ptr{page_table.pointers[page_index] + page_offset}; +            // Invalidate must happen on the rasterizer interface, such that memory is always +            // synchronous when it is written (even when in asynchronous GPU mode).              rasterizer.InvalidateRegion(ToCacheAddr(dest_ptr), copy_amount);              std::memcpy(dest_ptr, src_buffer, copy_amount);              break; @@ -339,6 +346,8 @@ void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, const std::          switch (page_table.attributes[page_index]) {          case Common::PageType::Memory: { +            // Flush must happen on the rasterizer interface, such that memory is always synchronous +            // when it is copied (even when in asynchronous GPU mode).              const u8* src_ptr{page_table.pointers[page_index] + page_offset};              rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount);              WriteBlock(dest_addr, src_ptr, copy_amount); | 
