Ensure to SceneObject initialized 32/321532/2
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 24 Mar 2025 10:30:59 +0000 (19:30 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 25 Mar 2025 02:00:26 +0000 (11:00 +0900)
Change-Id: Ia8a6a842840def7a758adaf45f0957e0a6a171de
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 971ff23001528568aab18bc0075fe178a470369d..8791c40f7353aae4d7414dea7832d6f561bfddef 100644 (file)
@@ -249,3 +249,52 @@ int UtcDaliCoreClearScene(void)
   DALI_TEST_CHECK(contTrace.FindMethod("PresentRenderTarget"));
   END_TEST;
 }
+
+int UtcDaliCoreClearSceneN(void)
+{
+  TestApplication application;
+  tet_infoline("Testing Dali::Integration::Core::ClearScene with invalid scene");
+
+  application.GetScene().SetBackgroundColor(Color::MAGENTA);
+
+  // 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();
+
+  // Create new scene befoer Render(), and after SendNotification()
+  application.SendNotification();
+  Dali::Integration::Scene newScene = Dali::Integration::Scene::New(Size(480.0f, 800.0f));
+  application.Render();
+
+  DALI_TEST_CHECK(!cmdTrace.FindMethod("BeginRenderPass"));
+
+  auto& core = application.GetCore();
+
+  // 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();
+
+  // Frame update once. Now newScene is valid
+  application.SendNotification();
+  application.Render();
+
+  core.ClearScene(newScene);
+  DALI_TEST_CHECK(cmdTrace.FindMethod("BeginRenderPass"));
+
+  END_TEST;
+}
index 44a229220eb09c7cc063357d5a2afa041bd2130e..d9d6bac3456e8340bdbeac586e7e9fa3931bc58d 100644 (file)
@@ -1396,6 +1396,13 @@ void RenderManager::ClearScene(Integration::Scene scene)
     return;
   }
 
+  // TODO : Optimize might be required here! For now, the number of connected scene is small. So it looks enough.
+  auto iter = std::find(mImpl->sceneContainer.begin(), mImpl->sceneContainer.end(), sceneObject);
+  if(iter == mImpl->sceneContainer.end())
+  {
+    return;
+  }
+
   auto& currentClearValues = sceneObject->GetGraphicsRenderPassClearValues();
   DALI_ASSERT_DEBUG(!currentClearValues.empty());