From 28d7c2f5a5089051410d37a03d5a4a42e4230842 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Fri, 10 May 2019 01:10:16 -0300
Subject: [PATCH] texture_cache: Change internal cache from lists to vectors

---
 src/video_core/texture_cache/texture_cache.h | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index fbfd1ff0ba..1c2b63dae6 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -4,11 +4,11 @@
 
 #pragma once
 
-#include <list>
 #include <memory>
 #include <set>
 #include <tuple>
 #include <unordered_map>
+#include <vector>
 
 #include <boost/icl/interval_map.hpp>
 #include <boost/range/iterator_range.hpp>
@@ -172,7 +172,7 @@ public:
             return nullptr;
         }
         const CacheAddr page = cache_addr >> registry_page_bits;
-        std::list<TSurface>& list = registry[page];
+        std::vector<TSurface>& list = registry[page];
         for (auto& s : list) {
             if (s->GetCacheAddr() == cache_addr) {
                 return s;
@@ -482,7 +482,8 @@ private:
         CacheAddr start = surface->GetCacheAddr() >> registry_page_bits;
         const CacheAddr end = (surface->GetCacheAddrEnd() - 1) >> registry_page_bits;
         while (start <= end) {
-            registry[start].remove(surface);
+            auto& reg{registry[start]};
+            reg.erase(std::find(reg.begin(), reg.end(), surface));
             start++;
         }
     }
@@ -496,7 +497,7 @@ private:
         const CacheAddr end = (cache_addr_end - 1) >> registry_page_bits;
         std::vector<TSurface> surfaces;
         while (start <= end) {
-            std::list<TSurface>& list = registry[start];
+            std::vector<TSurface>& list = registry[start];
             for (auto& s : list) {
                 if (!s->IsPicked() && s->Overlaps(cache_addr, cache_addr_end)) {
                     s->MarkAsPicked(true);
@@ -553,12 +554,12 @@ private:
     // large in size.
     static constexpr u64 registry_page_bits{20};
     static constexpr u64 registry_page_size{1 << registry_page_bits};
-    std::unordered_map<CacheAddr, std::list<TSurface>> registry;
+    std::unordered_map<CacheAddr, std::vector<TSurface>> registry;
 
     /// The surface reserve is a "backup" cache, this is where we put unique surfaces that have
     /// previously been used. This is to prevent surfaces from being constantly created and
     /// destroyed when used with different surface parameters.
-    std::unordered_map<SurfaceParams, std::list<TSurface>> surface_reserve;
+    std::unordered_map<SurfaceParams, std::vector<TSurface>> surface_reserve;
     std::array<RenderInfo, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> render_targets;
     DepthBufferInfo depth_buffer;
 
-- 
GitLab