Fix surface deletion order issue
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
index ea5c689..d60e48b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -65,12 +65,6 @@ Scene::Scene()
 
 Scene::~Scene()
 {
-  if(EventThreadServices::IsCoreRunning() && mSceneObject)
-  {
-    ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
-    RemoveSceneMessage(tls->GetUpdateManager(), *mSceneObject);
-  }
-
   if(mDefaultCamera)
   {
     // its enough to release the handle so the object is released
@@ -85,6 +79,11 @@ Scene::~Scene()
     mRootLayer.Reset();
   }
 
+  if(mOverlayLayer)
+  {
+    mOverlayLayer.Reset();
+  }
+
   if(mRenderTaskList)
   {
     mRenderTaskList.Reset();
@@ -174,6 +173,26 @@ Dali::Layer Scene::GetRootLayer() const
   return Dali::Layer(mRootLayer.Get());
 }
 
+Dali::Layer Scene::GetOverlayLayer()
+{
+  if(!mOverlayLayer)
+  {
+    // Creates overlay layer.
+    mOverlayLayer = Layer::New();
+    mOverlayLayer->SetName("OverlayLayer");
+    mOverlayLayer->SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
+    mOverlayLayer->SetParentOrigin(Dali::ParentOrigin::TOP_LEFT);
+    mOverlayLayer->SetAnchorPoint(Dali::AnchorPoint::TOP_LEFT);
+    mRootLayer->Add(*mOverlayLayer);
+
+    // Create the overlay render-task and set exclusive to true.
+    RenderTaskPtr renderTask = mRenderTaskList->CreateOverlayTask(mOverlayLayer.Get(), mDefaultCamera.Get());
+    renderTask->SetExclusive(true);
+    renderTask->SetInputEnabled(true);
+  }
+  return Dali::Layer(mOverlayLayer.Get());
+}
+
 LayerList& Scene::GetLayerList() const
 {
   return *mLayerList;
@@ -216,9 +235,19 @@ void Scene::SurfaceReplaced()
   }
 }
 
+void Scene::RemoveSceneObject()
+{
+  if(EventThreadServices::IsCoreRunning() && mSceneObject)
+  {
+    ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
+    RemoveSceneMessage(tls->GetUpdateManager(), *mSceneObject);
+    mSceneObject = nullptr;
+  }
+}
+
 void Scene::Discard()
 {
-  if(ThreadLocalStorage::Created())
+  if(EventThreadServices::IsCoreRunning())
   {
     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
     tls->RemoveScene(this);
@@ -285,22 +314,23 @@ void Scene::SurfaceRotated(float width, float height, int32_t windowOrientation,
 
 int32_t Scene::GetCurrentSurfaceOrientation() const
 {
-  return mSceneObject->GetSurfaceOrientation();
+  return mSceneObject ? mSceneObject->GetSurfaceOrientation() : 0;
 }
 
 int32_t Scene::GetCurrentScreenOrientation() const
 {
-  return mSceneObject->GetScreenOrientation();
+  return mSceneObject ? mSceneObject->GetScreenOrientation() : 0;
 }
 
 const Rect<int32_t>& Scene::GetCurrentSurfaceRect() const
 {
-  return mSceneObject->GetSurfaceRect();
+  static Rect<int32_t> emptyRect{};
+  return mSceneObject ? mSceneObject->GetSurfaceRect() : emptyRect;
 }
 
 void Scene::ChangedSurface(float width, float height, int32_t windowOrientation, int32_t screenOrientation)
 {
-  bool changedOrientation = false;
+  bool          changedOrientation = false;
   Rect<int32_t> newSize(0, 0, static_cast<int32_t>(width), static_cast<int32_t>(height)); // truncated
   mSize.width  = width;
   mSize.height = height;
@@ -311,7 +341,7 @@ void Scene::ChangedSurface(float width, float height, int32_t windowOrientation,
   }
 
   mSurfaceOrientation = windowOrientation;
-  mScreenOrientation = screenOrientation;
+  mScreenOrientation  = screenOrientation;
 
   // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
   mDefaultCamera->SetPerspectiveProjection(mSize);
@@ -337,16 +367,22 @@ void Scene::ChangedSurface(float width, float height, int32_t windowOrientation,
   // set default render-task viewport parameters
   RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask(0u);
   defaultRenderTask->SetViewport(newSize);
+  // set overlay render-task viewport parameters
+  RenderTaskPtr overlayRenderTask = mRenderTaskList->GetOverlayTask();
+  if(overlayRenderTask)
+  {
+    overlayRenderTask->SetViewport(newSize);
+  }
 }
 
 bool Scene::IsSurfaceRectChanged() const
 {
-  return mSceneObject->IsSurfaceRectChanged();
+  return mSceneObject ? mSceneObject->IsSurfaceRectChanged() : false;
 }
 
 bool Scene::IsRotationCompletedAcknowledgementSet() const
 {
-  return mSceneObject->IsRotationCompletedAcknowledgementSet();
+  return mSceneObject ? mSceneObject->IsRotationCompletedAcknowledgementSet() : false;
 }
 
 void Scene::SetRotationCompletedAcknowledgement()
@@ -424,12 +460,18 @@ void Scene::AddFramePresentedCallback(std::unique_ptr<CallbackBase> callback, in
 
 void Scene::GetFrameRenderedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
 {
-  mSceneObject->GetFrameRenderedCallback(callbacks);
+  if(mSceneObject)
+  {
+    mSceneObject->GetFrameRenderedCallback(callbacks);
+  }
 }
 
 void Scene::GetFramePresentedCallback(Dali::Integration::Scene::FrameCallbackContainer& callbacks)
 {
-  mSceneObject->GetFramePresentedCallback(callbacks);
+  if(mSceneObject)
+  {
+    mSceneObject->GetFramePresentedCallback(callbacks);
+  }
 }
 
 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()