Просмотр исходного кода

Buffer Cache: Address Feedback.

Fernando Sahmkow 5 лет назад
Родитель
Сommit
977904dd84

+ 1 - 1
src/tests/video_core/buffer_base.cpp

@@ -536,7 +536,7 @@ TEST_CASE("BufferBase: Cached write downloads") {
     REQUIRE(rasterizer.Count() == 63);
     REQUIRE(rasterizer.Count() == 63);
     buffer.MarkRegionAsGpuModified(c + PAGE, PAGE);
     buffer.MarkRegionAsGpuModified(c + PAGE, PAGE);
     int num = 0;
     int num = 0;
-    buffer.ForEachDownloadRange(c, WORD, true, [&](u64 offset, u64 size) { ++num; });
+    buffer.ForEachDownloadRangeAndClear(c, WORD, [&](u64 offset, u64 size) { ++num; });
     buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; });
     buffer.ForEachUploadRange(c, WORD, [&](u64 offset, u64 size) { ++num; });
     REQUIRE(num == 0);
     REQUIRE(num == 0);
     REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE));
     REQUIRE(!buffer.IsRegionCpuModified(c + PAGE, PAGE));

+ 5 - 0
src/video_core/buffer_cache/buffer_base.h

@@ -235,6 +235,11 @@ public:
         ForEachModifiedRange<Type::GPU>(query_cpu_range, size, clear, func);
         ForEachModifiedRange<Type::GPU>(query_cpu_range, size, clear, func);
     }
     }
 
 
+    template <typename Func>
+    void ForEachDownloadRangeAndClear(VAddr query_cpu_range, u64 size, Func&& func) {
+        ForEachModifiedRange<Type::GPU>(query_cpu_range, size, true, func);
+    }
+
     /// Call 'func' for each GPU modified range and unmark those pages as GPU modified
     /// Call 'func' for each GPU modified range and unmark those pages as GPU modified
     template <typename Func>
     template <typename Func>
     void ForEachDownloadRange(Func&& func) {
     void ForEachDownloadRange(Func&& func) {

+ 4 - 4
src/video_core/buffer_cache/buffer_cache.h

@@ -167,7 +167,7 @@ public:
     /// Return true when a CPU region is modified from the GPU
     /// Return true when a CPU region is modified from the GPU
     [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size);
     [[nodiscard]] bool IsRegionGpuModified(VAddr addr, size_t size);
 
 
-    /// Return true when a CPU region is modified from the GPU
+    /// Return true when a CPU region is modified from the CPU
     [[nodiscard]] bool IsRegionCpuModified(VAddr addr, size_t size);
     [[nodiscard]] bool IsRegionCpuModified(VAddr addr, size_t size);
 
 
     std::mutex mutex;
     std::mutex mutex;
@@ -593,8 +593,8 @@ void BufferCache<P>::CommitAsyncFlushesHigh() {
             const VAddr cpu_addr = interval.lower();
             const VAddr cpu_addr = interval.lower();
             ForEachBufferInRange(cpu_addr, size, [&](BufferId buffer_id, Buffer& buffer) {
             ForEachBufferInRange(cpu_addr, size, [&](BufferId buffer_id, Buffer& buffer) {
                 boost::container::small_vector<BufferCopy, 1> copies;
                 boost::container::small_vector<BufferCopy, 1> copies;
-                buffer.ForEachDownloadRange(
-                    cpu_addr, size, true, [&](u64 range_offset, u64 range_size) {
+                buffer.ForEachDownloadRangeAndClear(
+                    cpu_addr, size, [&](u64 range_offset, u64 range_size) {
                         const VAddr buffer_addr = buffer.CpuAddr();
                         const VAddr buffer_addr = buffer.CpuAddr();
                         const auto add_download = [&](VAddr start, VAddr end) {
                         const auto add_download = [&](VAddr start, VAddr end) {
                             const u64 new_offset = start - buffer_addr;
                             const u64 new_offset = start - buffer_addr;
@@ -1331,7 +1331,7 @@ void BufferCache<P>::DownloadBufferMemory(Buffer& buffer, VAddr cpu_addr, u64 si
     boost::container::small_vector<BufferCopy, 1> copies;
     boost::container::small_vector<BufferCopy, 1> copies;
     u64 total_size_bytes = 0;
     u64 total_size_bytes = 0;
     u64 largest_copy = 0;
     u64 largest_copy = 0;
-    buffer.ForEachDownloadRange(cpu_addr, size, true, [&](u64 range_offset, u64 range_size) {
+    buffer.ForEachDownloadRangeAndClear(cpu_addr, size, [&](u64 range_offset, u64 range_size) {
         const VAddr buffer_addr = buffer.CpuAddr();
         const VAddr buffer_addr = buffer.CpuAddr();
         const auto add_download = [&](VAddr start, VAddr end) {
         const auto add_download = [&](VAddr start, VAddr end) {
             const u64 new_offset = start - buffer_addr;
             const u64 new_offset = start - buffer_addr;