summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/lru_cache.h23
-rw-r--r--src/video_core/buffer_cache/buffer_base.h9
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h6
-rw-r--r--src/video_core/texture_cache/image_base.h2
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:
29 ~LeastRecentlyUsedCache() = default; 29 ~LeastRecentlyUsedCache() = default;
30 30
31 size_t Insert(ObjectType obj, TickType tick) { 31 size_t Insert(ObjectType obj, TickType tick) {
32 const auto new_id = build(); 32 const auto new_id = Build();
33 auto& item = item_pool[new_id]; 33 auto& item = item_pool[new_id];
34 item.obj = obj; 34 item.obj = obj;
35 item.tick = tick; 35 item.tick = tick;
36 attach(item); 36 Attach(item);
37 return new_id; 37 return new_id;
38 } 38 }
39 39
@@ -46,13 +46,13 @@ public:
46 if (&item == last_item) { 46 if (&item == last_item) {
47 return; 47 return;
48 } 48 }
49 detach(item); 49 Detach(item);
50 attach(item); 50 Attach(item);
51 } 51 }
52 52
53 void Free(size_t id) { 53 void Free(size_t id) {
54 auto& item = item_pool[id]; 54 auto& item = item_pool[id];
55 detach(item); 55 Detach(item);
56 item.prev = nullptr; 56 item.prev = nullptr;
57 item.next = nullptr; 57 item.next = nullptr;
58 free_items.push_back(id); 58 free_items.push_back(id);
@@ -80,11 +80,10 @@ public:
80 } 80 }
81 81
82private: 82private:
83 size_t build() { 83 size_t Build() {
84 if (free_items.empty()) { 84 if (free_items.empty()) {
85 const size_t item_id = item_pool.size(); 85 const size_t item_id = item_pool.size();
86 item_pool.emplace_back(); 86 auto& item = item_pool.emplace_back();
87 auto& item = item_pool[item_id];
88 item.next = nullptr; 87 item.next = nullptr;
89 item.prev = nullptr; 88 item.prev = nullptr;
90 return item_id; 89 return item_id;
@@ -97,7 +96,7 @@ private:
97 return item_id; 96 return item_id;
98 } 97 }
99 98
100 void attach(Item& item) { 99 void Attach(Item& item) {
101 if (!first_item) { 100 if (!first_item) {
102 first_item = &item; 101 first_item = &item;
103 } 102 }
@@ -111,7 +110,7 @@ private:
111 } 110 }
112 } 111 }
113 112
114 void detach(Item& item) { 113 void Detach(Item& item) {
115 if (item.prev) { 114 if (item.prev) {
116 item.prev->next = item.next; 115 item.prev->next = item.next;
117 } 116 }
@@ -134,8 +133,8 @@ private:
134 133
135 std::deque<Item> item_pool; 134 std::deque<Item> item_pool;
136 std::deque<size_t> free_items; 135 std::deque<size_t> free_items;
137 Item* first_item; 136 Item* first_item{};
138 Item* last_item; 137 Item* last_item{};
139}; 138};
140 139
141} // namespace Common 140} // 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:
297 return words.size_bytes; 297 return words.size_bytes;
298 } 298 }
299 299
300 size_t lru_id; 300 size_t getLRUID() const noexcept {
301 return lru_id;
302 }
303
304 void setLRUID(size_t lru_id_) {
305 lru_id = lru_id_;
306 }
301 307
302private: 308private:
303 template <Type type> 309 template <Type type>
@@ -597,6 +603,7 @@ private:
597 Words words; 603 Words words;
598 BufferFlagBits flags{}; 604 BufferFlagBits flags{};
599 int stream_score = 0; 605 int stream_score = 0;
606 size_t lru_id = SIZE_MAX;
600}; 607};
601 608
602} // namespace VideoCommon 609} // 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) {
1539 const auto size = buffer.SizeBytes(); 1539 const auto size = buffer.SizeBytes();
1540 if (insert) { 1540 if (insert) {
1541 total_used_memory += Common::AlignUp(size, 1024); 1541 total_used_memory += Common::AlignUp(size, 1024);
1542 buffer.lru_id = lru_cache.Insert(buffer_id, frame_tick); 1542 buffer.setLRUID(lru_cache.Insert(buffer_id, frame_tick));
1543 } else { 1543 } else {
1544 total_used_memory -= Common::AlignUp(size, 1024); 1544 total_used_memory -= Common::AlignUp(size, 1024);
1545 lru_cache.Free(buffer.lru_id); 1545 lru_cache.Free(buffer.getLRUID());
1546 } 1546 }
1547 const VAddr cpu_addr_begin = buffer.CpuAddr(); 1547 const VAddr cpu_addr_begin = buffer.CpuAddr();
1548 const VAddr cpu_addr_end = cpu_addr_begin + size; 1548 const VAddr cpu_addr_end = cpu_addr_begin + size;
@@ -1560,7 +1560,7 @@ void BufferCache<P>::ChangeRegister(BufferId buffer_id) {
1560template <class P> 1560template <class P>
1561void BufferCache<P>::TouchBuffer(Buffer& buffer, BufferId buffer_id) noexcept { 1561void BufferCache<P>::TouchBuffer(Buffer& buffer, BufferId buffer_id) noexcept {
1562 if (buffer_id != NULL_BUFFER_ID) { 1562 if (buffer_id != NULL_BUFFER_ID) {
1563 lru_cache.Touch(buffer.lru_id, frame_tick); 1563 lru_cache.Touch(buffer.getLRUID(), frame_tick);
1564 } 1564 }
1565} 1565}
1566 1566
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 {
80 VAddr cpu_addr_end = 0; 80 VAddr cpu_addr_end = 0;
81 81
82 u64 modification_tick = 0; 82 u64 modification_tick = 0;
83 size_t lru_index = ~0; 83 size_t lru_index = SIZE_MAX;
84 84
85 std::array<u32, MAX_MIP_LEVELS> mip_level_offsets{}; 85 std::array<u32, MAX_MIP_LEVELS> mip_level_offsets{};
86 86