X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.cpp;h=f8e81466e3dc81d5846fbbea67004120fe6398af;hb=3d95d69c92f1c9294479bf14ffaa66b8da840356;hp=4240fa0fe160a56bc983d7f1cc250525463c331d;hpb=716d916ef3929bbf21238c341f83817354386c22;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 4240fa0..f8e8146 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -44,20 +44,20 @@ //#define NODE_TREE_LOGGING 1 #if(defined(DEBUG_ENABLED) && defined(NODE_TREE_LOGGING)) -#define SNAPSHOT_NODE_LOGGING \ - const uint32_t FRAME_COUNT_TRIGGER = 16; \ - if(mImpl->frameCounter >= FRAME_COUNT_TRIGGER) \ - { \ - for(auto&& scene : mImpl->scenes) \ - { \ - if(scene && scene->root) \ - { \ - mImpl->frameCounter = 0; \ - PrintNodeTree(*scene->root, mSceneGraphBuffers.GetUpdateBufferIndex(), ""); \ - } \ - } \ - } -mImpl->frameCounter++; +#define SNAPSHOT_NODE_LOGGING \ + const uint32_t FRAME_COUNT_TRIGGER = 16; \ + if(mImpl->frameCounter >= FRAME_COUNT_TRIGGER) \ + { \ + for(auto&& scene : mImpl->scenes) \ + { \ + if(scene && scene->root) \ + { \ + mImpl->frameCounter = 0; \ + PrintNodes(*scene->root, mSceneGraphBuffers.GetUpdateBufferIndex(), 0); \ + } \ + } \ + } \ + mImpl->frameCounter++; #else #define SNAPSHOT_NODE_LOGGING #endif @@ -268,6 +268,7 @@ struct UpdateManager::Impl OwnerContainer customObjects; ///< A container of owned objects (with custom properties) OwnerContainer propertyResetters; ///< A container of property resetters + OwnerContainer nodeResetters; ///< A container of node resetters OwnerContainer animations; ///< A container of owned animations PropertyNotificationContainer propertyNotifications; ///< A container of owner property notifications. OwnerContainer renderers; ///< A container of owned renderers @@ -340,6 +341,8 @@ void UpdateManager::InstallRoot(OwnerPointer& layer) rootLayer->CreateTransform(&mImpl->transformManager); rootLayer->SetRoot(true); + AddNodeResetter(*rootLayer); + mImpl->scenes.emplace_back(new Impl::SceneInfo(rootLayer)); } @@ -384,6 +387,8 @@ void UpdateManager::ConnectNode(Node* parent, Node* node) parent->ConnectChild(node); + AddNodeResetter(*node); + // Inform the frame-callback-processor, if set, about the node-hierarchy changing if(mImpl->frameCallbackProcessor) { @@ -477,6 +482,9 @@ void UpdateManager::AddScene(OwnerPointer& scene) { mImpl->scenes.back()->scene = scene.Release(); + // Set root to the Scene + mImpl->scenes.back()->scene->SetRoot(mImpl->scenes.back()->root); + // Initialize the context from render manager typedef MessageValue1 DerivedType; @@ -555,6 +563,13 @@ void UpdateManager::AddPropertyResetter(OwnerPointer& prop mImpl->propertyResetters.PushBack(propertyResetter.Release()); } +void UpdateManager::AddNodeResetter(const Node& node) +{ + OwnerPointer nodeResetter = SceneGraph::NodeResetter::New(node); + nodeResetter->Initialize(); + mImpl->nodeResetters.PushBack(nodeResetter.Release()); +} + void UpdateManager::AddPropertyNotification(OwnerPointer& propertyNotification) { mImpl->propertyNotifications.PushBack(propertyNotification.Release()); @@ -659,19 +674,36 @@ void UpdateManager::ResetProperties(BufferIndex bufferIndex) // Clear the "animations finished" flag; This should be set if any (previously playing) animation is stopped mImpl->animationFinishedDuringUpdate = false; + // Reset node properties + std::vector nodeResetterToDelete; + for(auto&& element : mImpl->nodeResetters) + { + element->ResetToBaseValue(bufferIndex); + if(element->IsFinished()) + { + nodeResetterToDelete.push_back(element); + } + } + + // If a node resetter is no longer required, delete it. + for(auto&& elementPtr : nodeResetterToDelete) + { + mImpl->nodeResetters.EraseObject(elementPtr); + } + // Reset all animating / constrained properties - std::vector toDelete; + std::vector propertyResettertoDelete; for(auto&& element : mImpl->propertyResetters) { element->ResetToBaseValue(bufferIndex); if(element->IsFinished()) { - toDelete.push_back(element); + propertyResettertoDelete.push_back(element); } } - // If a resetter is no longer required (the animator or constraint has been removed), delete it. - for(auto&& elementPtr : toDelete) + // If a property resetter is no longer required (the animator or constraint has been removed), delete it. + for(auto&& elementPtr : propertyResettertoDelete) { mImpl->propertyResetters.EraseObject(elementPtr); } @@ -851,11 +883,23 @@ void UpdateManager::UpdateNodes(BufferIndex bufferIndex) } } +void UpdateManager::UpdateLayers(BufferIndex bufferIndex) +{ + for(auto&& scene : mImpl->scenes) + { + if(scene && scene->root) + { + SceneGraph::UpdateLayerTree(*scene->root, bufferIndex); + } + } +} + uint32_t UpdateManager::Update(float elapsedSeconds, uint32_t lastVSyncTimeMilliseconds, uint32_t nextVSyncTimeMilliseconds, bool renderToFboEnabled, - bool isRenderingToFbo) + bool isRenderingToFbo, + bool uploadOnly) { const BufferIndex bufferIndex = mSceneGraphBuffers.GetUpdateBufferIndex(); @@ -926,8 +970,7 @@ uint32_t UpdateManager::Update(float elapsedSeconds, mImpl->frameCallbackProcessor->Update(bufferIndex, elapsedSeconds); } - //Update node hierarchy, apply constraints and perform sorting / culling. - //This will populate each Layer with a list of renderers which are ready. + //Update node hierarchy, apply constraints, UpdateNodes(bufferIndex); //Apply constraints to RenderTasks, shaders @@ -943,6 +986,9 @@ uint32_t UpdateManager::Update(float elapsedSeconds, mImpl->nodeDirtyFlags |= NodePropertyFlags::TRANSFORM; } + //Initialise layer renderable reuse + UpdateLayers(bufferIndex); + //Process Property Notifications ProcessPropertyNotifications(bufferIndex); @@ -1001,36 +1047,39 @@ uint32_t UpdateManager::Update(float elapsedSeconds, } } - for(auto&& scene : mImpl->scenes) + if(!uploadOnly) { - if(scene && scene->root && scene->taskList) + for(auto&& scene : mImpl->scenes) { - RenderTaskList::RenderTaskContainer& tasks = scene->taskList->GetTasks(); - - // check the countdown and notify - bool doRenderOnceNotify = false; - mImpl->renderTaskWaiting = false; - for(auto&& renderTask : tasks) + if(scene && scene->root && scene->taskList) { - renderTask->UpdateState(); + RenderTaskList::RenderTaskContainer& tasks = scene->taskList->GetTasks(); - if(renderTask->IsWaitingToRender() && - renderTask->ReadyToRender(bufferIndex) /*avoid updating forever when source actor is off-stage*/) + // check the countdown and notify + bool doRenderOnceNotify = false; + mImpl->renderTaskWaiting = false; + for(auto&& renderTask : tasks) { - mImpl->renderTaskWaiting = true; // keep update/render threads alive + renderTask->UpdateState(); + + if(renderTask->IsWaitingToRender() && + renderTask->ReadyToRender(bufferIndex) /*avoid updating forever when source actor is off-stage*/) + { + mImpl->renderTaskWaiting = true; // keep update/render threads alive + } + + if(renderTask->HasRendered()) + { + doRenderOnceNotify = true; + } } - if(renderTask->HasRendered()) + if(doRenderOnceNotify) { - doRenderOnceNotify = true; + DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); + mImpl->notificationManager.QueueCompleteNotification(scene->taskList->GetCompleteNotificationInterface()); } } - - if(doRenderOnceNotify) - { - DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); - mImpl->notificationManager.QueueCompleteNotification(scene->taskList->GetCompleteNotificationInterface()); - } } }