Fix error of overlay layer 24/287224/1
authorseungho baek <sbsh.baek@samsung.com>
Wed, 25 Jan 2023 04:59:37 +0000 (13:59 +0900)
committerseungho baek <sbsh.baek@samsung.com>
Wed, 25 Jan 2023 04:59:37 +0000 (13:59 +0900)
Change-Id: Iab39bd723d30b088dbdf8dbfe78816ca6652919f
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
dali/internal/event/render-tasks/render-task-impl.cpp
dali/internal/event/render-tasks/render-task-impl.h
dali/internal/event/render-tasks/render-task-list-impl.cpp
dali/internal/update/render-tasks/scene-graph-render-task-list.h

index 9ae9bc7..d0032dd 100644 (file)
@@ -68,7 +68,7 @@ SignalConnectorType signalConnector1(mType, SIGNAL_FINISHED, &RenderTask::DoConn
 
 } // Unnamed namespace
 
-RenderTaskPtr RenderTask::New(Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList)
+RenderTaskPtr RenderTask::New(Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList, bool isOverlayTask)
 {
   // create scene object first so it's guaranteed to exist for the event side
   auto sceneObject = SceneGraph::RenderTask::New();
@@ -79,7 +79,14 @@ RenderTaskPtr RenderTask::New(Actor* sourceActor, CameraActor* cameraActor, Rend
   // transfer scene object ownership to update manager
   const SceneGraph::RenderTaskList&    parentSceneObject = renderTaskList.GetSceneObject();
   OwnerPointer<SceneGraph::RenderTask> transferOwnership(sceneObject);
-  AddTaskMessage(task->GetEventThreadServices(), parentSceneObject, transferOwnership);
+  if(isOverlayTask)
+  {
+    AddOverlayTaskMessage(task->GetEventThreadServices(), parentSceneObject, transferOwnership);
+  }
+  else
+  {
+    AddTaskMessage(task->GetEventThreadServices(), parentSceneObject, transferOwnership);
+  }
 
   // Set the default source & camera actors
   task->SetSourceActor(sourceActor);
index b939691..0969916 100644 (file)
@@ -56,9 +56,10 @@ public:
    * @param[in] sourceActor The source actor.
    * @param[in] cameraActor The camera actor.
    * @param[in] renderTaskList The render task list.
+   * @param[in] isOverlayTask True if this render task is overlay task. default is false.
    * @return The created render task
    */
-  static RenderTaskPtr New(Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList);
+  static RenderTaskPtr New(Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList, bool isOverlayTask = false);
 
   /**
    * @copydoc Dali::RenderTask::SetSourceActor()
index 42722b8..6f512d2 100644 (file)
@@ -76,7 +76,8 @@ RenderTaskPtr RenderTaskList::CreateOverlayTask(Actor* sourceActor, CameraActor*
 {
   if(!mOverlayRenderTask)
   {
-    mOverlayRenderTask = CreateTask(sourceActor, &mDefaults.GetDefaultCameraActor());
+    mOverlayRenderTask = RenderTask::New(sourceActor, cameraActor, *this, true);
+    mTasks.push_back(mOverlayRenderTask);
   }
   return mOverlayRenderTask;
 }
index 2b7242d..625cead 100644 (file)
@@ -152,6 +152,18 @@ inline void AddTaskMessage(EventThreadServices& eventThreadServices, const Rende
   new(slot) LocalType(&list, &RenderTaskList::AddTask, task);
 }
 
+inline void AddOverlayTaskMessage(EventThreadServices& eventThreadServices, const RenderTaskList& list, OwnerPointer<RenderTask>& task)
+{
+  // Message has ownership of the RenderTask while in transit from event -> update
+  using LocalType = MessageValue1<RenderTaskList, OwnerPointer<RenderTask> >;
+
+  // Reserve some memory inside the message queue
+  uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
+
+  // Construct message in the message queue memory; note that delete should not be called on the return value
+  new(slot) LocalType(&list, &RenderTaskList::AddOverlayTask, task);
+}
+
 inline void RemoveTaskMessage(EventThreadServices& eventThreadServices, const RenderTaskList& list, const RenderTask& constTask)
 {
   // Scene graph thread can destroy this object.