diff options
| author | 2021-07-14 18:25:33 +0200 | |
|---|---|---|
| committer | 2021-07-14 18:25:33 +0200 | |
| commit | a0eb3f8a3ee511e29ee362687d5f7e2df2e281f5 (patch) | |
| tree | fbdc97b3829c4f8f030fd72693540e2246e26f1a /src | |
| parent | DMAEngine: Revert flushing from Pitch to BlpockLinear. (diff) | |
| download | yuzu-a0eb3f8a3ee511e29ee362687d5f7e2df2e281f5.tar.gz yuzu-a0eb3f8a3ee511e29ee362687d5f7e2df2e281f5.tar.xz yuzu-a0eb3f8a3ee511e29ee362687d5f7e2df2e281f5.zip | |
Buffer Cache: Fixes to DMA Copy.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 4def8f076..9399bcfea 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -172,7 +172,7 @@ public: | |||
| 172 | [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size); | 172 | [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size); |
| 173 | 173 | ||
| 174 | /// Return true when a region is registered on the cache | 174 | /// Return true when a region is registered on the cache |
| 175 | [[nodiscard]] bool IsRegionRegistered(VAddr addr, size_t size); | 175 | [[nodiscard]] bool IsRegionRegistered(VAddr addr, size_t size) const; |
| 176 | 176 | ||
| 177 | /// Return true when a CPU region is modified from the CPU | 177 | /// Return true when a CPU region is modified from the CPU |
| 178 | [[nodiscard]] bool IsRegionCpuModified(VAddr addr, size_t size); | 178 | [[nodiscard]] bool IsRegionCpuModified(VAddr addr, size_t size); |
| @@ -503,6 +503,11 @@ bool BufferCache<P>::DMACopy(GPUVAddr src_address, GPUVAddr dest_address, u64 am | |||
| 503 | auto& src_buffer = slot_buffers[buffer_a]; | 503 | auto& src_buffer = slot_buffers[buffer_a]; |
| 504 | auto& dest_buffer = slot_buffers[buffer_b]; | 504 | auto& dest_buffer = slot_buffers[buffer_b]; |
| 505 | SynchronizeBuffer(src_buffer, *cpu_src_address, static_cast<u32>(amount)); | 505 | SynchronizeBuffer(src_buffer, *cpu_src_address, static_cast<u32>(amount)); |
| 506 | const VAddr aligned_dst = Common::AlignUp(*cpu_dest_address, 64); | ||
| 507 | const u64 diff = aligned_dst - *cpu_dest_address; | ||
| 508 | const u64 new_amount = diff > amount ? 0 : amount - diff; | ||
| 509 | dest_buffer.UnmarkRegionAsCpuModified(aligned_dst, Common::AlignDown(new_amount, 64)); | ||
| 510 | SynchronizeBuffer(dest_buffer, *cpu_dest_address, static_cast<u32>(amount)); | ||
| 506 | std::array copies{BufferCopy{ | 511 | std::array copies{BufferCopy{ |
| 507 | .src_offset = src_buffer.Offset(*cpu_src_address), | 512 | .src_offset = src_buffer.Offset(*cpu_src_address), |
| 508 | .dst_offset = dest_buffer.Offset(*cpu_dest_address), | 513 | .dst_offset = dest_buffer.Offset(*cpu_dest_address), |
| @@ -526,11 +531,7 @@ bool BufferCache<P>::DMACopy(GPUVAddr src_address, GPUVAddr dest_address, u64 am | |||
| 526 | common_ranges.add(add_interval); | 531 | common_ranges.add(add_interval); |
| 527 | } | 532 | } |
| 528 | 533 | ||
| 529 | if (dest_buffer.HasCachedWrites()) { | ||
| 530 | dest_buffer.FlushCachedWrites(); | ||
| 531 | } | ||
| 532 | runtime.CopyBuffer(dest_buffer, src_buffer, copies); | 534 | runtime.CopyBuffer(dest_buffer, src_buffer, copies); |
| 533 | dest_buffer.UnmarkRegionAsCpuModified(*cpu_dest_address, amount); | ||
| 534 | if (atleast_1_download) { | 535 | if (atleast_1_download) { |
| 535 | dest_buffer.MarkRegionAsGpuModified(*cpu_dest_address, amount); | 536 | dest_buffer.MarkRegionAsGpuModified(*cpu_dest_address, amount); |
| 536 | } | 537 | } |
| @@ -827,7 +828,7 @@ bool BufferCache<P>::IsRegionGpuModified(VAddr addr, size_t size) { | |||
| 827 | } | 828 | } |
| 828 | 829 | ||
| 829 | template <class P> | 830 | template <class P> |
| 830 | bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) { | 831 | bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) const { |
| 831 | const VAddr end_addr = addr + size; | 832 | const VAddr end_addr = addr + size; |
| 832 | const u64 page_end = Common::DivCeil(end_addr, PAGE_SIZE); | 833 | const u64 page_end = Common::DivCeil(end_addr, PAGE_SIZE); |
| 833 | for (u64 page = addr >> PAGE_BITS; page < page_end;) { | 834 | for (u64 page = addr >> PAGE_BITS; page < page_end;) { |