diff options
| author | 2020-02-19 20:03:52 -0500 | |
|---|---|---|
| committer | 2020-02-19 20:03:52 -0500 | |
| commit | d65fa7d65cd328c9be72a659add388803ef20e3d (patch) | |
| tree | 48f8fe480882817859954d4b568a2c7aff2da8e5 /src | |
| parent | Merge pull request #3410 from ReinUsesLisp/vk-draw-index (diff) | |
| download | yuzu-d65fa7d65cd328c9be72a659add388803ef20e3d.tar.gz yuzu-d65fa7d65cd328c9be72a659add388803ef20e3d.tar.xz yuzu-d65fa7d65cd328c9be72a659add388803ef20e3d.zip | |
video_core: memory_manager: Flush/invalidate asynchronously on Unmap.
- Minor perf improvement.
Diffstat (limited to 'src')
| -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 @@ | |||
| 9 | #include "core/hle/kernel/process.h" | 9 | #include "core/hle/kernel/process.h" |
| 10 | #include "core/hle/kernel/vm_manager.h" | 10 | #include "core/hle/kernel/vm_manager.h" |
| 11 | #include "core/memory.h" | 11 | #include "core/memory.h" |
| 12 | #include "video_core/gpu.h" | ||
| 12 | #include "video_core/memory_manager.h" | 13 | #include "video_core/memory_manager.h" |
| 13 | #include "video_core/rasterizer_interface.h" | 14 | #include "video_core/rasterizer_interface.h" |
| 14 | 15 | ||
| @@ -84,7 +85,9 @@ GPUVAddr MemoryManager::UnmapBuffer(GPUVAddr gpu_addr, u64 size) { | |||
| 84 | const auto cpu_addr = GpuToCpuAddress(gpu_addr); | 85 | const auto cpu_addr = GpuToCpuAddress(gpu_addr); |
| 85 | ASSERT(cpu_addr); | 86 | ASSERT(cpu_addr); |
| 86 | 87 | ||
| 87 | rasterizer.FlushAndInvalidateRegion(cache_addr, aligned_size); | 88 | // Flush and invalidate through the GPU interface, to be asynchronous if possible. |
| 89 | system.GPU().FlushAndInvalidateRegion(cache_addr, aligned_size); | ||
| 90 | |||
| 88 | UnmapRange(gpu_addr, aligned_size); | 91 | UnmapRange(gpu_addr, aligned_size); |
| 89 | ASSERT(system.CurrentProcess() | 92 | ASSERT(system.CurrentProcess() |
| 90 | ->VMManager() | 93 | ->VMManager() |
| @@ -242,6 +245,8 @@ void MemoryManager::ReadBlock(GPUVAddr src_addr, void* dest_buffer, const std::s | |||
| 242 | switch (page_table.attributes[page_index]) { | 245 | switch (page_table.attributes[page_index]) { |
| 243 | case Common::PageType::Memory: { | 246 | case Common::PageType::Memory: { |
| 244 | const u8* src_ptr{page_table.pointers[page_index] + page_offset}; | 247 | const u8* src_ptr{page_table.pointers[page_index] + page_offset}; |
| 248 | // Flush must happen on the rasterizer interface, such that memory is always synchronous | ||
| 249 | // when it is read (even when in asynchronous GPU mode). Fixes Dead Cells title menu. | ||
| 245 | rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount); | 250 | rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount); |
| 246 | std::memcpy(dest_buffer, src_ptr, copy_amount); | 251 | std::memcpy(dest_buffer, src_ptr, copy_amount); |
| 247 | break; | 252 | break; |
| @@ -292,6 +297,8 @@ void MemoryManager::WriteBlock(GPUVAddr dest_addr, const void* src_buffer, const | |||
| 292 | switch (page_table.attributes[page_index]) { | 297 | switch (page_table.attributes[page_index]) { |
| 293 | case Common::PageType::Memory: { | 298 | case Common::PageType::Memory: { |
| 294 | u8* dest_ptr{page_table.pointers[page_index] + page_offset}; | 299 | u8* dest_ptr{page_table.pointers[page_index] + page_offset}; |
| 300 | // Invalidate must happen on the rasterizer interface, such that memory is always | ||
| 301 | // synchronous when it is written (even when in asynchronous GPU mode). | ||
| 295 | rasterizer.InvalidateRegion(ToCacheAddr(dest_ptr), copy_amount); | 302 | rasterizer.InvalidateRegion(ToCacheAddr(dest_ptr), copy_amount); |
| 296 | std::memcpy(dest_ptr, src_buffer, copy_amount); | 303 | std::memcpy(dest_ptr, src_buffer, copy_amount); |
| 297 | break; | 304 | break; |
| @@ -339,6 +346,8 @@ void MemoryManager::CopyBlock(GPUVAddr dest_addr, GPUVAddr src_addr, const std:: | |||
| 339 | 346 | ||
| 340 | switch (page_table.attributes[page_index]) { | 347 | switch (page_table.attributes[page_index]) { |
| 341 | case Common::PageType::Memory: { | 348 | case Common::PageType::Memory: { |
| 349 | // Flush must happen on the rasterizer interface, such that memory is always synchronous | ||
| 350 | // when it is copied (even when in asynchronous GPU mode). | ||
| 342 | const u8* src_ptr{page_table.pointers[page_index] + page_offset}; | 351 | const u8* src_ptr{page_table.pointers[page_index] + page_offset}; |
| 343 | rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount); | 352 | rasterizer.FlushRegion(ToCacheAddr(src_ptr), copy_amount); |
| 344 | WriteBlock(dest_addr, src_ptr, copy_amount); | 353 | WriteBlock(dest_addr, src_ptr, copy_amount); |