diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2023-06-28 06:28:13 +0200 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2023-06-28 19:34:21 +0200 |
commit | 47d0d292d5cc5f0404e126023279db7decd532ac (patch) | |
tree | a43e59102a9db2a124c7473842fbf0d661ff628e /src/video_core/buffer_cache/buffer_cache.h | |
parent | Merge pull request #10837 from liamwhite/mali-support (diff) | |
download | yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.gz yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.bz2 yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.lz yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.xz yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.tar.zst yuzu-47d0d292d5cc5f0404e126023279db7decd532ac.zip |
Diffstat (limited to 'src/video_core/buffer_cache/buffer_cache.h')
-rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 26 |
1 files changed, 23 insertions, 3 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) { template <class P> void BufferCache<P>::CachedWriteMemory(VAddr cpu_addr, u64 size) { - memory_tracker.CachedCpuWrite(cpu_addr, size); + const bool is_dirty = IsRegionRegistered(cpu_addr, size); + if (!is_dirty) { + return; + } + VAddr aligned_start = Common::AlignDown(cpu_addr, YUZU_PAGESIZE); + VAddr aligned_end = Common::AlignUp(cpu_addr + size, YUZU_PAGESIZE); + if (!IsRegionGpuModified(aligned_start, aligned_end - aligned_start)) { + WriteMemory(cpu_addr, size); + return; + } + + tmp_buffer.resize_destructive(size); + cpu_memory.ReadBlockUnsafe(cpu_addr, tmp_buffer.data(), size); + + InlineMemoryImplementation(cpu_addr, size, tmp_buffer); } template <class P> @@ -1553,6 +1567,14 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size, return false; } + InlineMemoryImplementation(dest_address, copy_size, inlined_buffer); + + return true; +} + +template <class P> +void BufferCache<P>::InlineMemoryImplementation(VAddr dest_address, size_t copy_size, + std::span<const u8> inlined_buffer) { const IntervalType subtract_interval{dest_address, dest_address + copy_size}; ClearDownload(subtract_interval); common_ranges.subtract(subtract_interval); @@ -1574,8 +1596,6 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size, } else { buffer.ImmediateUpload(buffer.Offset(dest_address), inlined_buffer.first(copy_size)); } - - return true; } template <class P> |