summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-08-22 04:04:54 +0200
committerbunnei <bunneidev@gmail.com>2018-08-23 17:27:01 +0200
commitfee8bdd90c3c8fd61385a84152cf22c107013747 (patch)
tree9caf027e0cd39ef3f71d9ae46dda9aa31e458282 /src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
parentgl_rasterizer_cache: Remove assert for RecreateSurface type. (diff)
downloadyuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar.gz
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar.bz2
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar.lz
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar.xz
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.tar.zst
yuzu-fee8bdd90c3c8fd61385a84152cf22c107013747.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index a13c1d97d..10b2d8f3c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -787,10 +787,20 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool pres
}
}
+ // Try to get a previously reserved surface
+ surface = TryGetReservedSurface(params);
+
// No surface found - create a new one
- surface = std::make_shared<CachedSurface>(params);
- RegisterSurface(surface);
- LoadSurface(surface);
+ if (!surface) {
+ surface = std::make_shared<CachedSurface>(params);
+ ReserveSurface(surface);
+ RegisterSurface(surface);
+ }
+
+ // Only load surface from memory if we care about the contents
+ if (preserve_contents) {
+ LoadSurface(surface);
+ }
return surface;
}
@@ -940,6 +950,21 @@ void RasterizerCacheOpenGL::UnregisterSurface(const Surface& surface) {
surface_cache.erase(search);
}
+void RasterizerCacheOpenGL::ReserveSurface(const Surface& surface) {
+ const auto& surface_reserve_key{SurfaceReserveKey::Create(surface->GetSurfaceParams())};
+ surface_reserve[surface_reserve_key] = surface;
+}
+
+Surface RasterizerCacheOpenGL::TryGetReservedSurface(const SurfaceParams& params) {
+ const auto& surface_reserve_key{SurfaceReserveKey::Create(params)};
+ auto search{surface_reserve.find(surface_reserve_key)};
+ if (search != surface_reserve.end()) {
+ RegisterSurface(search->second);
+ return search->second;
+ }
+ return {};
+}
+
template <typename Map, typename Interval>
constexpr auto RangeFromInterval(Map& map, const Interval& interval) {
return boost::make_iterator_range(map.equal_range(interval));