} // 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();
// 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);
* @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()
{
if(!mOverlayRenderTask)
{
- mOverlayRenderTask = CreateTask(sourceActor, &mDefaults.GetDefaultCameraActor());
+ mOverlayRenderTask = RenderTask::New(sourceActor, cameraActor, *this, true);
+ mTasks.push_back(mOverlayRenderTask);
}
return mOverlayRenderTask;
}
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.