[Tizen] Fix bug that Dali::Texture destroyed at worker thread 14/304314/3
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 16 Jan 2024 02:51:06 +0000 (11:51 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 16 Jan 2024 02:59:40 +0000 (11:59 +0900)
If SetSize() API comes multiple times before Event thread comes,
The mPreviousTexture might be released at workerthread.

It might make some Render::Texture leak.

Change-Id: I94e36ac81cc4bf9bbebc0b3b9d3ce89187390b15
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-tizen.h

index 8ce4542..3d0b32e 100644 (file)
@@ -52,7 +52,7 @@ Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New(Debug::NoLogging,
 VectorAnimationRendererTizen::VectorAnimationRendererTizen()
 : mBuffers(),
   mRenderedTexture(),
-  mPreviousTexture(),
+  mPreviousTextures(),
   mTargetSurface(),
   mTbmQueue(NULL)
 {
@@ -191,7 +191,8 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
 
   if(!mResourceReady)
   {
-    mPreviousTexture        = mRenderedTexture; // It is used to destroy the object in the main thread.
+    mPreviousTextures.push_back(mRenderedTexture); // It is used to destroy the object in the main thread.
+
     mRenderedTexture        = mTexture;
     mResourceReady          = true;
     mResourceReadyTriggered = true;
@@ -272,7 +273,7 @@ void VectorAnimationRendererTizen::ResetBuffers()
 void VectorAnimationRendererTizen::OnFinalize()
 {
   mRenderedTexture.Reset();
-  mPreviousTexture.Reset();
+  mPreviousTextures.clear();
 
   mTargetSurface = nullptr;
   mTbmQueue      = NULL;
@@ -283,7 +284,7 @@ void VectorAnimationRendererTizen::OnSetSize()
   mTbmQueue = AnyCast<tbm_surface_queue_h>(mTargetSurface->GetNativeImageSourceQueue());
 
   // Reset the previous texture to destroy it in the main thread
-  mPreviousTexture.Reset();
+  mPreviousTextures.clear();
 }
 
 void VectorAnimationRendererTizen::PrepareTarget()
index ce82262..98448b0 100644 (file)
@@ -108,10 +108,10 @@ private:
 
   std::vector<SurfacePair> mBuffers; ///< EGL Image vector
 
-  Dali::Texture             mRenderedTexture; ///< Rendered Texture
-  Dali::Texture             mPreviousTexture; ///< Previous rendered texture
-  NativeImageSourceQueuePtr mTargetSurface;   ///< The target surface
-  tbm_surface_queue_h       mTbmQueue;        ///< Tbm surface queue handle
+  Dali::Texture              mRenderedTexture;  ///< Rendered Texture
+  std::vector<Dali::Texture> mPreviousTextures; ///< Previous rendered texture
+  NativeImageSourceQueuePtr  mTargetSurface;    ///< The target surface
+  tbm_surface_queue_h        mTbmQueue;         ///< Tbm surface queue handle
 };
 
 } // namespace Plugin