From 20bd5c6e1cbf90a4d731827223a21e16c235c6b3 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Mon, 21 Oct 2019 17:41:14 +0900 Subject: [PATCH] (Vector) Ensure to release VectorRenderer in the main thread Change-Id: Ie7a6798f92a55124a14b04df622b62549347ecfa --- .../animated-vector-image-visual.cpp | 8 +++--- .../vector-animation-task.cpp | 29 ++++++++++++++++++---- .../animated-vector-image/vector-animation-task.h | 5 ++++ .../vector-animation-thread.cpp | 4 +-- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index ea4dee5..122d407 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -119,6 +119,8 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor AnimatedVectorImageVisual::~AnimatedVectorImageVisual() { + // Finalize animation task in the main thread + mVectorAnimationTask->Finalize(); } void AnimatedVectorImageVisual::GetNaturalSize( Vector2& naturalSize ) @@ -462,11 +464,11 @@ void AnimatedVectorImageVisual::OnUploadCompleted() { actor.AddRenderer( mImpl->mRenderer ); mRendererAdded = true; - } - ResourceReady( Toolkit::Visual::ResourceStatus::READY ); + ResourceReady( Toolkit::Visual::ResourceStatus::READY ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnUploadCompleted: Renderer is added [%p]\n", this ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnUploadCompleted: Renderer is added [%p]\n", this ); + } } void AnimatedVectorImageVisual::OnAnimationFinished() diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp index db42b67..ac89867 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp @@ -92,6 +92,17 @@ VectorAnimationTask::~VectorAnimationTask() DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::~VectorAnimationTask: destructor [%p]\n", this ); } +void VectorAnimationTask::Finalize() +{ + // Release some objects in the main thread + if( mAnimationFinishedTrigger ) + { + mAnimationFinishedTrigger.reset(); + } + + mVectorRenderer.Reset(); +} + void VectorAnimationTask::SetRenderer( Renderer renderer ) { ConditionalWait::ScopedLock lock( mConditionalWait ); @@ -170,7 +181,10 @@ void VectorAnimationTask::RenderFrame() void VectorAnimationTask::SetAnimationFinishedCallback( EventThreadCallback* callback ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mAnimationFinishedTrigger = std::unique_ptr< EventThreadCallback >( callback ); + if( callback ) + { + mAnimationFinishedTrigger = std::unique_ptr< EventThreadCallback >( callback ); + } } void VectorAnimationTask::SetLoopCount( int32_t count ) @@ -276,6 +290,7 @@ void VectorAnimationTask::SetCurrentFrameNumber( uint32_t frameNumber ) mCurrentFrame = frameNumber; mCurrentFrameUpdated = true; + mUpdateFrameNumber = false; mResourceReady = false; DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetCurrentFrameNumber: frame number = %d [%p]\n", mCurrentFrame, this ); @@ -434,11 +449,15 @@ bool VectorAnimationTask::Rasterize() } // Rasterize - bool renderSuccess = mVectorRenderer.Render( currentFrame ); - if( !renderSuccess ) + bool renderSuccess = false; + if( mVectorRenderer ) { - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Rendering failed. Try again later.[%d] [%p]\n", currentFrame, this ); - mUpdateFrameNumber = false; + renderSuccess = mVectorRenderer.Render( currentFrame ); + if( !renderSuccess ) + { + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Rendering failed. Try again later.[%d] [%p]\n", currentFrame, this ); + mUpdateFrameNumber = false; + } } if( stopped && renderSuccess ) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h index 4f6f83a..a16faea 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h @@ -64,6 +64,11 @@ public: virtual ~VectorAnimationTask(); /** + * @brief Finalizes the task. + */ + void Finalize(); + + /** * @brief Sets the renderer used to display the result image. * * @param[in] renderer The renderer used to display the result image diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp index df39c1e..8403e6a 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp @@ -119,7 +119,7 @@ void VectorAnimationThread::OnTaskCompleted( VectorAnimationTaskPtr task, bool k { ConditionalWait::ScopedLock lock( mConditionalWait ); - if( mAnimationTasks.end() == std::find( mAnimationTasks.begin(), mAnimationTasks.end(), task ) ) + if( mCompletedTasks.end() == std::find( mCompletedTasks.begin(), mCompletedTasks.end(), task ) ) { mCompletedTasks.push_back( task ); @@ -192,7 +192,7 @@ void VectorAnimationThread::Rasterize() mCompletedTasks.clear(); // pop out the next task from the queue - if( !mAnimationTasks.empty() && !mNeedToSleep ) + while( !mAnimationTasks.empty() && !mNeedToSleep ) { std::vector< VectorAnimationTaskPtr >::iterator next = mAnimationTasks.begin(); VectorAnimationTaskPtr nextTask = *next; -- 2.7.4