diff options
| author | 2021-07-07 20:45:33 +0200 | |
|---|---|---|
| committer | 2021-07-09 22:20:36 +0200 | |
| commit | f75544a9432949da4ded4566b326af28a29091ac (patch) | |
| tree | c85440bdbafe8c1a9ab4eb00c1a84a326da25277 /src/video_core/buffer_cache | |
| parent | Fence Manager: Force ordering on WFI. (diff) | |
| download | yuzu-f75544a9432949da4ded4566b326af28a29091ac.tar.gz yuzu-f75544a9432949da4ded4566b326af28a29091ac.tar.xz yuzu-f75544a9432949da4ded4566b326af28a29091ac.zip | |
Buffer Cache: Revert unnecessary range reduction.
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 42 |
1 files changed, 13 insertions, 29 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 33fa5305e..e1dc32e17 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -592,35 +592,19 @@ void BufferCache<P>::CommitAsyncFlushesHigh() { | |||
| 592 | const VAddr cpu_addr_end = interval.upper(); | 592 | const VAddr cpu_addr_end = interval.upper(); |
| 593 | ForEachBufferInRange(cpu_addr, size, [&](BufferId buffer_id, Buffer& buffer) { | 593 | ForEachBufferInRange(cpu_addr, size, [&](BufferId buffer_id, Buffer& buffer) { |
| 594 | boost::container::small_vector<BufferCopy, 1> copies; | 594 | boost::container::small_vector<BufferCopy, 1> copies; |
| 595 | buffer.ForEachDownloadRange( | 595 | buffer.ForEachDownloadRange(cpu_addr, size, true, |
| 596 | cpu_addr, size, false, [&](u64 range_offset, u64 range_size) { | 596 | [&](u64 range_offset, u64 range_size) { |
| 597 | VAddr cpu_addr_base = buffer.CpuAddr() + range_offset; | 597 | downloads.push_back({ |
| 598 | VAddr cpu_addr_end2 = cpu_addr_base + range_size; | 598 | BufferCopy{ |
| 599 | const s64 difference = s64(cpu_addr_end2 - cpu_addr_end); | 599 | .src_offset = range_offset, |
| 600 | cpu_addr_end2 -= u64(std::max<s64>(difference, 0)); | 600 | .dst_offset = total_size_bytes, |
| 601 | const s64 difference2 = s64(cpu_addr - cpu_addr_base); | 601 | .size = range_size, |
| 602 | cpu_addr_base += u64(std::max<s64>(difference2, 0)); | 602 | }, |
| 603 | const u64 new_size = cpu_addr_end2 - cpu_addr_base; | 603 | buffer_id, |
| 604 | const u64 new_offset = cpu_addr_base - buffer.CpuAddr(); | 604 | }); |
| 605 | downloads.push_back({ | 605 | total_size_bytes += range_size; |
| 606 | BufferCopy{ | 606 | largest_copy = std::max(largest_copy, range_size); |
| 607 | .src_offset = new_offset, | 607 | }); |
| 608 | .dst_offset = total_size_bytes, | ||
| 609 | .size = new_size, | ||
| 610 | }, | ||
| 611 | buffer_id, | ||
| 612 | }); | ||
| 613 | total_size_bytes += new_size; | ||
| 614 | largest_copy = std::max(largest_copy, new_size); | ||
| 615 | constexpr u64 align_mask = ~(32ULL - 1); | ||
| 616 | const VAddr align_up_address = (cpu_addr_base + 31) & align_mask; | ||
| 617 | const u64 difference_base = align_up_address - cpu_addr_base; | ||
| 618 | if (difference_base > new_size) { | ||
| 619 | return; | ||
| 620 | } | ||
| 621 | const u64 fixed_size = new_size - difference_base; | ||
| 622 | buffer.UnmarkRegionAsGpuModified(align_up_address, fixed_size & align_mask); | ||
| 623 | }); | ||
| 624 | }); | 608 | }); |
| 625 | } | 609 | } |
| 626 | } | 610 | } |