From 42e57a949fa5537ba420256330d288b6faa8cdad Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Thu, 12 Mar 2020 16:38:45 +0900 Subject: [PATCH] Fix a crash of the RenderTask If a source actor or a camera actor of the RenderTask are destoryed, then ensure they are appropriately updated Change-Id: Ifb9db5d14dde2a648df5d9d4bb9e322369c20b5a --- .../event/render-tasks/render-task-impl.cpp | 34 +++++++++++++--------- .../internal/event/render-tasks/render-task-impl.h | 5 ++-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/dali/internal/event/render-tasks/render-task-impl.cpp b/dali/internal/event/render-tasks/render-task-impl.cpp index eb187af..99b74c7 100644 --- a/dali/internal/event/render-tasks/render-task-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-impl.cpp @@ -94,10 +94,10 @@ RenderTaskPtr RenderTask::New( Actor* sourceActor, CameraActor* cameraActor, Ren void RenderTask::SetSourceActor( Actor* actor ) { - mSourceActor = actor; - if ( mSourceActor ) + mSourceActor.SetActor( actor ); + if ( actor ) { - SetSourceNodeMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &mSourceActor->GetNode() ); + SetSourceNodeMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &actor->GetNode() ); } else { @@ -110,7 +110,7 @@ void RenderTask::SetSourceActor( Actor* actor ) Actor* RenderTask::GetSourceActor() const { - return mSourceActor; + return mSourceActor.GetActor(); } void RenderTask::SetExclusive( bool exclusive ) @@ -143,10 +143,10 @@ bool RenderTask::GetInputEnabled() const void RenderTask::SetCameraActor( CameraActor* cameraActor ) { - mCameraActor = cameraActor; - if( mCameraActor ) + mCameraActor.SetActor( cameraActor ); + if( cameraActor ) { - SetCameraMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &mCameraActor->GetNode(), mCameraActor->GetCamera() ); + SetCameraMessage( GetEventThreadServices(), GetRenderTaskSceneObject(), &cameraActor->GetNode(), cameraActor->GetCamera() ); } else { @@ -159,7 +159,11 @@ void RenderTask::SetCameraActor( CameraActor* cameraActor ) CameraActor* RenderTask::GetCameraActor() const { - return mCameraActor; + if( mCameraActor.GetActor() ) + { + return static_cast< CameraActor* >( mCameraActor.GetActor() ); + } + return nullptr; } void RenderTask::SetTargetFrameBuffer( FrameBufferImagePtr image ) @@ -264,9 +268,10 @@ void RenderTask::GetViewport( Viewport& viewPort ) const if ( stage ) { Vector2 size( stage->GetSize() ); - if ( mSourceActor && mSourceActor->OnStage() ) + Actor* sourceActor = mSourceActor.GetActor(); + if ( sourceActor && sourceActor->OnStage() ) { - Scene& scene = mSourceActor->GetScene(); + Scene& scene = sourceActor->GetScene(); size = scene.GetSize(); } @@ -412,9 +417,10 @@ bool RenderTask::TranslateCoordinates( Vector2& screenCoords ) const { Vector2 size( stage->GetSize() ); CameraActor* defaultCamera( &stage->GetDefaultCameraActor() ); - if ( mSourceActor && mSourceActor->OnStage() ) + Actor* sourceActor = mSourceActor.GetActor(); + if ( sourceActor && sourceActor->OnStage() ) { - Scene& scene = mSourceActor->GetScene(); + Scene& scene = sourceActor->GetScene(); size = scene.GetSize(); defaultCamera = &scene.GetDefaultCameraActor(); } @@ -764,8 +770,8 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface RenderTask::RenderTask( const SceneGraph::RenderTask* sceneObject, RenderTaskList& renderTaskList ) : Object( sceneObject ), - mSourceActor( nullptr ), - mCameraActor( nullptr ), + mSourceActor(), + mCameraActor(), mInputMappingActor(), mRenderTaskList( renderTaskList ), mClearColor( Dali::RenderTask::DEFAULT_CLEAR_COLOR ), diff --git a/dali/internal/event/render-tasks/render-task-impl.h b/dali/internal/event/render-tasks/render-task-impl.h index 04a817d..89febf9 100644 --- a/dali/internal/event/render-tasks/render-task-impl.h +++ b/dali/internal/event/render-tasks/render-task-impl.h @@ -26,6 +26,7 @@ #include #include #include +#include namespace Dali { @@ -350,8 +351,8 @@ private: // not copyable private: - Actor* mSourceActor; ///< Source actor, we cannot keep the actor alive so raw pointer. - CameraActor* mCameraActor; ///< Camera actor, we cannot keep the actor alive so raw pointer. + ActorObserver mSourceActor; ///< Source actor + ActorObserver mCameraActor; ///< Camera actor WeakHandle mInputMappingActor; /// used to mapping screen to frame buffer coordinate, not kept alive by rendertask RenderTaskList& mRenderTaskList; ///< The render task list -- 2.7.4