[Tizen] Reset to "Reset string shader data cache~" 82/318982/1
authorSeungho Baek <sbsh.baek@samsung.com>
Fri, 11 Oct 2024 11:04:06 +0000 (20:04 +0900)
committerSeungho Baek <sbsh.baek@samsung.com>
Fri, 11 Oct 2024 11:04:06 +0000 (20:04 +0900)
Change-Id: Ie6b526a878403ca2bb44fb84c5d710954871dab5
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
dali/internal/event/effects/shader-factory.cpp
dali/internal/event/effects/shader-factory.h

index 678ae49..f3f54fd 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 0662c31..afadccd 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)