Fix a crash of the RenderTask 05/227505/1
authorHeeyong Song <heeyong.song@samsung.com>
Thu, 12 Mar 2020 07:38:45 +0000 (16:38 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Thu, 12 Mar 2020 07:47:00 +0000 (16:47 +0900)
If a source actor or a camera actor of the RenderTask are destoryed, then ensure they are appropriately updated

Change-Id: Ifb9db5d14dde2a648df5d9d4bb9e322369c20b5a

dali/internal/event/render-tasks/render-task-impl.cpp
dali/internal/event/render-tasks/render-task-impl.h

index eb187af..99b74c7 100644 (file)
@@ -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 ),
index 04a817d..89febf9 100644 (file)
@@ -26,6 +26,7 @@
 #include <dali/internal/event/common/object-impl.h>
 #include <dali/internal/event/rendering/frame-buffer-impl.h>
 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
+#include <dali/internal/event/events/actor-observer.h>
 
 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<Dali::Actor> mInputMappingActor; /// used to mapping screen to frame buffer coordinate, not kept alive by rendertask
   RenderTaskList& mRenderTaskList; ///< The render task list