From 3ce5a68cd12e45d7b618c49e205936fb140ecbfe Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 4 May 2022 20:55:13 +0200 Subject: guiScalingFilter: Fix most memory leaks (#12256) Calls to the cache function ended up creating a new texture regardless whether the texture is already cached. --- src/client/client.cpp | 2 ++ src/client/guiscalingfilter.cpp | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 0a1fc73d1..cb556c1ce 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -334,6 +334,8 @@ Client::~Client() // cleanup 3d model meshes on client shutdown m_rendering_engine->cleanupMeshCache(); + guiScalingCacheClear(); + delete m_minimap; m_minimap = nullptr; diff --git a/src/client/guiscalingfilter.cpp b/src/client/guiscalingfilter.cpp index 232219237..de122becf 100644 --- a/src/client/guiscalingfilter.cpp +++ b/src/client/guiscalingfilter.cpp @@ -43,6 +43,10 @@ void guiScalingCache(const io::path &key, video::IVideoDriver *driver, video::II { if (!g_settings->getBool("gui_scaling_filter")) return; + + if (g_imgCache.find(key) != g_imgCache.end()) + return; // Already cached. + video::IImage *copied = driver->createImage(value->getColorFormat(), value->getDimension()); value->copyTo(copied); @@ -90,14 +94,16 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver, io::path scalename = origname + "@guiScalingFilter:" + rectstr; // Search for existing scaled texture. - video::ITexture *scaled = g_txrCache[scalename]; + auto it_txr = g_txrCache.find(scalename); + video::ITexture *scaled = (it_txr != g_txrCache.end()) ? it_txr->second : nullptr; if (scaled) return scaled; // Try to find the texture converted to an image in the cache. // If the image was not found, try to extract it from the texture. - video::IImage* srcimg = g_imgCache[origname]; - if (srcimg == NULL) { + auto it_img = g_imgCache.find(origname); + video::IImage *srcimg = (it_img != g_imgCache.end()) ? it_img->second : nullptr; + if (!srcimg) { if (!g_settings->getBool("gui_scaling_filter_txr2img")) return src; srcimg = driver->createImageFromData(src->getColorFormat(), -- cgit v1.2.3