Fix Shadow crash issue during SceneOff 10/306510/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 22 Feb 2024 08:31:25 +0000 (17:31 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Thu, 22 Feb 2024 14:04:07 +0000 (23:04 +0900)
Change-Id: If2e7cd12212d6207f7b9e582c8105574df0dd3c7
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-scene3d/utc-Dali-Light.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp

index e96737d..88b0f56 100644 (file)
@@ -1204,7 +1204,8 @@ int UtcDaliLightShadowRenderTask(void)
 {
   ToolkitTestApplication application;
   RenderTaskList taskList = application.GetScene().GetRenderTaskList();
-  DALI_TEST_EQUALS(1, taskList.GetTaskCount(), TEST_LOCATION);
+
+  uint32_t baseRenderTaskCount = application.GetScene().GetRenderTaskList().GetTaskCount();
 
   Scene3D::SceneView sceneView = Scene3D::SceneView::New();
   sceneView.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
@@ -1213,35 +1214,42 @@ int UtcDaliLightShadowRenderTask(void)
   sceneView.SetProperty(Dali::Actor::Property::HEIGHT_RESIZE_POLICY, ResizePolicy::FILL_TO_PARENT);
   application.GetScene().Add(sceneView);
 
-  DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
+  DALI_TEST_EQUALS(baseRenderTaskCount + 1u, taskList.GetTaskCount(), TEST_LOCATION);
 
   sceneView.UseFramebuffer(true);
 
-  DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+  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);
 
   Scene3D::Light light = Scene3D::Light::New();
   light.SetProperty(Dali::Actor::Property::COLOR, Color::BLUE);
   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");
+  DALI_TEST_EQUALS(baseRenderTaskCount + 1u, taskList.GetTaskCount(), TEST_LOCATION);
+
   sceneView.Add(light);
 
-  DALI_TEST_EQUALS(3, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(2u).GetOrderIndex(), TEST_LOCATION);
+  tet_printf("Create shadowmap rendertask after light is scene on");
+  DALI_TEST_EQUALS(baseRenderTaskCount + 2u, 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(SHADOW_ORDER_INDEX, taskList.GetTask(baseRenderTaskCount + 1u).GetOrderIndex(), TEST_LOCATION);
 
   application.SendNotification();
 
-  DALI_TEST_EQUALS(SHADOW_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(2u).GetOrderIndex(), TEST_LOCATION);
+  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);
 
   light.EnableShadow(false);
 
-  DALI_TEST_EQUALS(2, taskList.GetTaskCount(), TEST_LOCATION);
-  DALI_TEST_EQUALS(0, taskList.GetTask(0u).GetOrderIndex(), TEST_LOCATION);
-  DALI_TEST_EQUALS(SCENE_ORDER_INDEX, taskList.GetTask(1u).GetOrderIndex(), TEST_LOCATION);
+  tet_printf("Check shadowmap rendertask removed");
+  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);
 
   END_TEST;
 }
\ No newline at end of file
index 903575e..38e5611 100644 (file)
@@ -72,7 +72,7 @@ constexpr int32_t  DEFAULT_ORIENTATION     = 0;
 constexpr int32_t  INVALID_INDEX           = -1;
 constexpr uint32_t MAXIMUM_SIZE_SHADOW_MAP = 2048;
 
-constexpr int32_t SCENE_ORDER_INDEX = 100;
+constexpr int32_t SCENE_ORDER_INDEX  = 100;
 constexpr int32_t SHADOW_ORDER_INDEX = 99;
 
 static constexpr std::string_view SKYBOX_INTENSITY_STRING = "uIntensity";
@@ -711,9 +711,9 @@ void SceneView::RemoveShadow(Scene3D::Light light)
     break;
   }
 
-  if(mShadowMapRenderTask)
+  if(mSceneHolder && mShadowMapRenderTask)
   {
-    RenderTaskList taskList = Integration::SceneHolder::Get(Self()).GetRenderTaskList();
+    RenderTaskList taskList = mSceneHolder.GetRenderTaskList();
     taskList.RemoveTask(mShadowMapRenderTask);
     mShadowMapRenderTask.Reset();
   }
@@ -999,7 +999,7 @@ void SceneView::OnSceneConnection(int depth)
   if(mSceneHolder)
   {
     RenderTaskList taskList = mSceneHolder.GetRenderTaskList();
-    mRenderTask = taskList.CreateTask();
+    mRenderTask             = taskList.CreateTask();
     mRenderTask.SetSourceActor(mRootLayer);
     mRenderTask.SetExclusive(true);
     mRenderTask.SetInputEnabled(true);
@@ -1375,14 +1375,14 @@ void SceneView::NotifyImageBasedLightTextureChange()
 
 void SceneView::UpdateShadowMapBuffer(uint32_t shadowMapSize)
 {
-  if(!mShadowLight)
+  if(!mShadowLight || !mSceneHolder)
   {
     return;
   }
 
   if(!mShadowMapRenderTask)
   {
-    RenderTaskList taskList = Integration::SceneHolder::Get(Self()).GetRenderTaskList();
+    RenderTaskList taskList = mSceneHolder.GetRenderTaskList();
     mShadowMapRenderTask    = taskList.CreateTask();
     mShadowMapRenderTask.SetSourceActor(mRootLayer);
     mShadowMapRenderTask.SetExclusive(true);