X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Frender-tasks%2Frender-task-list-impl.cpp;h=42722b8fa56c1769d2e86fe2eec25c8340ab19b1;hb=eacc080fe975c523d722dd17c044652317ddd6e8;hp=c3a40d6dc08ff91b07bd8047e0f876f243b7ea91;hpb=c114bfe4714e8f02c54b25e381a41d80bdcb2d93;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/render-tasks/render-task-list-impl.cpp b/dali/internal/event/render-tasks/render-task-list-impl.cpp index c3a40d6..42722b8 100644 --- a/dali/internal/event/render-tasks/render-task-list-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-list-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,16 +19,15 @@ #include // INTERNAL INCLUDES -#include +#include #include -#include #include #include #include -#include -#include -#include #include +#include +#include +#include using Dali::Internal::SceneGraph::UpdateManager; @@ -55,38 +54,53 @@ RenderTaskListPtr RenderTaskList::New() RenderTaskPtr RenderTaskList::CreateTask() { - return CreateTask( &mDefaults.GetDefaultRootActor(), &mDefaults.GetDefaultCameraActor() ); + return CreateTask(&mDefaults.GetDefaultRootActor(), &mDefaults.GetDefaultCameraActor()); } -RenderTaskPtr RenderTaskList::CreateTask( Actor* sourceActor, CameraActor* cameraActor) +RenderTaskPtr RenderTaskList::CreateTask(Actor* sourceActor, CameraActor* cameraActor) { - RenderTaskPtr task = RenderTask::New( sourceActor, cameraActor, *mSceneObject ); - - mTasks.push_back( task ); + RenderTaskPtr task = RenderTask::New(sourceActor, cameraActor, *this); + if(mOverlayRenderTask && mTasks.back() == mOverlayRenderTask) + { + mTasks.insert(mTasks.end() - 1, task); + } + else + { + mTasks.push_back(task); + } return task; } -void RenderTaskList::RemoveTask( Internal::RenderTask& task ) +RenderTaskPtr RenderTaskList::CreateOverlayTask(Actor* sourceActor, CameraActor* cameraActor) { - for ( RenderTaskContainer::iterator iter = mTasks.begin(); mTasks.end() != iter; ++iter ) + if(!mOverlayRenderTask) { - if ( iter->Get() == &task ) + mOverlayRenderTask = CreateTask(sourceActor, &mDefaults.GetDefaultCameraActor()); + } + return mOverlayRenderTask; +} + +void RenderTaskList::RemoveTask(Internal::RenderTask& task) +{ + for(RenderTaskContainer::iterator iter = mTasks.begin(); mTasks.end() != iter; ++iter) + { + RenderTask* ptr = iter->Get(); + + if(ptr == &task) { const SceneGraph::RenderTask& sceneObject = task.GetRenderTaskSceneObject(); // delete the task - mTasks.erase( iter ); + mTasks.erase(iter); // send a message to remove the scene-graph RenderTask - RemoveTaskMessage( mEventThreadServices, *mSceneObject, sceneObject ); + RemoveTaskMessage(mEventThreadServices, *mSceneObject, sceneObject); - for ( Vector< Exclusive >::Iterator exclusiveIt = mExclusives.Begin(); exclusiveIt != mExclusives.End(); ++exclusiveIt ) + Exclusive exclusive{ptr, ActorObserver()}; + ExclusivesContainer::iterator exclusiveIter = find(mExclusives.begin(), mExclusives.end(), exclusive); + if(exclusiveIter != mExclusives.end()) { - if ( exclusiveIt->renderTaskPtr == iter->Get() ) - { - mExclusives.Erase( exclusiveIt ); - break; - } + mExclusives.erase(exclusiveIter); } break; // we're finished } @@ -95,58 +109,68 @@ void RenderTaskList::RemoveTask( Internal::RenderTask& task ) uint32_t RenderTaskList::GetTaskCount() const { - return static_cast( mTasks.size() ); // only 4,294,967,295 render tasks supported + return static_cast(mTasks.size()); // only 4,294,967,295 render tasks supported } -RenderTaskPtr RenderTaskList::GetTask( uint32_t index ) const +RenderTaskPtr RenderTaskList::GetTask(uint32_t index) const { - DALI_ASSERT_ALWAYS( ( index < mTasks.size() ) && "RenderTask index out-of-range" ); + DALI_ASSERT_ALWAYS((index < mTasks.size()) && "RenderTask index out-of-range"); - return mTasks[ index ]; + return mTasks[index]; } -void RenderTaskList::SetExclusive( RenderTask* task, bool exclusive ) +RenderTaskPtr RenderTaskList::GetOverlayTask() const +{ + RenderTaskPtr overlayRenderTask; + if(mOverlayRenderTask) + { + overlayRenderTask = mOverlayRenderTask; + } + return overlayRenderTask; +} + +void RenderTaskList::SetExclusive(RenderTask* task, bool exclusive) { // Check to see if this rendertask has an entry? - for ( Vector< Exclusive >::Iterator exclusiveIt = mExclusives.Begin(); exclusiveIt != mExclusives.End(); ++exclusiveIt ) + for(auto exclusiveIt = mExclusives.begin(); exclusiveIt != mExclusives.end(); ++exclusiveIt) { - if ( exclusiveIt->renderTaskPtr == task ) + if(exclusiveIt->renderTaskPtr == task) { - if ( !exclusive ) + if(!exclusive) { - mExclusives.Erase( exclusiveIt ); + mExclusives.erase(exclusiveIt); break; } else { - exclusiveIt->actorPtr = task->GetSourceActor(); + exclusiveIt->actor.SetActor(task->GetSourceActor()); exclusive = false; break; } } } - if ( exclusive ) + if(exclusive) { Exclusive exclusiveSlot; exclusiveSlot.renderTaskPtr = task; - exclusiveSlot.actorPtr = task->GetSourceActor(); - mExclusives.PushBack( exclusiveSlot ); + exclusiveSlot.actor.SetActor(task->GetSourceActor()); + mExclusives.emplace_back(std::move(exclusiveSlot)); } } RenderTaskList::RenderTaskList() -: mEventThreadServices( *Stage::GetCurrent() ), - mDefaults( *Stage::GetCurrent() ), - mSceneObject( nullptr ) +: mEventThreadServices(EventThreadServices::Get()), + mDefaults(*Stage::GetCurrent()), + mSceneObject(nullptr) { } RenderTaskList::~RenderTaskList() { - if( EventThreadServices::IsCoreRunning() && mSceneObject ) + if(EventThreadServices::IsCoreRunning() && mSceneObject) { // Remove the render task list using a message to the update manager - RemoveRenderTaskListMessage( mEventThreadServices.GetUpdateManager(), *mSceneObject ); + RemoveRenderTaskListMessage(mEventThreadServices.GetUpdateManager(), *mSceneObject); } } @@ -155,11 +179,11 @@ void RenderTaskList::Initialize() // Create a new render task list, Keep a const pointer to the render task list. mSceneObject = SceneGraph::RenderTaskList::New(); - OwnerPointer< SceneGraph::RenderTaskList > transferOwnership( const_cast< SceneGraph::RenderTaskList* >( mSceneObject ) ); - AddRenderTaskListMessage( mEventThreadServices.GetUpdateManager(), transferOwnership ); + OwnerPointer transferOwnership(const_cast(mSceneObject)); + AddRenderTaskListMessage(mEventThreadServices.GetUpdateManager(), transferOwnership); // set the callback to call us back when tasks are completed - mSceneObject->SetCompleteNotificationInterface( this ); + mSceneObject->SetCompleteNotificationInterface(this); } void RenderTaskList::NotifyCompleted() @@ -170,16 +194,16 @@ void RenderTaskList::NotifyCompleted() // Since render tasks can be unreferenced during the signal emissions, iterators into render tasks pointers may be invalidated. // First copy the finished render tasks, then emit signals - for ( RenderTaskContainer::iterator iter = mTasks.begin(), endIt = mTasks.end(); iter != endIt; ++iter ) + for(RenderTaskContainer::iterator iter = mTasks.begin(), endIt = mTasks.end(); iter != endIt; ++iter) { - if( (*iter)->HasFinished() ) + if((*iter)->HasFinished()) { - finishedRenderTasks.push_back( *iter ); + finishedRenderTasks.push_back(*iter); } } // Now it's safe to emit the signals - for ( auto&& item : finishedRenderTasks ) + for(auto&& item : finishedRenderTasks) { item->EmitSignalFinish(); } @@ -187,16 +211,21 @@ void RenderTaskList::NotifyCompleted() void RenderTaskList::RecoverFromContextLoss() { - for ( auto&& item : mTasks ) + for(auto&& item : mTasks) { // If the render target renders only once to an offscreen, re-render the render task - if( item->GetRefreshRate() == Dali::RenderTask::REFRESH_ONCE && item->GetTargetFrameBuffer() ) + if(item->GetRefreshRate() == Dali::RenderTask::REFRESH_ONCE && item->GetFrameBuffer()) { - item->SetRefreshRate( Dali::RenderTask::REFRESH_ONCE ); + item->SetRefreshRate(Dali::RenderTask::REFRESH_ONCE); } } } +const SceneGraph::RenderTaskList& RenderTaskList::GetSceneObject() const +{ + return *mSceneObject; +} + } // namespace Internal } // namespace Dali