From: Eunki, Hong Date: Thu, 22 Feb 2024 08:31:25 +0000 (+0900) Subject: [Tizen] Fix Shadow crash issue during SceneOff X-Git-Tag: accepted/tizen/8.0/unified/20240301.174445~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8263f4505582216484c04311fe63a058ca4c4ddb;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Fix Shadow crash issue during SceneOff Change-Id: If2e7cd12212d6207f7b9e582c8105574df0dd3c7 Signed-off-by: Eunki, Hong --- diff --git a/automated-tests/src/dali-scene3d/utc-Dali-Light.cpp b/automated-tests/src/dali-scene3d/utc-Dali-Light.cpp index e96737d..88b0f56 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-Light.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-Light.cpp @@ -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 diff --git a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp index 903575e..38e5611 100644 --- a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp +++ b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp @@ -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);