Fix svace - Assert if RenderItem.mNode is nullptr + Print log if sceneobject is nullptr 25/322425/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 9 Apr 2025 00:52:55 +0000 (09:52 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 9 Apr 2025 01:20:40 +0000 (10:20 +0900)
Change-Id: Ib85427f2605a6685e4a0c37142195ab82361c399
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-internal/utc-Dali-Internal-Core.cpp
dali/internal/render/common/render-manager.cpp

index 8791c40f7353aae4d7414dea7832d6f561bfddef..230389a8a3d8a82db2742c1fb1b13aa8d8aeaad9 100644 (file)
@@ -250,6 +250,79 @@ int UtcDaliCoreClearScene(void)
   END_TEST;
 }
 
+int UtcDaliCoreRemoveSceneObjectAndClearSceneN(void)
+{
+  TestApplication application;
+  tet_infoline("Testing Dali::Integration::Core::ClearScene with scene object removed scene");
+
+  application.GetScene().SetBackgroundColor(Color::MAGENTA);
+
+  // Dummy rendering several frames.
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  Dali::Integration::Scene newScene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
+  DALI_TEST_CHECK(newScene);
+  application.AddScene(newScene);
+
+  // Dummy rendering several frames.
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  TestGraphicsController& controller = application.GetGraphicsController();
+  auto&                   cmdTrace   = controller.mCommandBufferCallStack;
+
+  cmdTrace.Enable(true);
+  cmdTrace.EnableLogging(true);
+
+  cmdTrace.Reset();
+
+  DALI_TEST_CHECK(!cmdTrace.FindMethod("BeginRenderPass"));
+
+  auto& core = application.GetCore();
+
+  // Create BeginRenderPass both scenes
+  core.ClearScene(newScene);
+  DALI_TEST_CHECK(cmdTrace.FindMethod("BeginRenderPass"));
+  cmdTrace.Reset();
+
+  core.ClearScene(application.GetScene());
+  DALI_TEST_CHECK(cmdTrace.FindMethod("BeginRenderPass"));
+
+  // Dummy rendering several frames.
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  cmdTrace.Reset();
+
+  newScene.RemoveSceneObject(); // Scene's scene graph lifecycle is NOT managed by scene handle
+
+  DALI_TEST_CHECK(!cmdTrace.FindMethod("BeginRenderPass"));
+
+  // Do not create BeginRenderPass for invalid scene
+  core.ClearScene(newScene);
+  DALI_TEST_CHECK(!cmdTrace.FindMethod("BeginRenderPass"));
+
+  core.ClearScene(application.GetScene());
+  DALI_TEST_CHECK(cmdTrace.FindMethod("BeginRenderPass"));
+
+  cmdTrace.Reset();
+
+  newScene.Discard();
+  newScene.Reset();
+
+  application.SendNotification();
+  application.Render(0);
+
+  END_TEST;
+}
+
 int UtcDaliCoreClearSceneN(void)
 {
   TestApplication application;
index dad2d915c44a1463d75bbceda8996ec6d6870ad5..0037f3b86573d0bcbc13b50960223c7407eb7c28 100644 (file)
@@ -705,6 +705,7 @@ void RenderManager::PreRenderScene(Integration::Scene& scene, Integration::Scene
   if(!sceneObject)
   {
     // May not be a scene object if the window is being removed.
+    DALI_LOG_ERROR("Scene was empty handle. Skip PreRenderScene\n");
     return;
   }
 
@@ -729,17 +730,10 @@ void RenderManager::PreRenderScene(Integration::Scene& scene, Integration::Scene
     return;
   }
 
-  if(!sceneObject || sceneObject->IsRenderingSkipped())
+  if(sceneObject->IsRenderingSkipped())
   {
     // We don't need to calculate dirty rects
-    if(!sceneObject)
-    {
-      DALI_LOG_ERROR("Scene was empty handle. Skip pre-rendering\n");
-    }
-    else
-    {
-      DALI_LOG_RELEASE_INFO("RenderingSkipped was set true. Skip pre-rendering\n");
-    }
+    DALI_LOG_RELEASE_INFO("RenderingSkipped was set true. Skip pre-rendering\n");
     return;
   }
 
@@ -866,6 +860,9 @@ void RenderManager::PreRenderScene(Integration::Scene& scene, Integration::Scene
             {
               RenderItem& item = renderList->GetItem(listIndex);
 
+              // For now, we don't allow to rendering nodeless renderer.
+              DALI_ASSERT_DEBUG(item.mNode && "RenderItem should have node!");
+
               // Get NodeInformation as const l-value, to reduce memory access operations.
               const SceneGraph::PartialRenderingData::NodeInfomations& nodeInfo = item.GetPartialRenderingDataNodeInfomations();
 
@@ -895,8 +892,7 @@ void RenderManager::PreRenderScene(Integration::Scene& scene, Integration::Scene
               DirtyRectKey dirtyRectKey(item.mNode, item.mRenderer);
               // If the item refers to updated node or renderer.
               if(item.mIsUpdated ||
-                 (item.mNode &&
-                  (item.mNode->Updated() || (item.mRenderer && item.mRenderer->Updated()))))
+                 (item.mNode->Updated() || (item.mRenderer && item.mRenderer->Updated())))
               {
                 item.mIsUpdated = false; /// DevNote : Reset flag here, since RenderItem could be reused by renderList.ReuseCachedItems().
 
@@ -1437,6 +1433,7 @@ void RenderManager::ClearScene(Integration::Scene scene)
   SceneGraph::Scene* sceneObject   = sceneInternal.GetSceneObject();
   if(!sceneObject)
   {
+    DALI_LOG_ERROR("Scene was empty handle. Skip ClearScene\n");
     return;
   }