{
const char* VERSION_SEPARATOR = "-";
const char* SHADER_SUFFIX = ".dali-bin";
+
+constexpr uint32_t MAXIMUM_STRING_SHADER_DATA_CACHE_CLEAN_THRESHOLD = 128u;
} // namespace
namespace Dali
}
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:
}
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());
}
}
// Reduce reference before erase
(*iter)->Unreference();
cacheList.Erase(iter);
+
+ --mTotalStringCachedShadersCount;
break;
}
}
}
}
+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
*/
void RemoveStringShaderData(Internal::ShaderData& shaderData);
+ /**
+ * @brief Remove all the string shader data from the cache.
+ */
+ void ResetStringShaderData();
+
// Undefined
ShaderFactory(const ShaderFactory&) = delete;
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)