X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.cpp;h=4d1842ed265d8def4ea0055a3499a763f8e84a24;hb=b43741a90b40ca9dfbd33d6a9d390d3c09230e89;hp=84722e48d2083ced0d1aabf281f43439c8a1c4ca;hpb=2974721ab73ea425461158f56fae89838abb3de6;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 100644 new mode 100755 index 84722e4..4d1842e --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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. @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -67,13 +68,16 @@ #if ( defined( DEBUG_ENABLED ) && defined( NODE_TREE_LOGGING ) ) #define SNAPSHOT_NODE_LOGGING \ -const int FRAME_COUNT_TRIGGER = 16;\ +const uint32_t FRAME_COUNT_TRIGGER = 16;\ if( mImpl->frameCounter >= FRAME_COUNT_TRIGGER )\ {\ - if ( NULL != mImpl->root )\ + for( auto&& scene : mImpl->scenes ) {\ - mImpl->frameCounter = 0;\ - PrintNodeTree( *mImpl->root, mSceneGraphBuffers.GetUpdateBufferIndex(), "" );\ + if ( scene && scene->root )\ + {\ + mImpl->frameCounter = 0;\ + PrintNodeTree( *scene->root, mSceneGraphBuffers.GetUpdateBufferIndex(), "" );\ + }\ }\ }\ mImpl->frameCounter++; @@ -83,6 +87,10 @@ mImpl->frameCounter++; #if defined(DEBUG_ENABLED) extern Debug::Filter* gRenderTaskLogFilter; +namespace +{ +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_UPDATE_MANAGER" ); +} // unnamed namespace #endif @@ -101,22 +109,6 @@ namespace SceneGraph namespace { /** - * Helper to reset animate-able objects to base values - * @param container to iterate over - * @param updateBufferIndex to use - */ -template< class T > -inline void ResetToBaseValues( OwnerContainer& container, BufferIndex updateBufferIndex ) -{ - // Reset animatable properties to base values - // use reference to avoid extra copies of the iterator - for( auto&& iter : container ) - { - iter->ResetToBaseValues( updateBufferIndex ); - } -} - -/** * Helper to Erase an object from OwnerContainer using discard queue * @param container to remove from * @param object to remove @@ -164,6 +156,25 @@ void SortSiblingNodesRecursively( Node& node ) */ struct UpdateManager::Impl { + // SceneInfo keeps the root node of the Scene, its scene graph render task list, and the list of Layer pointers sorted by depth + struct SceneInfo + { + SceneInfo( Layer* root ) ///< Constructor + : root( root ) + { + } + + ~SceneInfo() = default; ///< Default non-virtual destructor + SceneInfo( SceneInfo&& rhs ) = default; ///< Move constructor + SceneInfo& operator=( SceneInfo&& rhs ) = default; ///< Move assignment operator + SceneInfo& operator=( const SceneInfo& rhs ) = delete; ///< Assignment operator + SceneInfo( const SceneInfo& rhs ) = delete; ///< Copy constructor + + 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) + }; + Impl( NotificationManager& notificationManager, CompleteNotificationInterface& animationPlaylist, PropertyNotifier& propertyNotifier, @@ -187,10 +198,6 @@ struct UpdateManager::Impl renderInstructions( renderManager.GetRenderInstructionContainer() ), renderTaskProcessor( renderTaskProcessor ), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), - taskList( renderMessageDispatcher ), - systemLevelTaskList( renderMessageDispatcher ), - root( NULL ), - systemLevelRoot( NULL ), renderers(), textureSets(), shaders(), @@ -198,7 +205,7 @@ struct UpdateManager::Impl messageQueue( renderController, sceneGraphBuffers ), frameCallbackProcessor( NULL ), keepRenderingSeconds( 0.0f ), - nodeDirtyFlags( TransformFlag ), // set to TransformFlag to ensure full update the first time through Update() + nodeDirtyFlags( NodePropertyFlags::TRANSFORM ), // set to TransformFlag to ensure full update the first time through Update() frameCounter( 0 ), renderingBehavior( DevelStage::Rendering::IF_REQUIRED ), animationFinishedDuringUpdate( false ), @@ -216,16 +223,16 @@ struct UpdateManager::Impl ~Impl() { // Disconnect render tasks from nodes, before destroying the nodes - RenderTaskList::RenderTaskContainer& tasks = taskList.GetTasks(); - for ( auto&& iter : tasks ) + for( auto&& scene : scenes ) { - iter->SetSourceNode( NULL ); - } - // ..repeat for system level RenderTasks - RenderTaskList::RenderTaskContainer& systemLevelTasks = systemLevelTaskList.GetTasks(); - for ( auto&& iter : systemLevelTasks ) - { - iter->SetSourceNode( NULL ); + if ( scene && scene->taskList ) + { + RenderTaskList::RenderTaskContainer& tasks = scene->taskList->GetTasks(); + for ( auto&& task : tasks ) + { + task->SetSourceNode( NULL ); + } + } } // UpdateManager owns the Nodes. Although Nodes are pool allocated they contain heap allocated parts @@ -238,34 +245,28 @@ struct UpdateManager::Impl Node::Delete(*iter); } - // If there is root, reset it, otherwise do nothing as rendering was never started - if( root ) + for( auto&& scene : scenes ) { - root->OnDestroy(); - - Node::Delete( root ); - root = NULL; - } - - if( systemLevelRoot ) - { - systemLevelRoot->OnDestroy(); - - Node::Delete( systemLevelRoot ); - systemLevelRoot = NULL; + if ( scene && scene->root ) + { + scene->root->OnDestroy(); + Node::Delete( scene->root ); + } } + scenes.clear(); delete sceneController; } /** * Lazy init for FrameCallbackProcessor. + * @param[in] updateManager A reference to the update-manager */ - FrameCallbackProcessor& GetFrameCallbackProcessor() + FrameCallbackProcessor& GetFrameCallbackProcessor( UpdateManager& updateManager ) { if( ! frameCallbackProcessor ) { - frameCallbackProcessor = new FrameCallbackProcessor( transformManager ); + frameCallbackProcessor = new FrameCallbackProcessor( updateManager, transformManager ); } return *frameCallbackProcessor; } @@ -287,22 +288,16 @@ struct UpdateManager::Impl Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame. - RenderTaskList taskList; ///< The list of scene graph render-tasks - RenderTaskList systemLevelTaskList; ///< Separate render-tasks for system-level content - - Layer* root; ///< The root node (root is a layer) - Layer* systemLevelRoot; ///< A separate root-node for system-level content + using SceneInfoPtr = std::unique_ptr< SceneInfo >; + std::vector< SceneInfoPtr > scenes; ///< A container of SceneInfo. Vector nodes; ///< A container of all instantiated nodes - SortedLayerPointers sortedLayers; ///< A container of Layer pointers sorted by depth - SortedLayerPointers systemLevelSortedLayers; ///< A separate container of system-level Layers - OwnerContainer< Camera* > cameras; ///< A container of cameras OwnerContainer< PropertyOwner* > customObjects; ///< A container of owned objects (with custom properties) OwnerContainer< PropertyResetterBase* > propertyResetters; ///< A container of property resetters - AnimationContainer animations; ///< A container of owned animations + OwnerContainer< Animation* > animations; ///< A container of owned animations PropertyNotificationContainer propertyNotifications; ///< A container of owner property notifications. OwnerContainer< Renderer* > renderers; ///< A container of owned renderers OwnerContainer< TextureSet* > textureSets; ///< A container of owned texture sets @@ -317,8 +312,8 @@ struct UpdateManager::Impl OwnerPointer frameCallbackProcessor; ///< Owned FrameCallbackProcessor, only created if required. float keepRenderingSeconds; ///< Set via Dali::Stage::KeepRendering - int nodeDirtyFlags; ///< cumulative node dirty flags from previous frame - int frameCounter; ///< Frame counter used in debugging to choose which frame to debug and which to ignore. + NodePropertyFlags nodeDirtyFlags; ///< cumulative node dirty flags from previous frame + uint32_t frameCounter; ///< Frame counter used in debugging to choose which frame to debug and which to ignore. DevelStage::Rendering renderingBehavior; ///< Set via DevelStage::SetRenderingBehavior @@ -361,26 +356,44 @@ UpdateManager::~UpdateManager() delete mImpl; } -void UpdateManager::InstallRoot( OwnerPointer& layer, bool systemLevel ) +void UpdateManager::InstallRoot( OwnerPointer& layer ) { DALI_ASSERT_DEBUG( layer->IsLayer() ); DALI_ASSERT_DEBUG( layer->GetParent() == NULL); - if ( !systemLevel ) - { - DALI_ASSERT_DEBUG( mImpl->root == NULL && "Root Node already installed" ); - mImpl->root = layer.Release(); - mImpl->root->CreateTransform( &mImpl->transformManager ); - mImpl->root->SetRoot(true); - } - else + Layer* rootLayer = layer.Release(); + + DALI_ASSERT_DEBUG( std::find_if( mImpl->scenes.begin(), mImpl->scenes.end(), + [rootLayer]( Impl::SceneInfoPtr& scene ) + { + return scene && scene->root == rootLayer; + } + ) == mImpl->scenes.end() && "Root Node already installed" ); + + rootLayer->CreateTransform( &mImpl->transformManager ); + rootLayer->SetRoot(true); + + mImpl->scenes.emplace_back( new Impl::SceneInfo( rootLayer ) ); +} + +void UpdateManager::UninstallRoot( Layer* layer ) +{ + DALI_ASSERT_DEBUG( layer->IsLayer() ); + DALI_ASSERT_DEBUG( layer->GetParent() == NULL ); + + for (auto iter = mImpl->scenes.begin(); iter != mImpl->scenes.end(); ++iter) { - DALI_ASSERT_DEBUG( mImpl->systemLevelRoot == NULL && "System-level Root Node already installed" ); - mImpl->systemLevelRoot = layer.Release(); - mImpl->systemLevelRoot->CreateTransform( &mImpl->transformManager ); - mImpl->systemLevelRoot->SetRoot(true); + if( (*iter) && (*iter)->root == layer ) + { + mImpl->scenes.erase( iter ); + break; + } } + mImpl->discardQueue.Add( mSceneGraphBuffers.GetUpdateBufferIndex(), layer ); + + // Notify the layer about impending destruction + layer->OnDestroy(); } void UpdateManager::AddNode( OwnerPointer& node ) @@ -389,6 +402,8 @@ void UpdateManager::AddNode( OwnerPointer& node ) // Nodes must be sorted by pointer Node* rawNode = node.Release(); + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] AddNode\n", rawNode ); + Vector::Iterator begin = mImpl->nodes.Begin(); for( Vector::Iterator iter = mImpl->nodes.End()-1; iter >= begin; --iter ) { @@ -407,8 +422,12 @@ void UpdateManager::ConnectNode( Node* parent, Node* node ) DALI_ASSERT_ALWAYS( NULL != node ); DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should not have a parent yet + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] ConnectNode\n", node ); + parent->ConnectChild( node ); + parent->SetPropertyDirty( true ); + // Inform the frame-callback-processor, if set, about the node-hierarchy changing if( mImpl->frameCallbackProcessor ) { @@ -418,9 +437,11 @@ void UpdateManager::ConnectNode( Node* parent, Node* node ) void UpdateManager::DisconnectNode( Node* node ) { + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] DisconnectNode\n", node ); + Node* parent = node->GetParent(); DALI_ASSERT_ALWAYS( NULL != parent ); - parent->SetDirtyFlag( ChildDeletedFlag ); // make parent dirty so that render items dont get reused + parent->SetDirtyFlag( NodePropertyFlags::CHILD_DELETED ); // make parent dirty so that render items dont get reused parent->DisconnectChild( mSceneGraphBuffers.GetUpdateBufferIndex(), *node ); @@ -436,6 +457,8 @@ void UpdateManager::DestroyNode( Node* node ) DALI_ASSERT_ALWAYS( NULL != node ); DALI_ASSERT_ALWAYS( NULL == node->GetParent() ); // Should have been disconnected + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] DestroyNode\n", node ); + Vector::Iterator iter = mImpl->nodes.Begin()+1; Vector::Iterator endIter = mImpl->nodes.End(); for(;iter!=endIter;++iter) @@ -458,10 +481,10 @@ void UpdateManager::AddCamera( OwnerPointer< Camera >& camera ) mImpl->cameras.PushBack( camera.Release() ); // takes ownership } -void UpdateManager::RemoveCamera( const Camera* camera ) +void UpdateManager::RemoveCamera( Camera* camera ) { // Find the camera and destroy it - EraseUsingDiscardQueue( mImpl->cameras, const_cast( camera ), mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); + EraseUsingDiscardQueue( mImpl->cameras, camera, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); } void UpdateManager::AddObject( OwnerPointer& object ) @@ -474,6 +497,26 @@ void UpdateManager::RemoveObject( PropertyOwner* object ) mImpl->customObjects.EraseObject( object ); } +void UpdateManager::AddRenderTaskList( OwnerPointer& taskList ) +{ + RenderTaskList* taskListPointer = taskList.Release(); + taskListPointer->SetRenderMessageDispatcher( &mImpl->renderMessageDispatcher ); + + mImpl->scenes.back()->taskList = taskListPointer; +} + +void UpdateManager::RemoveRenderTaskList( RenderTaskList* taskList ) +{ + for ( auto&& scene : mImpl->scenes ) + { + if ( scene && scene->taskList == taskList ) + { + scene->taskList.Reset(); + break; + } + } +} + void UpdateManager::AddAnimation( OwnerPointer< SceneGraph::Animation >& animation ) { mImpl->animations.PushBack( animation.Release() ); @@ -556,7 +599,7 @@ void UpdateManager::SetShaderProgram( Shader* shader, typedef MessageValue3< Shader, Internal::ShaderDataPtr, ProgramCache*, bool> DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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( shader, &Shader::SetProgram, shaderData, mImpl->renderManager.GetProgramCache(), modifiesGeometry ); @@ -581,6 +624,8 @@ void UpdateManager::SetShaderSaver( ShaderSaver& upstream ) void UpdateManager::AddRenderer( OwnerPointer< Renderer >& renderer ) { + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] AddRenderer\n", renderer.Get() ); + renderer->ConnectToSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() ); mImpl->renderers.PushBack( renderer.Release() ); mImpl->renderersAdded = true; @@ -588,6 +633,10 @@ void UpdateManager::AddRenderer( OwnerPointer< Renderer >& renderer ) void UpdateManager::RemoveRenderer( Renderer* renderer ) { + DALI_LOG_INFO( gLogFilter, Debug::General, "[%x] RemoveRenderer\n", renderer ); + + renderer->SetDirty( true ); + // Find the renderer and destroy it EraseUsingDiscardQueue( mImpl->renderers, renderer, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); // Need to remove the render object as well @@ -611,21 +660,7 @@ void UpdateManager::RemoveTextureSet( TextureSet* textureSet ) mImpl->textureSets.EraseObject( textureSet ); } -RenderTaskList* UpdateManager::GetRenderTaskList( bool systemLevel ) -{ - if ( !systemLevel ) - { - // copy the list, this is only likely to happen once in application life cycle - return &(mImpl->taskList); - } - else - { - // copy the list, this is only likely to happen once in application life cycle - return &(mImpl->systemLevelTaskList); - } -} - -unsigned int* UpdateManager::ReserveMessageSlot( std::size_t size, bool updateScene ) +uint32_t* UpdateManager::ReserveMessageSlot( uint32_t size, bool updateScene ) { return mImpl->messageQueue.ReserveMessageSlot( size, updateScene ); } @@ -671,7 +706,7 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) } } -bool UpdateManager::ProcessGestures( BufferIndex bufferIndex, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ) +bool UpdateManager::ProcessGestures( BufferIndex bufferIndex, uint32_t lastVSyncTimeMilliseconds, uint32_t nextVSyncTimeMilliseconds ) { bool gestureUpdated( false ); @@ -687,11 +722,10 @@ bool UpdateManager::ProcessGestures( BufferIndex bufferIndex, unsigned int lastV void UpdateManager::Animate( BufferIndex bufferIndex, float elapsedSeconds ) { - AnimationContainer &animations = mImpl->animations; - AnimationIter iter = animations.Begin(); + auto&& iter = mImpl->animations.Begin(); bool animationLooped = false; - while ( iter != animations.End() ) + while ( iter != mImpl->animations.End() ) { Animation* animation = *iter; bool finished = false; @@ -710,7 +744,7 @@ void UpdateManager::Animate( BufferIndex bufferIndex, float elapsedSeconds ) // Remove animations that had been destroyed but were still waiting for an update if (animation->GetState() == Animation::Destroyed) { - iter = animations.Erase(iter); + iter = mImpl->animations.Erase(iter); } else { @@ -737,18 +771,17 @@ void UpdateManager::ConstrainCustomObjects( BufferIndex bufferIndex ) void UpdateManager::ConstrainRenderTasks( BufferIndex bufferIndex ) { - // Constrain system-level render-tasks - const RenderTaskList::RenderTaskContainer& systemLevelTasks = mImpl->systemLevelTaskList.GetTasks(); - for ( auto&& task : systemLevelTasks ) - { - ConstrainPropertyOwner( *task, bufferIndex ); - } - // Constrain render-tasks - const RenderTaskList::RenderTaskContainer& tasks = mImpl->taskList.GetTasks(); - for ( auto&& task : tasks ) + for ( auto&& scene : mImpl->scenes ) { - ConstrainPropertyOwner( *task, bufferIndex ); + if ( scene && scene->taskList ) + { + RenderTaskList::RenderTaskContainer& tasks = scene->taskList->GetTasks(); + for ( auto&& task : tasks ) + { + ConstrainPropertyOwner( *task, bufferIndex ); + } + } } } @@ -800,44 +833,37 @@ void UpdateManager::ForwardCompiledShadersToEventThread() void UpdateManager::UpdateRenderers( BufferIndex bufferIndex ) { - const unsigned int rendererCount = mImpl->renderers.Count(); - for( unsigned int i = 0; i < rendererCount; ++i ) + for( auto&& renderer : mImpl->renderers ) { //Apply constraints - ConstrainPropertyOwner( *mImpl->renderers[i], bufferIndex ); + ConstrainPropertyOwner( *renderer, bufferIndex ); - mImpl->renderers[i]->PrepareRender( bufferIndex ); + renderer->PrepareRender( bufferIndex ); } } void UpdateManager::UpdateNodes( BufferIndex bufferIndex ) { - mImpl->nodeDirtyFlags = NothingFlag; + mImpl->nodeDirtyFlags = NodePropertyFlags::NOTHING; - if ( !mImpl->root ) + for ( auto&& scene : mImpl->scenes ) { - return; - } - - // Prepare resources, update shaders, for each node - // And add the renderers to the sorted layers. Start from root, which is also a layer - mImpl->nodeDirtyFlags = UpdateNodeTree( *( mImpl->root ), - bufferIndex, - mImpl->renderQueue ); - - if ( mImpl->systemLevelRoot ) - { - mImpl->nodeDirtyFlags |= UpdateNodeTree( *( mImpl->systemLevelRoot ), - bufferIndex, - mImpl->renderQueue ); + if ( scene && scene->root ) + { + // Prepare resources, update shaders, for each node + // And add the renderers to the sorted layers. Start from root, which is also a layer + mImpl->nodeDirtyFlags |= UpdateNodeTree( *scene->root, + bufferIndex, + mImpl->renderQueue ); + } } } -unsigned int UpdateManager::Update( float elapsedSeconds, - unsigned int lastVSyncTimeMilliseconds, - unsigned int nextVSyncTimeMilliseconds, - bool renderToFboEnabled, - bool isRenderingToFbo ) +uint32_t UpdateManager::Update( float elapsedSeconds, + uint32_t lastVSyncTimeMilliseconds, + uint32_t nextVSyncTimeMilliseconds, + bool renderToFboEnabled, + bool isRenderingToFbo ) { const BufferIndex bufferIndex = mSceneGraphBuffers.GetUpdateBufferIndex(); @@ -853,6 +879,7 @@ unsigned int UpdateManager::Update( float elapsedSeconds, mImpl->messageQueue.IsSceneUpdateRequired() || // ..a message that modifies the scene graph node tree is queued OR gestureUpdated; // ..a gesture property was updated + bool keepRendererRendering = false; // Although the scene-graph may not require an update, we still need to synchronize double-buffered // values if the scene was updated in the previous frame. @@ -883,14 +910,24 @@ unsigned int UpdateManager::Update( float elapsedSeconds, ConstrainCustomObjects( bufferIndex ); //Clear the lists of renderers from the previous update - for( size_t i(0); isortedLayers.size(); ++i ) + for( auto&& scene : mImpl->scenes ) { - mImpl->sortedLayers[i]->ClearRenderables(); + if ( scene ) + { + for( auto&& layer : scene->sortedLayerList ) + { + if ( layer ) + { + layer->ClearRenderables(); + } + } + } } - for( size_t i(0); isystemLevelSortedLayers.size(); ++i ) + // Call the frame-callback-processor if set + if( mImpl->frameCallbackProcessor ) { - mImpl->systemLevelSortedLayers[i]->ClearRenderables(); + mImpl->frameCallbackProcessor->Update( bufferIndex, elapsedSeconds ); } //Update node hierarchy, apply constraints and perform sorting / culling. @@ -904,12 +941,6 @@ unsigned int UpdateManager::Update( float elapsedSeconds, //Update renderers and apply constraints UpdateRenderers( bufferIndex ); - // Call the frame-callback-processor if set - if( mImpl->frameCallbackProcessor ) - { - mImpl->frameCallbackProcessor->Update( bufferIndex, elapsedSeconds ); - } - //Update the transformations of all the nodes mImpl->transformManager.Update(); @@ -926,57 +957,70 @@ unsigned int UpdateManager::Update( float elapsedSeconds, //reset the update buffer index and make sure there is enough room in the instruction container if( mImpl->renderersAdded ) { + // Calculate how many render tasks we have in total + std::size_t numberOfRenderTasks = 0; + for (auto&& scene : mImpl->scenes ) + { + if ( scene && scene->taskList ) + { + numberOfRenderTasks += scene->taskList->GetTasks().Count(); + } + } + mImpl->renderInstructions.ResetAndReserve( bufferIndex, - mImpl->taskList.GetTasks().Count() + mImpl->systemLevelTaskList.GetTasks().Count() ); + static_cast( numberOfRenderTasks ) ); - if ( NULL != mImpl->root ) + for ( auto&& scene : mImpl->scenes ) { - mImpl->renderTaskProcessor.Process( bufferIndex, - mImpl->taskList, - *mImpl->root, - mImpl->sortedLayers, - mImpl->renderInstructions, - renderToFboEnabled, - isRenderingToFbo ); - - // Process the system-level RenderTasks last - if ( NULL != mImpl->systemLevelRoot ) + if ( scene && scene->root && scene->taskList ) { - mImpl->renderTaskProcessor.Process( bufferIndex, - mImpl->systemLevelTaskList, - *mImpl->systemLevelRoot, - mImpl->systemLevelSortedLayers, + keepRendererRendering |= mImpl->renderTaskProcessor.Process( bufferIndex, + *scene->taskList, + *scene->root, + scene->sortedLayerList, mImpl->renderInstructions, renderToFboEnabled, isRenderingToFbo ); } } + + DALI_LOG_INFO( gLogFilter, Debug::General, + "Update: numberOfRenderTasks(%d), Render Instructions(%d)\n", + numberOfRenderTasks, mImpl->renderInstructions.Count( bufferIndex ) ); } } - // check the countdown and notify (note, at the moment this is only done for normal tasks, not for systemlevel tasks) - bool doRenderOnceNotify = false; - mImpl->renderTaskWaiting = false; - for ( auto&& renderTask : mImpl->taskList.GetTasks() ) + for ( auto&& scene : mImpl->scenes ) { - renderTask->UpdateState(); - - if( renderTask->IsWaitingToRender() && - renderTask->ReadyToRender( bufferIndex ) /*avoid updating forever when source actor is off-stage*/ ) + if ( scene && scene->root && scene->taskList ) { - mImpl->renderTaskWaiting = true; // keep update/render threads alive - } + RenderTaskList::RenderTaskContainer& tasks = scene->taskList->GetTasks(); - if( renderTask->HasRendered() ) - { - doRenderOnceNotify = true; - } - } + // check the countdown and notify + bool doRenderOnceNotify = false; + mImpl->renderTaskWaiting = false; + for ( auto&& renderTask : tasks ) + { + renderTask->UpdateState(); - if( doRenderOnceNotify ) - { - DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); - mImpl->notificationManager.QueueCompleteNotification( mImpl->taskList.GetCompleteNotificationInterface() ); + 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( doRenderOnceNotify ) + { + DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); + mImpl->notificationManager.QueueCompleteNotification( scene->taskList->GetCompleteNotificationInterface() ); + } + } } // Macro is undefined in release build. @@ -986,7 +1030,12 @@ unsigned int UpdateManager::Update( float elapsedSeconds, mImpl->previousUpdateScene = updateScene; // Check whether further updates are required - unsigned int keepUpdating = KeepUpdatingCheck( elapsedSeconds ); + uint32_t keepUpdating = KeepUpdatingCheck( elapsedSeconds ); + + if( keepRendererRendering ) + { + keepUpdating |= KeepUpdating::STAGE_KEEP_RENDERING; + } // tell the update manager that we're done so the queue can be given to event thread mImpl->notificationManager.UpdateCompleted(); @@ -997,7 +1046,7 @@ unsigned int UpdateManager::Update( float elapsedSeconds, return keepUpdating; } -unsigned int UpdateManager::KeepUpdatingCheck( float elapsedSeconds ) const +uint32_t UpdateManager::KeepUpdatingCheck( float elapsedSeconds ) const { // Update the duration set via Stage::KeepRendering() if ( mImpl->keepRenderingSeconds > 0.0f ) @@ -1005,7 +1054,7 @@ unsigned int UpdateManager::KeepUpdatingCheck( float elapsedSeconds ) const mImpl->keepRenderingSeconds -= elapsedSeconds; } - unsigned int keepUpdatingRequest = KeepUpdating::NOT_REQUESTED; + uint32_t keepUpdatingRequest = KeepUpdating::NOT_REQUESTED; // If the rendering behavior is set to continuously render, then continue to render. // If Stage::KeepRendering() has been called, then continue until the duration has elapsed. @@ -1039,25 +1088,36 @@ void UpdateManager::SetBackgroundColor( const Vector4& color ) typedef MessageValue1< RenderManager, Vector4 > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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 ); } -void UpdateManager::SetDefaultSurfaceRect( const Rect& rect ) +void UpdateManager::SetDefaultSurfaceRect( const Rect& rect ) { mImpl->surfaceRectChanged = true; - typedef MessageValue1< RenderManager, Rect > DerivedType; + typedef MessageValue1< RenderManager, Rect > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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 ); } +void UpdateManager::SetDefaultSurfaceOrientation( int orientation ) +{ + typedef MessageValue1< RenderManager, int > DerivedType; + + // Reserve some memory inside the render queue + unsigned int* 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::SetDefaultSurfaceOrientation, orientation ); +} + void UpdateManager::KeepRendering( float durationSeconds ) { mImpl->keepRenderingSeconds = std::max( mImpl->keepRenderingSeconds, durationSeconds ); @@ -1068,16 +1128,15 @@ void UpdateManager::SetRenderingBehavior( DevelStage::Rendering renderingBehavio mImpl->renderingBehavior = renderingBehavior; } -void UpdateManager::SetLayerDepths( const SortedLayerPointers& layers, bool systemLevel ) +void UpdateManager::SetLayerDepths( const SortedLayerPointers& layers, const Layer* rootLayer ) { - if ( !systemLevel ) + for ( auto&& scene : mImpl->scenes ) { - // just copy the vector of pointers - mImpl->sortedLayers = layers; - } - else - { - mImpl->systemLevelSortedLayers = layers; + if ( scene && scene->root == rootLayer ) + { + scene->sortedLayerList = layers; + break; + } } } @@ -1090,8 +1149,14 @@ void UpdateManager::SetDepthIndices( OwnerPointer< NodeDepths >& nodeDepths ) iter.node->SetDepthIndex( iter.sortedDepth ); } - // Go through node hierarchy and rearrange siblings according to depth-index - SortSiblingNodesRecursively( *( mImpl->root ) ); + for ( auto&& scene : mImpl->scenes ) + { + if ( scene ) + { + // Go through node hierarchy and rearrange siblings according to depth-index + SortSiblingNodesRecursively( *scene->root ); + } + } } bool UpdateManager::IsDefaultSurfaceRectChanged() @@ -1104,14 +1169,14 @@ bool UpdateManager::IsDefaultSurfaceRectChanged() return surfaceRectChanged; } -void UpdateManager::AddFrameCallback( FrameCallbackInterface* frameCallback, const Node* rootNode ) +void UpdateManager::AddFrameCallback( OwnerPointer< FrameCallback >& frameCallback, const Node* rootNode ) { - mImpl->GetFrameCallbackProcessor().AddFrameCallback( frameCallback, rootNode ); + mImpl->GetFrameCallbackProcessor( *this ).AddFrameCallback( frameCallback, rootNode ); } void UpdateManager::RemoveFrameCallback( FrameCallbackInterface* frameCallback ) { - mImpl->GetFrameCallbackProcessor().RemoveFrameCallback( frameCallback ); + mImpl->GetFrameCallbackProcessor( *this ).RemoveFrameCallback( frameCallback ); } void UpdateManager::AddSampler( OwnerPointer< Render::Sampler >& sampler ) @@ -1120,7 +1185,7 @@ void UpdateManager::AddSampler( OwnerPointer< Render::Sampler >& sampler ) typedef MessageValue1< RenderManager, OwnerPointer< Render::Sampler > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AddSampler, sampler ); @@ -1131,29 +1196,29 @@ void UpdateManager::RemoveSampler( Render::Sampler* sampler ) typedef MessageValue1< RenderManager, Render::Sampler* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemoveSampler, sampler ); } -void UpdateManager::SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode ) +void UpdateManager::SetFilterMode( Render::Sampler* sampler, uint32_t minFilterMode, uint32_t magFilterMode ) { - typedef MessageValue3< RenderManager, Render::Sampler*, unsigned int, unsigned int > DerivedType; + typedef MessageValue3< RenderManager, Render::Sampler*, uint32_t, uint32_t > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::SetFilterMode, sampler, minFilterMode, magFilterMode ); } -void UpdateManager::SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode ) +void UpdateManager::SetWrapMode( Render::Sampler* sampler, uint32_t rWrapMode, uint32_t sWrapMode, uint32_t tWrapMode ) { - typedef MessageValue4< RenderManager, Render::Sampler*, unsigned int, unsigned int, unsigned int > DerivedType; + typedef MessageValue4< RenderManager, Render::Sampler*, uint32_t, uint32_t, uint32_t > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::SetWrapMode, sampler, rWrapMode, sWrapMode, tWrapMode ); @@ -1165,7 +1230,7 @@ void UpdateManager::AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& p typedef MessageValue1< RenderManager, OwnerPointer< Render::PropertyBuffer > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AddPropertyBuffer, propertyBuffer ); @@ -1176,7 +1241,7 @@ void UpdateManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemovePropertyBuffer, propertyBuffer ); @@ -1188,19 +1253,19 @@ void UpdateManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuf typedef MessageValue2< RenderManager, Render::PropertyBuffer*, OwnerPointer< Render::PropertyBuffer::Format > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::SetPropertyBufferFormat, propertyBuffer, format ); } -void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector >& data, size_t size ) +void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector >& data, uint32_t size ) { // Message has ownership of format while in transit from update -> render - typedef MessageValue3< RenderManager, Render::PropertyBuffer*, OwnerPointer< Dali::Vector >, size_t > DerivedType; + typedef MessageValue3< RenderManager, Render::PropertyBuffer*, OwnerPointer< Dali::Vector >, uint32_t > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::SetPropertyBufferData, propertyBuffer, data, size ); @@ -1212,7 +1277,7 @@ void UpdateManager::AddGeometry( OwnerPointer< Render::Geometry >& geometry ) typedef MessageValue1< RenderManager, OwnerPointer< Render::Geometry > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AddGeometry, geometry ); @@ -1223,29 +1288,29 @@ void UpdateManager::RemoveGeometry( Render::Geometry* geometry ) typedef MessageValue1< RenderManager, Render::Geometry* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemoveGeometry, geometry ); } -void UpdateManager::SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ) +void UpdateManager::SetGeometryType( Render::Geometry* geometry, uint32_t geometryType ) { - typedef MessageValue2< RenderManager, Render::Geometry*, unsigned int > DerivedType; + typedef MessageValue2< RenderManager, Render::Geometry*, uint32_t > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::SetGeometryType, geometry, geometryType ); } -void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ) +void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ) { typedef IndexBufferMessage< RenderManager > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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, geometry, indices ); @@ -1256,7 +1321,7 @@ void UpdateManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::Prop typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemoveVertexBuffer, geometry, propertyBuffer ); @@ -1267,7 +1332,7 @@ void UpdateManager::AttachVertexBuffer( Render::Geometry* geometry, Render::Prop typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AttachVertexBuffer, geometry, propertyBuffer ); @@ -1279,7 +1344,7 @@ void UpdateManager::AddTexture( OwnerPointer< Render::Texture >& texture ) typedef MessageValue1< RenderManager, OwnerPointer< Render::Texture > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AddTexture, texture ); @@ -1290,7 +1355,7 @@ void UpdateManager::RemoveTexture( Render::Texture* texture) typedef MessageValue1< RenderManager, Render::Texture* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemoveTexture, texture ); @@ -1301,7 +1366,7 @@ void UpdateManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelD typedef MessageValue3< RenderManager, Render::Texture*, PixelDataPtr, Texture::UploadParams > DerivedType; // Reserve some memory inside the message queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) DerivedType( &mImpl->renderManager, &RenderManager::UploadTexture, texture, pixelData, params ); @@ -1312,18 +1377,18 @@ void UpdateManager::GenerateMipmaps( Render::Texture* texture ) typedef MessageValue1< RenderManager, Render::Texture* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::GenerateMipmaps, texture ); } -void UpdateManager::AddFrameBuffer( Render::FrameBuffer* frameBuffer ) +void UpdateManager::AddFrameBuffer( OwnerPointer< Render::FrameBuffer >& frameBuffer ) { - typedef MessageValue1< RenderManager, Render::FrameBuffer* > DerivedType; + typedef MessageValue1< RenderManager, OwnerPointer< Render::FrameBuffer > > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AddFrameBuffer, frameBuffer ); @@ -1334,18 +1399,18 @@ void UpdateManager::RemoveFrameBuffer( Render::FrameBuffer* frameBuffer) typedef MessageValue1< RenderManager, Render::FrameBuffer* > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::RemoveFrameBuffer, frameBuffer ); } -void UpdateManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, unsigned int mipmapLevel, unsigned int layer ) +void UpdateManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel, uint32_t layer ) { - typedef MessageValue4< RenderManager, Render::FrameBuffer*, Render::Texture*, unsigned int, unsigned int > DerivedType; + typedef MessageValue4< RenderManager, Render::FrameBuffer*, Render::Texture*, uint32_t, uint32_t > DerivedType; // Reserve some memory inside the render queue - unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); + 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::AttachColorTextureToFrameBuffer, frameBuffer, texture, mipmapLevel, layer );