From ff48f06fb92e5fe2105fd6b4c5d4f57bbb2714c7 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Sun, 29 Aug 2021 18:19:53 +0200
Subject: [PATCH] Garbage Collection: Adress Feedback.

---
 src/common/lru_cache.h                     | 23 +++++++++++-----------
 src/video_core/buffer_cache/buffer_base.h  |  9 ++++++++-
 src/video_core/buffer_cache/buffer_cache.h |  6 +++---
 src/video_core/texture_cache/image_base.h  |  2 +-
 4 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/src/common/lru_cache.h b/src/common/lru_cache.h
index 048e9c3da..365488ba5 100644
--- a/src/common/lru_cache.h
+++ b/src/common/lru_cache.h
@@ -29,11 +29,11 @@ public:
     ~LeastRecentlyUsedCache() = default;
 
     size_t Insert(ObjectType obj, TickType tick) {
-        const auto new_id = build();
+        const auto new_id = Build();
         auto& item = item_pool[new_id];
         item.obj = obj;
         item.tick = tick;
-        attach(item);
+        Attach(item);
         return new_id;
     }
 
@@ -46,13 +46,13 @@ public:
         if (&item == last_item) {
             return;
         }
-        detach(item);
-        attach(item);
+        Detach(item);
+        Attach(item);
     }
 
     void Free(size_t id) {
         auto& item = item_pool[id];
-        detach(item);
+        Detach(item);
         item.prev = nullptr;
         item.next = nullptr;
         free_items.push_back(id);
@@ -80,11 +80,10 @@ public:
     }
 
 private:
-    size_t build() {
+    size_t Build() {
         if (free_items.empty()) {
             const size_t item_id = item_pool.size();
-            item_pool.emplace_back();
-            auto& item = item_pool[item_id];
+            auto& item = item_pool.emplace_back();
             item.next = nullptr;
             item.prev = nullptr;
             return item_id;
@@ -97,7 +96,7 @@ private:
         return item_id;
     }
 
-    void attach(Item& item) {
+    void Attach(Item& item) {
         if (!first_item) {
             first_item = &item;
         }
@@ -111,7 +110,7 @@ private:
         }
     }
 
-    void detach(Item& item) {
+    void Detach(Item& item) {
         if (item.prev) {
             item.prev->next = item.next;
         }
@@ -134,8 +133,8 @@ private:
 
     std::deque<Item> item_pool;
     std::deque<size_t> free_items;
-    Item* first_item;
-    Item* last_item;
+    Item* first_item{};
+    Item* last_item{};
 };
 
 } // namespace Common
diff --git a/src/video_core/buffer_cache/buffer_base.h b/src/video_core/buffer_cache/buffer_base.h
index 4b696a60f..18a3390c0 100644
--- a/src/video_core/buffer_cache/buffer_base.h
+++ b/src/video_core/buffer_cache/buffer_base.h
@@ -297,7 +297,13 @@ public:
         return words.size_bytes;
     }
 
-    size_t lru_id;
+    size_t getLRUID() const noexcept {
+      return lru_id;
+    }
+
+    void setLRUID(size_t lru_id_) {
+      lru_id = lru_id_;
+    }
 
 private:
     template <Type type>
@@ -597,6 +603,7 @@ private:
     Words words;
     BufferFlagBits flags{};
     int stream_score = 0;
+    size_t lru_id = SIZE_MAX;
 };
 
 } // namespace VideoCommon
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index e40aa7fe6..617435968 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -1539,10 +1539,10 @@ void BufferCache<P>::ChangeRegister(BufferId buffer_id) {
     const auto size = buffer.SizeBytes();
     if (insert) {
         total_used_memory += Common::AlignUp(size, 1024);
-        buffer.lru_id = lru_cache.Insert(buffer_id, frame_tick);
+        buffer.setLRUID(lru_cache.Insert(buffer_id, frame_tick));
     } else {
         total_used_memory -= Common::AlignUp(size, 1024);
-        lru_cache.Free(buffer.lru_id);
+        lru_cache.Free(buffer.getLRUID());
     }
     const VAddr cpu_addr_begin = buffer.CpuAddr();
     const VAddr cpu_addr_end = cpu_addr_begin + size;
@@ -1560,7 +1560,7 @@ void BufferCache<P>::ChangeRegister(BufferId buffer_id) {
 template <class P>
 void BufferCache<P>::TouchBuffer(Buffer& buffer, BufferId buffer_id) noexcept {
     if (buffer_id != NULL_BUFFER_ID) {
-        lru_cache.Touch(buffer.lru_id, frame_tick);
+        lru_cache.Touch(buffer.getLRUID(), frame_tick);
     }
 }
 
diff --git a/src/video_core/texture_cache/image_base.h b/src/video_core/texture_cache/image_base.h
index 662089e3d..0c17a791b 100644
--- a/src/video_core/texture_cache/image_base.h
+++ b/src/video_core/texture_cache/image_base.h
@@ -80,7 +80,7 @@ struct ImageBase {
     VAddr cpu_addr_end = 0;
 
     u64 modification_tick = 0;
-    size_t lru_index = ~0;
+    size_t lru_index = SIZE_MAX;
 
     std::array<u32, MAX_MIP_LEVELS> mip_level_offsets{};