diff options
| author | 2021-07-14 19:04:45 +0200 | |
|---|---|---|
| committer | 2021-07-15 02:02:08 +0200 | |
| commit | 1ae4b684fff380035b468086586159a231237ed7 (patch) | |
| tree | 0f2d3bba4c07670b4d4b5cc56a506635f8cb08a7 /src/video_core/buffer_cache | |
| parent | GPUMemoryManager: Force inmediate invalidation when writting block. (diff) | |
| download | yuzu-1ae4b684fff380035b468086586159a231237ed7.tar.gz yuzu-1ae4b684fff380035b468086586159a231237ed7.tar.xz yuzu-1ae4b684fff380035b468086586159a231237ed7.zip | |
Buffer cache: Fixes, Clang and Feedback.
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 9399bcfea..7373cb62d 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) const; | 175 | [[nodiscard]] bool IsRegionRegistered(VAddr addr, size_t size); |
| 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,10 +503,6 @@ 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 | SynchronizeBuffer(dest_buffer, *cpu_dest_address, static_cast<u32>(amount)); |
| 511 | std::array copies{BufferCopy{ | 507 | std::array copies{BufferCopy{ |
| 512 | .src_offset = src_buffer.Offset(*cpu_src_address), | 508 | .src_offset = src_buffer.Offset(*cpu_src_address), |
| @@ -552,21 +548,19 @@ bool BufferCache<P>::DMAClear(GPUVAddr dst_address, u64 amount, u32 value) { | |||
| 552 | return false; | 548 | return false; |
| 553 | } | 549 | } |
| 554 | 550 | ||
| 555 | const IntervalType subtract_interval{*cpu_dst_address, *cpu_dst_address + amount * sizeof(u32)}; | 551 | const size_t size = amount * sizeof(u32); |
| 552 | const IntervalType subtract_interval{*cpu_dst_address, *cpu_dst_address + size}; | ||
| 556 | ClearDownload(subtract_interval); | 553 | ClearDownload(subtract_interval); |
| 557 | common_ranges.subtract(subtract_interval); | 554 | common_ranges.subtract(subtract_interval); |
| 558 | 555 | ||
| 559 | const size_t size = amount * sizeof(u32); | ||
| 560 | BufferId buffer; | 556 | BufferId buffer; |
| 561 | do { | 557 | do { |
| 562 | has_deleted_buffers = false; | 558 | has_deleted_buffers = false; |
| 563 | buffer = FindBuffer(*cpu_dst_address, static_cast<u32>(size)); | 559 | buffer = FindBuffer(*cpu_dst_address, static_cast<u32>(size)); |
| 564 | } while (has_deleted_buffers); | 560 | } while (has_deleted_buffers); |
| 565 | |||
| 566 | auto& dest_buffer = slot_buffers[buffer]; | 561 | auto& dest_buffer = slot_buffers[buffer]; |
| 567 | const u32 offset = static_cast<u32>(*cpu_dst_address - dest_buffer.CpuAddr()); | 562 | const u32 offset = static_cast<u32>(*cpu_dst_address - dest_buffer.CpuAddr()); |
| 568 | runtime.ClearBuffer(dest_buffer, offset, size, value); | 563 | runtime.ClearBuffer(dest_buffer, offset, size, value); |
| 569 | dest_buffer.UnmarkRegionAsCpuModified(*cpu_dst_address, size); | ||
| 570 | return true; | 564 | return true; |
| 571 | } | 565 | } |
| 572 | 566 | ||
| @@ -828,7 +822,7 @@ bool BufferCache<P>::IsRegionGpuModified(VAddr addr, size_t size) { | |||
| 828 | } | 822 | } |
| 829 | 823 | ||
| 830 | template <class P> | 824 | template <class P> |
| 831 | bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) const { | 825 | bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) { |
| 832 | const VAddr end_addr = addr + size; | 826 | const VAddr end_addr = addr + size; |
| 833 | const u64 page_end = Common::DivCeil(end_addr, PAGE_SIZE); | 827 | const u64 page_end = Common::DivCeil(end_addr, PAGE_SIZE); |
| 834 | for (u64 page = addr >> PAGE_BITS; page < page_end;) { | 828 | for (u64 page = addr >> PAGE_BITS; page < page_end;) { |