Creates RenderTask when it connects on Scene and Remove it when it is disconnected. 85/284585/6
authorseungho baek <sbsh.baek@samsung.com>
Mon, 21 Nov 2022 09:29:38 +0000 (18:29 +0900)
committerseungho baek <sbsh.baek@samsung.com>
Tue, 22 Nov 2022 09:29:06 +0000 (18:29 +0900)
Change-Id: Ie571a7a8a10224d5740239d8d651a7ce48ddfa51
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder-impl.h
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-scene-holder.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-window.h
dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.h

index ca9f0eb..08728df 100644 (file)
@@ -302,16 +302,20 @@ int UtcDaliSceneViewOnScene02(void)
   Scene3D::SceneView view = Scene3D::SceneView::New();
 
   renderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
-  DALI_TEST_EQUALS(2u, renderTaskCount, TEST_LOCATION);
-
-  RenderTask  renderTask = application.GetScene().GetRenderTaskList().GetTask(1u);
-  CameraActor camera     = renderTask.GetCameraActor();
+  DALI_TEST_EQUALS(1u, renderTaskCount, TEST_LOCATION);
 
   application.GetScene().Add(view);
 
   application.SendNotification();
   application.Render();
 
+
+  renderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
+  DALI_TEST_EQUALS(2u, renderTaskCount, TEST_LOCATION);
+
+  RenderTask  renderTask = application.GetScene().GetRenderTaskList().GetTask(1u);
+  CameraActor camera     = renderTask.GetCameraActor();
+
   CameraActor defaultCamera = renderTask.GetCameraActor();
   DALI_TEST_CHECK(defaultCamera);
   DALI_TEST_EQUALS(camera, defaultCamera, TEST_LOCATION);
@@ -724,3 +728,26 @@ int UtcDaliSceneViewSetSkyboxOrientation(void)
 
   END_TEST;
 }
+
+int UtcDaliSceneViewCreateAndRemoveRenderTask(void)
+{
+  ToolkitTestApplication application;
+  RenderTaskList taskList = application.GetScene().GetRenderTaskList();
+
+  uint32_t renderTaskCount = taskList.GetTaskCount();
+
+  Scene3D::SceneView view = Scene3D::SceneView::New();
+  view.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+
+  DALI_TEST_EQUALS(renderTaskCount, application.GetScene().GetRenderTaskList().GetTaskCount(), TEST_LOCATION);
+
+  application.GetScene().Add(view);
+
+  DALI_TEST_EQUALS(renderTaskCount + 1, application.GetScene().GetRenderTaskList().GetTaskCount(), TEST_LOCATION);
+
+  view.Unparent();
+
+  DALI_TEST_EQUALS(renderTaskCount, application.GetScene().GetRenderTaskList().GetTaskCount(), TEST_LOCATION);
+
+  END_TEST;
+}
index 8bcb3c0..132ce79 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <dali/integration-api/adaptor-framework/adaptor.h>
 #include <toolkit-adaptor-impl.h>
+#include <dali/public-api/render-tasks/render-task-list.h>
 
 using AdaptorImpl = Dali::Internal::Adaptor::Adaptor;
 
@@ -130,6 +131,11 @@ Dali::RenderSurfaceInterface& SceneHolder::GetRenderSurface()
   return mRenderSurface;
 }
 
+Dali::RenderTaskList SceneHolder::GetRenderTaskList()
+{
+  return mScene.GetRenderTaskList();
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index b74a8c0..4902904 100644 (file)
@@ -22,6 +22,7 @@
 #include <dali/public-api/actors/actor.h>
 #include <dali/public-api/actors/layer.h>
 #include <dali/public-api/object/base-object.h>
+#include <dali/public-api/render-tasks/render-task-list.h>
 
 #define DALI_WINDOW_H
 #include <dali/integration-api/adaptor-framework/adaptor.h>
@@ -220,6 +221,11 @@ Window::TouchEventSignalType& Window::TouchedSignal()
   return GetImplementation(*this).TouchedSignal();
 }
 
+Dali::RenderTaskList Window::GetRenderTaskList()
+{
+  return GetImplementation(*this).GetRenderTaskList();
+}
+
 namespace DevelWindow
 {
 Window Get(Actor actor)
index e9edae0..038812c 100644 (file)
@@ -85,6 +85,7 @@ public:
   KeyEventSignalType&           KeyEventSignal();
   TouchEventSignalType&         TouchedSignal();
   ResizeSignalType&             ResizeSignal();
+  Dali::RenderTaskList          GetRenderTaskList();
 
 public:
   explicit Window(Internal::Adaptor::Window* window);
index 9cc2759..1457e19 100644 (file)
@@ -399,12 +399,20 @@ Quaternion SceneView::GetSkyboxOrientation() const
 
 void SceneView::OnSceneConnection(int depth)
 {
-  UpdateRenderTask();
-
   Window window = DevelWindow::Get(Self());
   if(window)
   {
     window.ResizeSignal().Connect(this, &SceneView::OnWindowResized);
+    RenderTaskList taskList = window.GetRenderTaskList();
+    mRenderTask             = taskList.CreateTask();
+    mRenderTask.SetSourceActor(mRootLayer);
+    mRenderTask.SetExclusive(true);
+    mRenderTask.SetInputEnabled(true);
+    mRenderTask.SetCullMode(false);
+    mRenderTask.SetScreenToFrameBufferMappingActor(Self());
+
+    UpdateRenderTask();
+    mWindow = window;
   }
 
   Control::OnSceneConnection(depth);
@@ -414,11 +422,18 @@ void SceneView::OnSceneDisconnection()
 {
   mItems.clear();
 
-  Window window = DevelWindow::Get(Self());
+  Window window = mWindow.GetHandle();
   if(window)
   {
     window.ResizeSignal().Disconnect(this, &SceneView::OnWindowResized);
+    RenderTaskList taskList = window.GetRenderTaskList();
+    if(mRenderTask)
+    {
+      taskList.RemoveTask(mRenderTask);
+      mRenderTarget.Reset();
+    }
   }
+  mWindow.Reset();
 
   Control::OnSceneDisconnection();
 }
@@ -435,14 +450,6 @@ void SceneView::OnInitialize()
   mRootLayer.SetProperty(Dali::Actor::Property::INHERIT_SCALE, false);
   self.Add(mRootLayer);
 
-  RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
-  mRenderTask             = taskList.CreateTask();
-  mRenderTask.SetSourceActor(mRootLayer);
-  mRenderTask.SetExclusive(true);
-  mRenderTask.SetInputEnabled(true);
-  mRenderTask.SetCullMode(false);
-  mRenderTask.SetScreenToFrameBufferMappingActor(Self());
-
   mDefaultCamera = Dali::CameraActor::New();
   mDefaultCamera.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
   mDefaultCamera.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
index db3c33e..7632d80 100644 (file)
@@ -237,7 +237,7 @@ private:
   void OnWindowResized(Window window, Window::WindowSize size);
 
   /**
-   * @brief Update camera's projection orientation according to the screen orientation.
+   * @brief Updates camera's projection orientation according to the screen orientation.
    */
   void RotateCamera();
 
@@ -246,6 +246,7 @@ private:
 
   /////////////////////////////////////////////////////////////
   // FrameBuffer and Rendertask to render child objects as a 3D Scene
+  Dali::WeakHandle<Dali::Window>                           mWindow;
   CameraActor                                              mDefaultCamera;
   CameraActor                                              mSelectedCamera;
   std::vector<CameraActor>                                 mCameras;