Revert "[Tizen] Revert "Reset string shader data cache at event thread if too much...
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 16 Oct 2024 06:59:12 +0000 (15:59 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 16 Oct 2024 06:59:12 +0000 (15:59 +0900)
This reverts commit 04e66e6c1218dc12d1c56ddd51c01a2e17a25198.

dali/internal/event/effects/shader-factory.cpp
dali/internal/event/effects/shader-factory.h

index 678ae49710d1d5d89b682dffaad9bb11f2664bfa..f3f54fd7ef86a26f16b4585d66d031b319abc3e8 100644 (file)
@@ -33,6 +33,8 @@ namespace
 {
 const char* VERSION_SEPARATOR = "-";
 const char* SHADER_SUFFIX     = ".dali-bin";
+
+constexpr uint32_t MAXIMUM_STRING_SHADER_DATA_CACHE_CLEAN_THRESHOLD = 128u;
 } // namespace
 
 namespace Dali
@@ -188,6 +190,11 @@ void ShaderFactory::MemoryCacheInsert(ShaderData& shaderData, const bool isBinar
   }
   else
   {
+    if(DALI_UNLIKELY(mTotalStringCachedShadersCount >= MAXIMUM_STRING_SHADER_DATA_CACHE_CLEAN_THRESHOLD))
+    {
+      // Reset string cache, to avoid memory leak problem.
+      ResetStringShaderData();
+    }
     auto& cacheList = mShaderStringCache[shaderHash]; ///< Get or create a new cache list.
 
     // Ignore shaderdata with string if it already exists:
@@ -202,6 +209,8 @@ void ShaderFactory::MemoryCacheInsert(ShaderData& shaderData, const bool isBinar
     }
     shaderData.Reference();
     cacheList.PushBack(&shaderData);
+
+    ++mTotalStringCachedShadersCount;
     DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "CACHED NON-BINARY SHADER FOR HASH: %u, HINT: %d, TAG: %u\n", shaderHash, static_cast<int>(shaderData.GetHints()), shaderData.GetRenderPassTag());
   }
 }
@@ -222,6 +231,8 @@ void ShaderFactory::RemoveStringShaderData(ShaderData& shaderData)
         // Reduce reference before erase
         (*iter)->Unreference();
         cacheList.Erase(iter);
+
+        --mTotalStringCachedShadersCount;
         break;
       }
     }
@@ -232,6 +243,25 @@ void ShaderFactory::RemoveStringShaderData(ShaderData& shaderData)
   }
 }
 
+void ShaderFactory::ResetStringShaderData()
+{
+  DALI_LOG_RELEASE_INFO("Trigger StringShaderData GC. shader : [%u]\n", mTotalStringCachedShadersCount);
+  for(auto&& iter : mShaderStringCache)
+  {
+    auto& cacheList = iter.second;
+    for(auto&& shaderData : cacheList)
+    {
+      shaderData->Unreference();
+    }
+  }
+
+  // Reset cache after unreference.
+  mShaderStringCache.clear();
+
+  mTotalStringCachedShadersCount = 0u;
+  DALI_LOG_RELEASE_INFO("StringShaderData GC done\n");
+}
+
 } // namespace Internal
 
 } // namespace Dali
index 0662c31c78e5ce3b1ff4dad9930259bc70f082c2..afadccd8fcb9cbb84a1253f9f904c91e326e9000 100644 (file)
@@ -90,6 +90,11 @@ private:
    */
   void RemoveStringShaderData(Internal::ShaderData& shaderData);
 
+  /**
+   * @brief Remove all the string shader data from the cache.
+   */
+  void ResetStringShaderData();
+
   // Undefined
   ShaderFactory(const ShaderFactory&) = delete;
 
@@ -102,6 +107,8 @@ private:
   ShaderCacheContainer mShaderBinaryCache; ///< Cache of pre-compiled shaders.
   ShaderCacheContainer mShaderStringCache; ///< Cache of non-pre-compiled shaders. (TODO : Could we clean up this cache by user management?)
 
+  uint32_t mTotalStringCachedShadersCount{0u}; ///< Total number of cached shaders that are not pre-compiled.
+
 }; // class ShaderFactory
 
 inline MessageBase* ShaderCompiledMessage(ShaderSaver& factory, Internal::ShaderDataPtr shaderData)