Automatic RenderTask Ordering 30/314630/18
authorSeungho Baek <sbsh.baek@samsung.com>
Tue, 16 Jul 2024 10:01:42 +0000 (19:01 +0900)
committerSeungho Baek <sbsh.baek@samsung.com>
Wed, 25 Sep 2024 09:45:42 +0000 (18:45 +0900)
Change-Id: I508caebefe9de0098dd5f0eda76a6f7d6abf0053
Signed-off-by: Seungho Baek <sbsh.baek@samsung.com>
14 files changed:
automated-tests/src/dali-scene3d/utc-Dali-Light.cpp
automated-tests/src/dali-scene3d/utc-Dali-Panel.cpp
automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp
automated-tests/src/dali-toolkit-internal/utc-Dali-RenderEffect-internal.cpp
automated-tests/src/dali-toolkit/utc-Dali-RenderEffect.cpp
dali-scene3d/internal/controls/panel/panel-impl.cpp
dali-scene3d/internal/controls/panel/panel-impl.h
dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.h
dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.h
dali-toolkit/internal/controls/render-effects/render-effect-impl.h
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/control-impl.h

index 88b0f56887840513a099f3e662c99d72a090ff69..02741869e94fc32adc50a5ed9e268ab356267c57 100644 (file)
@@ -1219,7 +1219,7 @@ int UtcDaliLightShadowRenderTask(void)
   sceneView.UseFramebuffer(true);
 
   DALI_TEST_EQUALS(baseRenderTaskCount + 1u, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
   DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
 
   Scene3D::Light light = Scene3D::Light::New();
@@ -1227,29 +1227,30 @@ int UtcDaliLightShadowRenderTask(void)
   Dali::DevelActor::LookAt(light, Vector3(1.0f, 0.0f, 0.0f));
   light.EnableShadow(true);
 
-  tet_printf("Do not create rendertask until light is scene on");
+  tet_printf("Do not create rendertask until light is scene on\n");
   DALI_TEST_EQUALS(baseRenderTaskCount + 1u, taskList.GetTaskCount(), TEST_LOCATION);
 
   sceneView.Add(light);
 
-  tet_printf("Create shadowmap rendertask after light is scene on");
+  tet_printf("Create shadowmap rendertask after light is scene on\n");
   DALI_TEST_EQUALS(baseRenderTaskCount + 2u, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
   DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount + 1u).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, taskList.GetTask(baseRenderTaskCount + 1u).GetOrderIndex(), TEST_LOCATION);
 
   application.SendNotification();
 
-  tet_printf("Check render task list sorted");
-  DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount + 1u).GetOrderIndex(), TEST_LOCATION);
+  tet_printf("Check render task list sorted\n");
+  DALI_TEST_EQUALS(INT32_MIN, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, taskList.GetTask(baseRenderTaskCount + 1u).GetOrderIndex(), TEST_LOCATION);
 
   light.EnableShadow(false);
 
-  tet_printf("Check shadowmap rendertask removed");
+  tet_printf("Check shadowmap rendertask removed\n");
+
   DALI_TEST_EQUALS(baseRenderTaskCount + 1u, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN, taskList.GetTask(baseRenderTaskCount - 1u).GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, taskList.GetTask(baseRenderTaskCount).GetOrderIndex(), TEST_LOCATION);
 
   END_TEST;
 }
\ No newline at end of file
index 197c1e82df8f14e6b0d28838aa7867508c336b52..f7b035cefdb2ebef4492c1f0009ba180ed0825ca 100644 (file)
@@ -746,4 +746,80 @@ int UtcDaliPanelSetGetShadow(void)
   DALI_TEST_EQUALS(panel.IsShadowReceiving(), false, TEST_LOCATION);
 
   END_TEST;
-}
\ No newline at end of file
+}
+
+int UtcDaliPanelRenderTaskOrdering(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliPanelRenderTaskOrdering");
+
+  Integration::Scene scene = application.GetScene();
+  RenderTaskList taskList = scene.GetRenderTaskList();
+
+  uint32_t defaultTaskCount = taskList.GetTaskCount();
+  RenderTask defaultRenderTask = taskList.GetTask(defaultTaskCount - 1);
+  tet_printf("default Task Cnt : %d\n", defaultTaskCount);
+
+  Scene3D::SceneView sceneView = Scene3D::SceneView::New();
+  sceneView.UseFramebuffer(true);
+  scene.Add(sceneView);
+
+  uint32_t afterSceneViewTaskCount = taskList.GetTaskCount();
+  RenderTask sceneViewRenderTask = taskList.GetTask(afterSceneViewTaskCount - 1);
+  tet_printf("after SceneView Task cnt : %d\n", afterSceneViewTaskCount);
+  DALI_TEST_CHECK(afterSceneViewTaskCount == defaultTaskCount + 1);
+
+  Scene3D::Panel panel = Scene3D::Panel::New();
+  sceneView.Add(panel);
+
+  uint32_t afterPanelTaskCount = taskList.GetTaskCount();
+  RenderTask panelRenderTask = taskList.GetTask(afterPanelTaskCount - 1);
+  tet_printf("after Panel Task cnt : %d\n", afterPanelTaskCount);
+  DALI_TEST_CHECK(afterPanelTaskCount == afterSceneViewTaskCount + 1);
+
+  Control control1 = Control::New();
+  control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control1.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
+
+  panel.Add(control1);
+
+  uint32_t afterBlurEffectTaskCount = taskList.GetTaskCount();
+  RenderTask blurSourceRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 3);
+  RenderTask blurHorizontalRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 2);
+  RenderTask blurVerticalRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 1);
+  tet_printf("after blurEffect Task cnt : %d\n", afterBlurEffectTaskCount);
+  DALI_TEST_CHECK(afterBlurEffectTaskCount == afterPanelTaskCount + 3);
+
+  tet_printf("defaultRenderTask order : %d\n", defaultRenderTask.GetOrderIndex());
+  tet_printf("sceneViewRenderTask order : %d\n", sceneViewRenderTask.GetOrderIndex());
+  tet_printf("panelRenderTask order : %d\n", panelRenderTask.GetOrderIndex());
+  tet_printf("blurSourceRenderTask order : %d\n", blurSourceRenderTask.GetOrderIndex());
+  tet_printf("blurHorizontalRenderTask order : %d\n", blurHorizontalRenderTask.GetOrderIndex());
+  tet_printf("blurVerticalRenderTask order : %d\n", blurVerticalRenderTask.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, defaultRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, sceneViewRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(90, panelRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurSourceRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurHorizontalRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurVerticalRenderTask.GetOrderIndex(), TEST_LOCATION);
+
+  application.SendNotification();
+
+  tet_printf("defaultRenderTask order : %d\n", defaultRenderTask.GetOrderIndex());
+  tet_printf("sceneViewRenderTask order : %d\n", sceneViewRenderTask.GetOrderIndex());
+  tet_printf("panelRenderTask order : %d\n", panelRenderTask.GetOrderIndex());
+  tet_printf("blurSourceRenderTask order : %d\n", blurSourceRenderTask.GetOrderIndex());
+  tet_printf("blurHorizontalRenderTask order : %d\n", blurHorizontalRenderTask.GetOrderIndex());
+  tet_printf("blurVerticalRenderTask order : %d\n", blurVerticalRenderTask.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, defaultRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 4, sceneViewRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 3, panelRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN, blurSourceRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, blurHorizontalRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 2, blurVerticalRenderTask.GetOrderIndex(), TEST_LOCATION);
+
+  END_TEST;
+}
index 4e7781604395c6ed16eae0b14d8fa6816e9e87c0..63d533fc535a255764a4adf05fd9db28b56b0e8a 100644 (file)
@@ -1571,3 +1571,67 @@ int UtcDaliSceneViewSelectCamera(void)
 
   END_TEST;
 }
+
+int UtcDaliSceneViewRenderTaskOrdering(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliPanelRenderTaskOrdering");
+
+  Integration::Scene scene = application.GetScene();
+  RenderTaskList taskList = scene.GetRenderTaskList();
+
+  uint32_t defaultTaskCount = taskList.GetTaskCount();
+  RenderTask defaultRenderTask = taskList.GetTask(defaultTaskCount - 1);
+  tet_printf("default Task Cnt : %d\n", defaultTaskCount);
+
+  Scene3D::SceneView sceneView = Scene3D::SceneView::New();
+  sceneView.UseFramebuffer(true);
+  scene.Add(sceneView);
+
+  uint32_t afterSceneViewTaskCount = taskList.GetTaskCount();
+  RenderTask sceneViewRenderTask = taskList.GetTask(afterSceneViewTaskCount - 1);
+  tet_printf("after SceneView Task cnt : %d\n", afterSceneViewTaskCount);
+  DALI_TEST_CHECK(afterSceneViewTaskCount == defaultTaskCount + 1);
+
+  Control control1 = Control::New();
+  control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control1.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
+
+  sceneView.Add(control1);
+
+  uint32_t afterBlurEffectTaskCount = taskList.GetTaskCount();
+  RenderTask blurSourceRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 3);
+  RenderTask blurHorizontalRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 2);
+  RenderTask blurVerticalRenderTask = taskList.GetTask(afterBlurEffectTaskCount - 1);
+  tet_printf("after blurEffect Task cnt : %d\n", afterBlurEffectTaskCount);
+  DALI_TEST_CHECK(afterBlurEffectTaskCount == afterSceneViewTaskCount + 3);
+
+  tet_printf("defaultRenderTask order : %d\n", defaultRenderTask.GetOrderIndex());
+  tet_printf("sceneViewRenderTask order : %d\n", sceneViewRenderTask.GetOrderIndex());
+  tet_printf("blurSourceRenderTask order : %d\n", blurSourceRenderTask.GetOrderIndex());
+  tet_printf("blurHorizontalRenderTask order : %d\n", blurHorizontalRenderTask.GetOrderIndex());
+  tet_printf("blurVerticalRenderTask order : %d\n", blurVerticalRenderTask.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, defaultRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, sceneViewRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurSourceRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurHorizontalRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, blurVerticalRenderTask.GetOrderIndex(), TEST_LOCATION);
+
+  application.SendNotification();
+
+  tet_printf("defaultRenderTask order : %d\n", defaultRenderTask.GetOrderIndex());
+  tet_printf("sceneViewRenderTask order : %d\n", sceneViewRenderTask.GetOrderIndex());
+  tet_printf("blurSourceRenderTask order : %d\n", blurSourceRenderTask.GetOrderIndex());
+  tet_printf("blurHorizontalRenderTask order : %d\n", blurHorizontalRenderTask.GetOrderIndex());
+  tet_printf("blurVerticalRenderTask order : %d\n", blurVerticalRenderTask.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, defaultRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 3, sceneViewRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN, blurSourceRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, blurHorizontalRenderTask.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 2, blurVerticalRenderTask.GetOrderIndex(), TEST_LOCATION);
+
+  END_TEST;
+}
index 9a3bbc6e0601e5ed2eb3088af3eb4ff78ed8c37f..d468ac765e0e3cfbfadc0abaecf66f7813c756e8 100644 (file)
@@ -62,6 +62,14 @@ public:
     return handle;
   }
 
+  OffScreenRenderable::Type GetOffScreenRenderableType() override
+  {
+    return OffScreenRenderable::Type::NONE;
+  }
+
+  void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) override
+  {}
+
 protected:
   TestRenderEffectImpl()
   : mOnActivated(false)
index 8e95732a107ece933a795c8085d0764d4ca85e20..f283741f25eb28e099160047fcea09e8cb45b097 100644 (file)
@@ -525,3 +525,146 @@ int UtcDaliRenderEffectControlVisiblityChanged02(void)
 
   END_TEST;
 }
+
+int UtcDaliRenderEffectRenderTaskOrdering(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliRenderEffectRenderTaskOrdering");
+
+  Integration::Scene scene = application.GetScene();
+  RenderTaskList taskList = scene.GetRenderTaskList();
+
+  Control control1 = Control::New();
+  control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control1.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
+
+  tet_printf("render task cnt : %d\n", taskList.GetTaskCount());
+
+  // Add render effect during scene on.
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
+
+  tet_printf("render task cnt after set : %d\n", taskList.GetTaskCount());
+  DALI_TEST_EQUALS(1, taskList.GetTaskCount(), TEST_LOCATION);
+
+  scene.Add(control1);
+
+  tet_printf("render task cnt after add : %d\n", taskList.GetTaskCount());
+  DALI_TEST_EQUALS(4, taskList.GetTaskCount(), TEST_LOCATION);
+
+  Dali::RenderTask sourceTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 3);
+  Dali::RenderTask horizontalBlurTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 2);
+  Dali::RenderTask verticalBlurTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 1);
+
+  tet_printf("order : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  DALI_TEST_EQUALS(0, sourceTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, horizontalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, verticalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  
+  application.SendNotification();
+
+  tet_printf("order af : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order af : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order af : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, sourceTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, horizontalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 2, verticalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+
+  Control control2 = Control::New();
+  control2.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control2.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
+
+  tet_printf("render task cnt : %d\n", taskList.GetTaskCount());
+
+  // Add render effect during scene on.
+  control2.SetRenderEffect(BackgroundBlurEffect::New());
+
+  tet_printf("render task cnt after set : %d\n", taskList.GetTaskCount());
+
+  scene.Add(control2);
+
+  DALI_TEST_EQUALS(7, taskList.GetTaskCount(), TEST_LOCATION);
+
+  tet_printf("render task cnt after add : %d\n", taskList.GetTaskCount());
+
+  Dali::RenderTask sourceTaskControl2 = taskList.GetTask(taskList.GetTaskCount() - 3);
+  Dali::RenderTask horizontalBlurTaskControl2 = taskList.GetTask(taskList.GetTaskCount() - 2);
+  Dali::RenderTask verticalBlurTaskControl2 = taskList.GetTask(taskList.GetTaskCount() - 1);
+
+
+  tet_printf("order after1 : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order after1 : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order after1 : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  tet_printf("order after1 : %d\n", sourceTaskControl2.GetOrderIndex());
+  tet_printf("order after1 : %d\n", horizontalBlurTaskControl2.GetOrderIndex());
+  tet_printf("order after1 : %d\n", verticalBlurTaskControl2.GetOrderIndex());
+
+  DALI_TEST_EQUALS(0, sourceTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, horizontalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, verticalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  
+  application.SendNotification();
+
+  tet_printf("order after2 : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order after2 : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order after2 : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  tet_printf("order after2 : %d\n", sourceTaskControl2.GetOrderIndex());
+  tet_printf("order after2 : %d\n", horizontalBlurTaskControl2.GetOrderIndex());
+  tet_printf("order after2 : %d\n", verticalBlurTaskControl2.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN, sourceTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, horizontalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 2, verticalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+
+  DALI_TEST_EQUALS(INT32_MIN + 3, sourceTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 4, horizontalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 5, verticalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+
+  control2.Add(control1);
+
+  sourceTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 3);
+  horizontalBlurTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 2);
+  verticalBlurTaskControl1 = taskList.GetTask(taskList.GetTaskCount() - 1);
+
+  tet_printf("order after3 : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order after3 : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order after3 : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  tet_printf("order after3 : %d\n", sourceTaskControl2.GetOrderIndex());
+  tet_printf("order after3 : %d\n", horizontalBlurTaskControl2.GetOrderIndex());
+  tet_printf("order after3 : %d\n", verticalBlurTaskControl2.GetOrderIndex());
+
+  DALI_TEST_EQUALS(0, sourceTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, horizontalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(0, verticalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+
+  DALI_TEST_EQUALS(INT32_MIN + 3, sourceTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 4, horizontalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 5, verticalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+
+  application.SendNotification();
+
+  tet_printf("order after4 : %d\n", sourceTaskControl1.GetOrderIndex());
+  tet_printf("order after4 : %d\n", horizontalBlurTaskControl1.GetOrderIndex());
+  tet_printf("order after4 : %d\n", verticalBlurTaskControl1.GetOrderIndex());
+
+  tet_printf("order after4 : %d\n", sourceTaskControl2.GetOrderIndex());
+  tet_printf("order after4 : %d\n", horizontalBlurTaskControl2.GetOrderIndex());
+  tet_printf("order after4 : %d\n", verticalBlurTaskControl2.GetOrderIndex());
+
+  DALI_TEST_EQUALS(INT32_MIN + 3, sourceTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 4, horizontalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 5, verticalBlurTaskControl1.GetOrderIndex(), TEST_LOCATION);
+
+  DALI_TEST_EQUALS(INT32_MIN, sourceTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 1, horizontalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+  DALI_TEST_EQUALS(INT32_MIN + 2, verticalBlurTaskControl2.GetOrderIndex(), TEST_LOCATION);
+
+  END_TEST;
+}
+
index c84fd499d5606d356a133c4169739133e7911cb3..bdb66c8fdc2cd1bb738320a307f545e25025a366 100644 (file)
@@ -24,7 +24,6 @@
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali/devel-api/actors/actor-devel.h>
 #include <dali/integration-api/adaptor-framework/adaptor.h>
-#include <dali/integration-api/debug.h>
 #include <dali/public-api/math/math-utils.h>
 #include <dali/public-api/object/type-registry-helper.h>
 #include <dali/public-api/object/type-registry.h>
@@ -276,6 +275,16 @@ Property::Value Panel::GetProperty(BaseObject* object, Property::Index index)
   return value;
 }
 
+Dali::Actor Panel::GetOffScreenRenderableSourceActor()
+{
+  return (mRootLayer) ? mRootLayer : Dali::Actor();
+}
+
+bool Panel::IsOffScreenRenderTaskExclusive()
+{
+  return (mRenderTask) ? mRenderTask.IsExclusive() : false;
+}
+
 ///////////////////////////////////////////////////////////
 //
 // Private methods
@@ -385,6 +394,7 @@ void Panel::OnInitialize()
   scaleConstraint.Apply();
 
   UpdateProperties();
+  SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
 }
 
 void Panel::OnSceneConnection(int depth)
@@ -457,6 +467,18 @@ void Panel::OnSceneDisconnection()
   Control::OnSceneDisconnection();
 }
 
+void Panel::GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward)
+{
+  tasks.clear();
+  if(isForward)
+  {
+    if(mRenderTask)
+    {
+      tasks.push_back(mRenderTask);
+    }
+  }
+}
+
 void Panel::SetTransparent(bool transparent)
 {
   if(mIsTransparent != transparent)
index 769d8660961d2c6d8ff33a85eb9acc26063d03d2..5147bdeca4b329b16233b06281a493d20b617129 100644 (file)
@@ -121,6 +121,16 @@ public:
    */
   static Property::Value GetProperty(BaseObject* object, Property::Index index);
 
+  /**
+   * @copydoc Toolkit::Internal::Control::GetOffScreenRenderableSourceActor
+   */
+  Dali::Actor GetOffScreenRenderableSourceActor() override;
+
+  /**
+   * @copydoc Toolkit::Internal::Control::IsOffScreenRenderTaskExclusive
+   */
+  bool IsOffScreenRenderTaskExclusive() override;
+
 protected:
   /**
    * @brief Constructs a new Panel.
@@ -148,6 +158,11 @@ private:
    */
   void OnSceneDisconnection() override;
 
+  /**
+   * @copydoc CustomActorImpl::SetFirstOrderIndex()
+   */
+  void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) override;
+
 private:
   /**
    * @brief Sets whether the plane is transparent or not.
index f570010e69285095fad95e580f93df205e9ce361..52aee16d3a81aa06dced3ba1ac8905c9878cb5a5 100644 (file)
@@ -796,7 +796,9 @@ void SceneView::UseFramebuffer(bool useFramebuffer)
   if(mUseFrameBuffer != useFramebuffer)
   {
     mUseFrameBuffer = useFramebuffer;
+    SetOffScreenRenderableType((mUseFrameBuffer) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE);
     UpdateRenderTask();
+    RequestRenderTaskReorder();
   }
 }
 
@@ -1157,6 +1159,16 @@ Property::Value SceneView::GetProperty(BaseObject* object, Property::Index index
   return value;
 }
 
+Dali::Actor SceneView::GetOffScreenRenderableSourceActor()
+{
+  return (mRootLayer) ? mRootLayer : Dali::Actor();
+}
+
+bool SceneView::IsOffScreenRenderTaskExclusive()
+{
+  return (mRenderTask) ? mRenderTask.IsExclusive() : false;
+}
+
 ///////////////////////////////////////////////////////////
 //
 // Private methods
@@ -1195,7 +1207,6 @@ void SceneView::OnSceneConnection(int depth)
     mRenderTask.SetExclusive(true);
     mRenderTask.SetInputEnabled(true);
     mRenderTask.SetCullMode(false);
-    mRenderTask.SetOrderIndex(SCENE_ORDER_INDEX);
     mRenderTask.SetScreenToFrameBufferMappingActor(Self());
 
     UpdateRenderTask();
@@ -1269,6 +1280,22 @@ void SceneView::OnSceneDisconnection()
   Control::OnSceneDisconnection();
 }
 
+void SceneView::GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward)
+{
+  tasks.clear();
+  if(isForward)
+  {
+    if(mShadowMapRenderTask)
+    {
+      tasks.push_back(mShadowMapRenderTask);
+    }
+    if(mRenderTask)
+    {
+      tasks.push_back(mRenderTask);
+    }
+  }
+}
+
 void SceneView::OnInitialize()
 {
   Actor self = Self();
@@ -1286,6 +1313,11 @@ void SceneView::OnInitialize()
   mDefaultCamera.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
   AddCamera(mDefaultCamera);
   UpdateCamera(mDefaultCamera);
+
+  if(mUseFrameBuffer)
+  {
+    SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+  }
 }
 
 void SceneView::OnChildAdd(Actor& child)
@@ -1420,6 +1452,8 @@ void SceneView::UpdateRenderTask()
     }
     else
     {
+      mRenderTask.SetOrderIndex(SCENE_ORDER_INDEX);
+
       mRenderTask.SetViewportGuideActor(Self());
       if(mRenderTask.GetFrameBuffer())
       {
@@ -1625,6 +1659,10 @@ void SceneView::UpdateShadowMapBuffer(uint32_t shadowMapSize)
     mShadowMapRenderTask.SetClearColor(Color::WHITE);
     mShadowMapRenderTask.SetRenderPassTag(10);
     mShadowMapRenderTask.SetCameraActor(GetImplementation(mShadowLight).GetCamera());
+  }
+
+  if(!mUseFrameBuffer)
+  {
     mShadowMapRenderTask.SetOrderIndex(SHADOW_ORDER_INDEX);
   }
 
index 694594d93d4351c3c96e1566827451081575d008..86d3f9e0382de7236da331d5a9de24e177a0b071 100644 (file)
@@ -361,6 +361,16 @@ public:
    */
   static Property::Value GetProperty(BaseObject* object, Property::Index index);
 
+  /**
+   * @copydoc Toolkit::Internal::Control::GetOffScreenRenderableSourceActor
+   */
+  Dali::Actor GetOffScreenRenderableSourceActor() override;
+
+  /**
+   * @copydoc Toolkit::Internal::Control::IsOffScreenRenderTaskExclusive
+   */
+  bool IsOffScreenRenderTaskExclusive() override;
+
 protected:
   /**
    * @brief Constructs a new SceneView.
@@ -383,6 +393,11 @@ private:
    */
   void OnSceneDisconnection() override;
 
+  /**
+   * @copydoc CustomActorImpl::GetOffScreenRenderTasks()
+   */
+  void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) override;
+
   /**
    * @copydoc Toolkit::Control::OnInitialize()
    */
index 987c582d1603d3b869e492824f358cef4a0416ba..fa64963d37625f507d389555f20bd17eb1e40f97 100644 (file)
 #include <dali/public-api/render-tasks/render-task-list.h>
 #include <dali/public-api/rendering/renderer.h>
 #include <dali/public-api/rendering/shader.h>
+#include <dali/public-api/actors/custom-actor-impl.h>
 
-//INTERNAL INCLUDES
+// INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include <dali-toolkit/internal/controls/control/control-renderers.h>
 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
+#include <dali-toolkit/public-api/controls/control-impl.h>
 
 namespace
 {
 // Default values
 static constexpr float    BLUR_EFFECT_DOWNSCALE_FACTOR = 0.4f;
 static constexpr uint32_t BLUR_EFFECT_PIXEL_RADIUS     = 10u;
-static constexpr int32_t  BLUR_EFFECT_ORDER_INDEX      = 101;
 
 static constexpr float MINIMUM_DOWNSCALE_FACTOR = 0.1f;
 static constexpr float MAXIMUM_DOWNSCALE_FACTOR = 1.0f;
@@ -141,6 +142,47 @@ BlurEffectImplPtr BlurEffectImpl::New(float downscaleFactor, uint32_t blurRadius
   return handle;
 }
 
+OffScreenRenderable::Type BlurEffectImpl::GetOffScreenRenderableType()
+{
+  return mSkipBlur ? OffScreenRenderable::NONE : OffScreenRenderable::BACKWARD;
+}
+
+void BlurEffectImpl::GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward)
+{
+  tasks.clear();
+  if(!isForward && mIsBackground)
+  {
+    bool isExclusiveRequired = false;
+    Dali::Actor sourceActor = GetOwnerControl();
+    while(sourceActor.GetParent())
+    {
+      sourceActor = sourceActor.GetParent();
+      Toolkit::Control control = Toolkit::Control::DownCast(sourceActor);
+      if(control && GetImplementation(control).GetOffScreenRenderableType() == OffScreenRenderable::Type::FORWARD)
+      {
+        sourceActor = GetImplementation(control).GetOffScreenRenderableSourceActor();
+        isExclusiveRequired = GetImplementation(control).IsOffScreenRenderTaskExclusive();
+        break;
+      }
+    }
+    mSourceRenderTask.SetSourceActor(sourceActor);
+    mSourceRenderTask.SetExclusive(isExclusiveRequired);
+
+    if(mSourceRenderTask)
+    {
+      tasks.push_back(mSourceRenderTask);
+    }
+    if(mHorizontalBlurTask)
+    {
+      tasks.push_back(mHorizontalBlurTask);
+    }
+    if(mVerticalBlurTask)
+    {
+      tasks.push_back(mVerticalBlurTask);
+    }
+  }
+}
+
 void BlurEffectImpl::OnInitialize()
 {
   if(DALI_UNLIKELY(mSkipBlur))
@@ -348,7 +390,6 @@ void BlurEffectImpl::CreateRenderTasks(Integration::SceneHolder sceneHolder, con
   {
     mSourceRenderTask.SetSourceActor(sourceControl);
   }
-  mSourceRenderTask.SetOrderIndex(BLUR_EFFECT_ORDER_INDEX);
   mSourceRenderTask.SetCameraActor(mRenderFullSizeCamera);
   mSourceRenderTask.SetFrameBuffer(mInputBackgroundFrameBuffer);
   mSourceRenderTask.SetInputEnabled(false);
@@ -362,7 +403,6 @@ void BlurEffectImpl::CreateRenderTasks(Integration::SceneHolder sceneHolder, con
   SetRendererTexture(mHorizontalBlurActor.GetRendererAt(0), mInputBackgroundFrameBuffer);
   mHorizontalBlurTask = taskList.CreateTask();
   mHorizontalBlurTask.SetSourceActor(mHorizontalBlurActor);
-  mHorizontalBlurTask.SetOrderIndex(BLUR_EFFECT_ORDER_INDEX + 1);
   mHorizontalBlurTask.SetExclusive(true);
   mHorizontalBlurTask.SetInputEnabled(false);
   mHorizontalBlurTask.SetCameraActor(mRenderDownsampledCamera);
@@ -376,7 +416,6 @@ void BlurEffectImpl::CreateRenderTasks(Integration::SceneHolder sceneHolder, con
   SetRendererTexture(mVerticalBlurActor.GetRendererAt(0), mTemporaryFrameBuffer);
   mVerticalBlurTask = taskList.CreateTask();
   mVerticalBlurTask.SetSourceActor(mVerticalBlurActor);
-  mVerticalBlurTask.SetOrderIndex(BLUR_EFFECT_ORDER_INDEX + 2);
   mVerticalBlurTask.SetExclusive(true);
   mVerticalBlurTask.SetInputEnabled(false);
   mVerticalBlurTask.SetCameraActor(mRenderDownsampledCamera);
index 6147398d535dc62154d627005a65a3905e6ed690..def332405b35e899dac6841ec2dab72647bb32e4 100644 (file)
@@ -69,6 +69,16 @@ public:
    */
   static BlurEffectImplPtr New(float downscaleFactor, uint32_t blurRadius, bool isBackground);
 
+  /**
+   * @copydoc Toolkit::Internal::RenderEffectImpl::GetOffScreenRenderableType
+   */
+  OffScreenRenderable::Type GetOffScreenRenderableType() override;
+
+  /**
+   * @copydoc Toolkit::Internal::RenderEffectImpl::GetOffScreenRenderTasks
+   */
+  void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) override;
+
 protected:
   /**
    * @brief Creates an uninitialized blur effect implementation
index 3913bcbdcd0f18d8e30c136f3dd2bec4a60621e6..39a7abde00d9ca2d3e311f71feb7119a3fbdc402 100644 (file)
@@ -60,6 +60,29 @@ public:
    */
   bool IsActivated() const;
 
+  /**
+   * @brief Retrieves OffScreenRenderableType of this RenderEffect.
+   *
+   * @return OffScreenRenderableType for this RenderEffect.
+   */
+  virtual OffScreenRenderable::Type GetOffScreenRenderableType() = 0;
+
+  /**
+   * @brief Retrieves the off-screen RenderTasks associated with the RenderEffect.
+   * This method returns the internal RenderTasks held by the RenderEffect. This tasks are
+   * used for off-screen rendering, and the system will assign order index to each
+   * tasks based on the render order.
+   *
+   * RenderEffect with a non-NONE OffScreenRenderableType should override this method to
+   * provide their render tasks.
+   *
+   * @param[out] tasks A list of RenderTasks to be populated with the RenderEffect's forward
+   * or backward off-screen RenderTask.
+   * @param[in] isForward Indicates whether to retrieve forward (true) or backward (false)
+   * RenderTasks.
+   */
+  virtual void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) = 0;
+
 protected:
   /**
    * @copydoc Dali::Toolkit::RenderEffect::RenderEffect
index 068fb03503bebc0411924c53283aa0f0ca152c56..03e4b94506b374e83814ebd09bfc9304a36599f7 100644 (file)
@@ -181,6 +181,8 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect)
 
       Dali::Toolkit::Control ownerControl(GetOwner());
       object->SetOwnerControl(ownerControl);
+
+      SetOffScreenRenderableType(object->GetOffScreenRenderableType());
     }
   }
 }
@@ -197,6 +199,7 @@ void Control::ClearRenderEffect()
     }
     mImpl->mRenderEffect.Reset();
   }
+  SetOffScreenRenderableType(OffScreenRenderable::NONE);
 }
 
 void Control::SetResourceReady()
@@ -205,6 +208,17 @@ void Control::SetResourceReady()
   controlDataImpl.ResourceReady();
 }
 
+Dali::Actor Control::GetOffScreenRenderableSourceActor()
+{
+  // Need to override this in FORWARD OffScreenRenderable
+  return Dali::Actor();
+}
+
+bool Control::IsOffScreenRenderTaskExclusive()
+{
+  return false;
+}
+
 std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::GetAccessibleObject()
 {
   return mImpl->GetAccessibleObject();
@@ -655,6 +669,15 @@ void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize)
   // @todo size negotiate background to new size, animate as well?
 }
 
+void Control::GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward)
+{
+  if(mImpl->mRenderEffect)
+  {
+    Toolkit::Internal::RenderEffectImpl* object = dynamic_cast<Toolkit::Internal::RenderEffectImpl*>(mImpl->mRenderEffect.GetObjectPtr());
+    object->GetOffScreenRenderTasks(tasks, isForward);
+  }
+}
+
 bool Control::OnKeyEvent(const KeyEvent& event)
 {
   return false; // Do not consume
index 76991aa0a0d0d64b0c0ef9d3dc2cd97bf0afed70..616aa4897d5267bcf76cf7f0f75d34e572fd06c6 100644 (file)
@@ -129,6 +129,24 @@ public:
    */
   void SetResourceReady();
 
+  /**
+   * @brief Retrieves SourceActor of the OffScreenRenderable.
+   *
+   * @SINCE_2_3.43
+   * @return SourceActor of the OffScreenRenderable.
+   */
+  virtual Dali::Actor GetOffScreenRenderableSourceActor();
+
+  /**
+   * @brief Retrieves whether the OffScreen RenderTasks is exclusive or not.
+   * The SourceActor of an OffScreen RenderTask can also become the SourceActor of another Actor's OffScreen RenderTask.
+   * To draw the SourceActor multitimes, the exclusive information is required.
+   *
+   * @SINCE_2_3.43
+   * @return True if the RenderTask is exclusive.
+   */
+  virtual bool IsOffScreenRenderTaskExclusive();
+
   // Accessibility
 
   /**
@@ -362,6 +380,11 @@ protected: // From CustomActorImpl
    */
   void OnSizeAnimation(Animation& animation, const Vector3& targetSize) override;
 
+  /**
+   * @copydoc CustomActorImpl::GetOffScreenRenderTasks()
+   */
+  void GetOffScreenRenderTasks(std::vector<Dali::RenderTask>& tasks, bool isForward) override;
+
   /**
    * @copydoc CustomActorImpl::OnRelayout()
    */