Destroy Render::Texture after OnRenderFinished 02/296102/3
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 20 Jul 2023 01:36:11 +0000 (10:36 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Sat, 22 Jul 2023 05:04:38 +0000 (14:04 +0900)
Since we can call OnRenderFinished even if this Render::Texture destroyed,
Let we keep alive until OnRenderFinished callback called.

Change-Id: Ia67a554fb8e98b5b4e1da6055bcdbc9058a5eb5d
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/render/common/render-manager.cpp

index 7907982..b0198a3 100644 (file)
@@ -192,6 +192,8 @@ struct RenderManager::Impl
 
   OrderedSet<Render::RenderTracker> mRenderTrackers; ///< List of owned render trackers
 
+  OwnerKeyContainer<Render::Texture> textureDiscardQueue;  ///< Discarded textures
+
   ProgramController   programController; ///< Owner of the programs
   Render::ShaderCache shaderCache;       ///< The cache for the graphics shaders
 
@@ -286,8 +288,8 @@ void RenderManager::RemoveTexture(const Render::TextureKey& textureKey)
 
   if(iter != mImpl->textureContainer.End())
   {
-    textureKey->Destroy();
-    mImpl->textureContainer.Erase(iter); // Texture found; now destroy it
+    // Transfer ownership to the discard queue, this keeps the object alive, until the render-thread has finished with it
+    mImpl->textureDiscardQueue.PushBack(mImpl->textureContainer.Release(iter));
   }
 }
 
@@ -1116,6 +1118,13 @@ void RenderManager::PostRender()
   }
   mImpl->updatedTextures.Clear();
 
+  // Remove discarded textures after OnRenderFinished called
+  for(auto& iter : mImpl->textureDiscardQueue)
+  {
+    iter->Destroy();
+  }
+  mImpl->textureDiscardQueue.Clear();
+
   mImpl->UpdateTrackers();
 
   uint32_t count = 0u;