X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.cpp;h=dbdb9edba8a2124e9e223e13c2c5afa5e20ed1c0;hb=b067b6f30c7b8cfdaea9c39f7d2375ccb4e7fa81;hp=b2390ab20861a74b4e8dec95f498c17797b12ccc;hpb=4fad7c0fbcdc7c359a852db081dc5db15a9b4db8;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 old mode 100755 new mode 100644 index b2390ab..dbdb9ed --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -173,6 +173,7 @@ struct UpdateManager::Impl Layer* root{ nullptr }; ///< Root node (root is a layer). The layer is not stored in the node memory pool. OwnerPointer< RenderTaskList > taskList; ///< Scene graph render task list SortedLayerPointers sortedLayerList; ///< List of Layer pointers sorted by depth (one list of sorted layers per root) + OwnerPointer< Scene > scene; ///< Scene graph object of the scene }; Impl( NotificationManager& notificationManager, @@ -195,7 +196,6 @@ struct UpdateManager::Impl sceneController( NULL ), renderManager( renderManager ), renderQueue( renderQueue ), - renderInstructions( renderManager.GetRenderInstructionContainer() ), renderTaskProcessor( renderTaskProcessor ), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), renderers(), @@ -283,7 +283,6 @@ struct UpdateManager::Impl SceneControllerImpl* sceneController; ///< scene controller RenderManager& renderManager; ///< This is responsible for rendering the results of each "update" RenderQueue& renderQueue; ///< Used to queue messages for the next render - RenderInstructionContainer& renderInstructions; ///< Used to prepare the render instructions RenderTaskProcessor& renderTaskProcessor; ///< Handles RenderTasks and RenderInstrucitons Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame. @@ -426,8 +425,6 @@ void UpdateManager::ConnectNode( Node* parent, Node* node ) parent->ConnectChild( node ); - parent->SetPropertyDirty( true ); - // Inform the frame-callback-processor, if set, about the node-hierarchy changing if( mImpl->frameCallbackProcessor ) { @@ -517,6 +514,42 @@ void UpdateManager::RemoveRenderTaskList( RenderTaskList* taskList ) } } +void UpdateManager::AddScene( OwnerPointer< Scene >& scene ) +{ + mImpl->scenes.back()->scene = scene.Release(); + + // Initialize the context from render manager + typedef MessageValue1< RenderManager, SceneGraph::Scene* > DerivedType; + + // Reserve some memory inside the render queue + uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + + // Construct message in the render queue memory; note that delete should not be called on the return value + SceneGraph::Scene& sceneObject = *mImpl->scenes.back()->scene; + new (slot) DerivedType( &mImpl->renderManager, &RenderManager::InitializeScene, &sceneObject ); +} + +void UpdateManager::RemoveScene( Scene* scene ) +{ + // Initialize the context from render manager + typedef MessageValue1< RenderManager, SceneGraph::Scene* > DerivedType; + + // Reserve some memory inside the render queue + uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + + // Construct message in the render queue memory; note that delete should not be called on the return value + new (slot) DerivedType( &mImpl->renderManager, &RenderManager::UninitializeScene, scene ); + + for ( auto&& sceneInfo : mImpl->scenes ) + { + if ( sceneInfo && sceneInfo->scene && sceneInfo->scene.Get() == scene ) + { + sceneInfo->scene.Reset(); + break; + } + } +} + void UpdateManager::AddAnimation( OwnerPointer< SceneGraph::Animation >& animation ) { mImpl->animations.PushBack( animation.Release() ); @@ -695,6 +728,13 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) mImpl->propertyResetters.EraseObject( elementPtr ); } + // Clear all root nodes dirty flags + for( auto& scene : mImpl->scenes ) + { + auto root = scene->root; + root->ResetDirtyFlags( bufferIndex ); + } + // Clear node dirty flags Vector::Iterator iter = mImpl->nodes.Begin()+1; Vector::Iterator endIter = mImpl->nodes.End(); @@ -965,26 +1005,31 @@ uint32_t UpdateManager::Update( float elapsedSeconds, } } - mImpl->renderInstructions.ResetAndReserve( bufferIndex, - static_cast( numberOfRenderTasks ) ); + std::size_t numberOfRenderInstructions = 0; for ( auto&& scene : mImpl->scenes ) { - if ( scene && scene->root && scene->taskList ) + if ( scene && scene->root && scene->taskList && scene->scene ) { + scene->scene->GetRenderInstructions().ResetAndReserve( bufferIndex, + static_cast( scene->taskList->GetTasks().Count() ) ); + keepRendererRendering |= mImpl->renderTaskProcessor.Process( bufferIndex, *scene->taskList, *scene->root, scene->sortedLayerList, - mImpl->renderInstructions, + *scene->scene->GetContext(), + scene->scene->GetRenderInstructions(), renderToFboEnabled, isRenderingToFbo ); + + numberOfRenderInstructions += scene->scene->GetRenderInstructions().Count( bufferIndex ); } } DALI_LOG_INFO( gLogFilter, Debug::General, "Update: numberOfRenderTasks(%d), Render Instructions(%d)\n", - numberOfRenderTasks, mImpl->renderInstructions.Count( bufferIndex ) ); + numberOfRenderTasks, numberOfRenderInstructions ); } } @@ -1033,6 +1078,9 @@ uint32_t UpdateManager::Update( float elapsedSeconds, if( keepRendererRendering ) { keepUpdating |= KeepUpdating::STAGE_KEEP_RENDERING; + + // Set dirty flags for next frame to continue rendering + mImpl->nodeDirtyFlags |= RenderableUpdateFlags; } // tell the update manager that we're done so the queue can be given to event thread @@ -1081,28 +1129,28 @@ uint32_t UpdateManager::KeepUpdatingCheck( float elapsedSeconds ) const return keepUpdatingRequest; } -void UpdateManager::SetBackgroundColor( const Vector4& color ) +void UpdateManager::SetDefaultSurfaceRect( const Rect& rect ) { - typedef MessageValue1< RenderManager, Vector4 > DerivedType; + mImpl->surfaceRectChanged = true; + + typedef MessageValue1< RenderManager, Rect > DerivedType; // Reserve some memory inside the render queue uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); // Construct message in the render queue memory; note that delete should not be called on the return value - new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetBackgroundColor, color ); + new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetDefaultSurfaceRect, rect ); } -void UpdateManager::SetDefaultSurfaceRect( const Rect& rect ) +void UpdateManager::SurfaceReplaced( Scene* scene ) { - mImpl->surfaceRectChanged = true; - - typedef MessageValue1< RenderManager, Rect > DerivedType; + typedef MessageValue1< RenderManager, Scene* > DerivedType; // Reserve some memory inside the render queue uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); // Construct message in the render queue memory; note that delete should not be called on the return value - new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetDefaultSurfaceRect, rect ); + new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SurfaceReplaced, scene ); } void UpdateManager::SetDefaultSurfaceOrientation( int orientation )