(Vector) Ensure release RenderingData at main thread 58/312358/2
authorEunki Hong <eunkiki.hong@samsung.com>
Fri, 7 Jun 2024 06:55:53 +0000 (15:55 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Fri, 7 Jun 2024 08:30:30 +0000 (17:30 +0900)
Let we ensure to release the RenderingData at main thread, instead of Render() time.

(Since RenderingDataImpl could have reference count at Render time. And it might be released
at worker thread timing if Finalize() API called after Render().

Change-Id: I85a725c7a356d56567009e5c3d131a6db206c9c1
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp
dali-extension/vector-animation-renderer/vector-animation-renderer-x.cpp
dali-extension/vector-animation-renderer/vector-animation-renderer.cpp

index bf5b016eaa73c08ed7d5d9eb0831aadfaabb3f60..1a65ac1a6ae7e4846d66235a63f78516f0920339 100644 (file)
@@ -96,6 +96,12 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
   }
 
   Dali::Mutex::ScopedLock lock(mMutex);
+  if(DALI_UNLIKELY(mFinalized))
+  {
+    // Fast-out if finalized.
+    return false;
+  }
+
   if(mEnableFixedCache)
   {
     if(mDecodedBuffers.size() < mTotalFrameNumber)
@@ -219,7 +225,9 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
   {
     mPreviousTextures.push_back(mRenderedTexture); // It is used to destroy the object in the main thread.
 
-    mRenderedTexture        = renderingDataImpl->mTexture;
+    mRenderedTexture = std::move(renderingDataImpl->mTexture);
+    renderingDataImpl->mTexture.Reset();
+
     mResourceReady          = true;
     mResourceReadyTriggered = true;
 
index ead555c9b27479576135867d1bc764071cd95d86..8566eb90763eab813bc1642e4811a0dc16cf4908 100644 (file)
@@ -66,6 +66,7 @@ VectorAnimationRendererX::~VectorAnimationRendererX()
   DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "this = %p\n", this);
 }
 
+// Called by VectorAnimationTaskThread
 bool VectorAnimationRendererX::Render(uint32_t frameNumber)
 {
   std::shared_ptr<RenderingDataImpl> renderingDataImpl;
index cd3f6ebe9ef581b19ef3632d2e1cefa2d8d74dac..13489f0fa8775526d7268a054a33efe7e62d48f7 100644 (file)
@@ -66,6 +66,8 @@ VectorAnimationRenderer::VectorAnimationRenderer()
 
 VectorAnimationRenderer::~VectorAnimationRenderer()
 {
+  // Ensure the rendering data removed after Render finisehd at VectorAnimationTaskThread.
+  mCurrentRenderingData.reset();
 }
 
 // This Method is called inside mRenderingDataMutex
@@ -89,7 +91,6 @@ void VectorAnimationRenderer::Finalize()
     Dali::Mutex::ScopedLock lock(mRenderingDataMutex);
 
     mPreparedRenderingData.reset();
-    mCurrentRenderingData.reset();
     ClearPreviousRenderingData();
 
     // Change this flag under both mMutex and mRenderingDataMutex