X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.cpp;h=dbdb9edba8a2124e9e223e13c2c5afa5e20ed1c0;hb=b067b6f30c7b8cfdaea9c39f7d2375ccb4e7fa81;hp=d6b62224839bf3904882e63c12d064aa2d86d3da;hpb=1909fcea2d2b1ff3adfdf16d4630a01e2190085c;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 d6b6222..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, @@ -183,8 +184,7 @@ struct UpdateManager::Impl RenderManager& renderManager, RenderQueue& renderQueue, SceneGraphBuffers& sceneGraphBuffers, - RenderTaskProcessor& renderTaskProcessor, - bool partialUpdateAvailable ) + RenderTaskProcessor& renderTaskProcessor ) : renderMessageDispatcher( renderManager, renderQueue, sceneGraphBuffers ), notificationManager( notificationManager ), transformManager(), @@ -196,7 +196,6 @@ struct UpdateManager::Impl sceneController( NULL ), renderManager( renderManager ), renderQueue( renderQueue ), - renderInstructions( renderManager.GetRenderInstructionContainer() ), renderTaskProcessor( renderTaskProcessor ), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), renderers(), @@ -213,8 +212,7 @@ struct UpdateManager::Impl previousUpdateScene( false ), renderTaskWaiting( false ), renderersAdded( false ), - surfaceRectChanged( false ), - partialUpdateAvailable( partialUpdateAvailable ) + surfaceRectChanged( false ) { sceneController = new SceneControllerImpl( renderMessageDispatcher, renderQueue, discardQueue ); @@ -285,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. @@ -324,7 +321,6 @@ struct UpdateManager::Impl bool renderTaskWaiting; ///< A REFRESH_ONCE render task is waiting to be rendered bool renderersAdded; ///< Flag to keep track when renderers have been added to avoid unnecessary processing bool surfaceRectChanged; ///< True if the default surface rect is changed - bool partialUpdateAvailable; ///< Whether the partial update is available private: @@ -339,8 +335,7 @@ UpdateManager::UpdateManager( NotificationManager& notificationManager, RenderController& controller, RenderManager& renderManager, RenderQueue& renderQueue, - RenderTaskProcessor& renderTaskProcessor, - bool partialUpdateAvailable ) + RenderTaskProcessor& renderTaskProcessor ) : mImpl(NULL) { mImpl = new Impl( notificationManager, @@ -351,8 +346,7 @@ UpdateManager::UpdateManager( NotificationManager& notificationManager, renderManager, renderQueue, mSceneGraphBuffers, - renderTaskProcessor, - partialUpdateAvailable ); + renderTaskProcessor ); } @@ -416,7 +410,6 @@ void UpdateManager::AddNode( OwnerPointer& node ) { mImpl->nodes.Insert((iter+1), rawNode ); rawNode->CreateTransform( &mImpl->transformManager ); - rawNode->SetPartialUpdateAvailable( mImpl->partialUpdateAvailable ); return; } } @@ -432,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 ) { @@ -523,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() ); @@ -978,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 ); } } @@ -1110,6 +1142,17 @@ void UpdateManager::SetDefaultSurfaceRect( const Rect& rect ) new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetDefaultSurfaceRect, rect ); } +void UpdateManager::SurfaceReplaced( Scene* scene ) +{ + 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::SurfaceReplaced, scene ); +} + void UpdateManager::SetDefaultSurfaceOrientation( int orientation ) { typedef MessageValue1< RenderManager, int > DerivedType;