Ensure updatedTextures call OnRenderFinished safety 79/319879/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 5 Nov 2024 04:36:18 +0000 (13:36 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 5 Nov 2024 04:48:52 +0000 (13:48 +0900)
Since we can change the updatedTextures container during OnRenderFinished() callback,
we need to move OnRenderFinished() caller into seperated container.

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

index ab27634ee7b0fee277092ce87189ce5136f103a7..2df07bdf4d8d7e16d4fd8e2b8607c8c98559a765 100644 (file)
@@ -1303,8 +1303,7 @@ void RenderManager::RenderScene(Integration::RenderStatus& status, Integration::
 
   if(targetsToPresent.size() > 0u)
   {
-    DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_RENDER_FINISHED", [&](std::ostringstream& oss)
-                                            { oss << "[" << targetsToPresent.size() << "]"; });
+    DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_RENDER_FINISHED", [&](std::ostringstream& oss) { oss << "[" << targetsToPresent.size() << "]"; });
   }
 
   // Flush UBOs
@@ -1350,11 +1349,16 @@ void RenderManager::PostRender()
   }
 
   // Notify updated RenderTexture that rendering has finished
-  for(auto&& iter : mImpl->updatedTextures)
+  // Note : updatedTextures could be added during OnRenderFinished
+  while(!mImpl->updatedTextures.Empty())
   {
-    iter->OnRenderFinished();
+    auto updatedTextures = std::move(mImpl->updatedTextures);
+    mImpl->updatedTextures.Clear();
+    for(auto&& iter : updatedTextures)
+    {
+      iter->OnRenderFinished();
+    }
   }
-  mImpl->updatedTextures.Clear();
 
   // Remove discarded textures after OnRenderFinished called
   mImpl->textureDiscardQueue.Clear();