summaryrefslogtreecommitdiff
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-07-07 20:45:33 +0200
committerGravatar Fernando Sahmkow2021-07-09 22:20:36 +0200
commitf75544a9432949da4ded4566b326af28a29091ac (patch)
treec85440bdbafe8c1a9ab4eb00c1a84a326da25277 /src/video_core/buffer_cache
parentFence Manager: Force ordering on WFI. (diff)
downloadyuzu-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.h42
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 }