diff options
| author | 2023-06-28 06:28:13 +0200 | |
|---|---|---|
| committer | 2023-06-28 19:34:21 +0200 | |
| commit | 47d0d292d5cc5f0404e126023279db7decd532ac (patch) | |
| tree | a43e59102a9db2a124c7473842fbf0d661ff628e /src/video_core | |
| parent | Merge pull request #10837 from liamwhite/mali-support (diff) | |
| download | yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.gz yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.xz yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.zip | |
MemoryTracking: Initial setup of atomic writes.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 26 | ||||
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache_base.h | 2 | ||||
| -rw-r--r-- | src/video_core/gpu.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 9 |
4 files changed, 31 insertions, 10 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 58a45ab67..9239ad862 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -115,7 +115,21 @@ void BufferCache<P>::WriteMemory(VAddr cpu_addr, u64 size) { | |||
| 115 | 115 | ||
| 116 | template <class P> | 116 | template <class P> |
| 117 | void BufferCache<P>::CachedWriteMemory(VAddr cpu_addr, u64 size) { | 117 | void BufferCache<P>::CachedWriteMemory(VAddr cpu_addr, u64 size) { |
| 118 | memory_tracker.CachedCpuWrite(cpu_addr, size); | 118 | const bool is_dirty = IsRegionRegistered(cpu_addr, size); |
| 119 | if (!is_dirty) { | ||
| 120 | return; | ||
| 121 | } | ||
| 122 | VAddr aligned_start = Common::AlignDown(cpu_addr, YUZU_PAGESIZE); | ||
| 123 | VAddr aligned_end = Common::AlignUp(cpu_addr + size, YUZU_PAGESIZE); | ||
| 124 | if (!IsRegionGpuModified(aligned_start, aligned_end - aligned_start)) { | ||
| 125 | WriteMemory(cpu_addr, size); | ||
| 126 | return; | ||
| 127 | } | ||
| 128 | |||
| 129 | tmp_buffer.resize_destructive(size); | ||
| 130 | cpu_memory.ReadBlockUnsafe(cpu_addr, tmp_buffer.data(), size); | ||
| 131 | |||
| 132 | InlineMemoryImplementation(cpu_addr, size, tmp_buffer); | ||
| 119 | } | 133 | } |
| 120 | 134 | ||
| 121 | template <class P> | 135 | template <class P> |
| @@ -1553,6 +1567,14 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size, | |||
| 1553 | return false; | 1567 | return false; |
| 1554 | } | 1568 | } |
| 1555 | 1569 | ||
| 1570 | InlineMemoryImplementation(dest_address, copy_size, inlined_buffer); | ||
| 1571 | |||
| 1572 | return true; | ||
| 1573 | } | ||
| 1574 | |||
| 1575 | template <class P> | ||
| 1576 | void BufferCache<P>::InlineMemoryImplementation(VAddr dest_address, size_t copy_size, | ||
| 1577 | std::span<const u8> inlined_buffer) { | ||
| 1556 | const IntervalType subtract_interval{dest_address, dest_address + copy_size}; | 1578 | const IntervalType subtract_interval{dest_address, dest_address + copy_size}; |
| 1557 | ClearDownload(subtract_interval); | 1579 | ClearDownload(subtract_interval); |
| 1558 | common_ranges.subtract(subtract_interval); | 1580 | common_ranges.subtract(subtract_interval); |
| @@ -1574,8 +1596,6 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size, | |||
| 1574 | } else { | 1596 | } else { |
| 1575 | buffer.ImmediateUpload(buffer.Offset(dest_address), inlined_buffer.first(copy_size)); | 1597 | buffer.ImmediateUpload(buffer.Offset(dest_address), inlined_buffer.first(copy_size)); |
| 1576 | } | 1598 | } |
| 1577 | |||
| 1578 | return true; | ||
| 1579 | } | 1599 | } |
| 1580 | 1600 | ||
| 1581 | template <class P> | 1601 | template <class P> |
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index fe6068cfe..4d9bab7f7 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h | |||
| @@ -543,6 +543,8 @@ private: | |||
| 543 | 543 | ||
| 544 | void ClearDownload(IntervalType subtract_interval); | 544 | void ClearDownload(IntervalType subtract_interval); |
| 545 | 545 | ||
| 546 | void InlineMemoryImplementation(VAddr dest_address, size_t copy_size, std::span<const u8> inlined_buffer); | ||
| 547 | |||
| 546 | VideoCore::RasterizerInterface& rasterizer; | 548 | VideoCore::RasterizerInterface& rasterizer; |
| 547 | Core::Memory::Memory& cpu_memory; | 549 | Core::Memory::Memory& cpu_memory; |
| 548 | 550 | ||
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index db385076d..f823a1e2b 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp | |||
| @@ -95,7 +95,9 @@ struct GPU::Impl { | |||
| 95 | 95 | ||
| 96 | /// Synchronizes CPU writes with Host GPU memory. | 96 | /// Synchronizes CPU writes with Host GPU memory. |
| 97 | void InvalidateGPUCache() { | 97 | void InvalidateGPUCache() { |
| 98 | rasterizer->InvalidateGPUCache(); | 98 | std::function<void(VAddr, size_t)> callback_writes( |
| 99 | [this](VAddr address, size_t size) { rasterizer->OnCPUWrite(address, size); }); | ||
| 100 | system.GatherGPUDirtyMemory(callback_writes); | ||
| 99 | } | 101 | } |
| 100 | 102 | ||
| 101 | /// Signal the ending of command list. | 103 | /// Signal the ending of command list. |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f7c0d939a..a63a29e61 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -570,7 +570,7 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { | |||
| 570 | if (addr == 0 || size == 0) { | 570 | if (addr == 0 || size == 0) { |
| 571 | return; | 571 | return; |
| 572 | } | 572 | } |
| 573 | pipeline_cache.OnCPUWrite(addr, size); | 573 | |
| 574 | { | 574 | { |
| 575 | std::scoped_lock lock{texture_cache.mutex}; | 575 | std::scoped_lock lock{texture_cache.mutex}; |
| 576 | texture_cache.WriteMemory(addr, size); | 576 | texture_cache.WriteMemory(addr, size); |
| @@ -579,14 +579,11 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { | |||
| 579 | std::scoped_lock lock{buffer_cache.mutex}; | 579 | std::scoped_lock lock{buffer_cache.mutex}; |
| 580 | buffer_cache.CachedWriteMemory(addr, size); | 580 | buffer_cache.CachedWriteMemory(addr, size); |
| 581 | } | 581 | } |
| 582 | pipeline_cache.InvalidateRegion(addr, size); | ||
| 582 | } | 583 | } |
| 583 | 584 | ||
| 584 | void RasterizerVulkan::InvalidateGPUCache() { | 585 | void RasterizerVulkan::InvalidateGPUCache() { |
| 585 | pipeline_cache.SyncGuestHost(); | 586 | gpu.InvalidateGPUCache(); |
| 586 | { | ||
| 587 | std::scoped_lock lock{buffer_cache.mutex}; | ||
| 588 | buffer_cache.FlushCachedWrites(); | ||
| 589 | } | ||
| 590 | } | 587 | } |
| 591 | 588 | ||
| 592 | void RasterizerVulkan::UnmapMemory(VAddr addr, u64 size) { | 589 | void RasterizerVulkan::UnmapMemory(VAddr addr, u64 size) { |