Stop wasting memory on identical textures when texture filtering is disabled
authorsfan5 <sfan5@live.de>
Tue, 19 May 2020 18:45:02 +0000 (20:45 +0200)
committersfan5 <sfan5@live.de>
Wed, 20 May 2020 20:55:51 +0000 (22:55 +0200)
src/client/tile.cpp

index 0fa7a4ae226d7f64f77d73d65ddb0bfd0809774f..d03588b2b727f765143b42ded8755433c20077e4 100644 (file)
@@ -668,7 +668,14 @@ video::ITexture* TextureSource::getTexture(const std::string &name, u32 *id)
 
 video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id)
 {
-       return getTexture(name + "^[applyfiltersformesh", id);
+       static thread_local bool filter_needed =
+               g_settings->getBool("texture_clean_transparent") ||
+               ((m_setting_trilinear_filter || m_setting_bilinear_filter) &&
+               g_settings->getS32("texture_min_size") > 1);
+       // Avoid duplicating texture if it won't actually change
+       if (filter_needed)
+               return getTexture(name + "^[applyfiltersformesh", id);
+       return getTexture(name, id);
 }
 
 Palette* TextureSource::getPalette(const std::string &name)
@@ -1623,6 +1630,9 @@ bool TextureSource::generateImagePart(std::string part_of_name,
                */
                else if (str_starts_with(part_of_name, "[applyfiltersformesh"))
                {
+                       /* IMPORTANT: When changing this, getTextureForMesh() needs to be
+                        * updated too. */
+
                        // Apply the "clean transparent" filter, if configured.
                        if (g_settings->getBool("texture_clean_transparent"))
                                imageCleanTransparent(baseimg, 127);