X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.cpp;h=c6d67eae09b59f3e002b1f125af98c1745c83ceb;hb=cd1f8c935c88054e546c76834f077ba6677facb5;hp=7ac0d63cf67797b5e81f1d82eaee393400b91e0e;hpb=33b53cef3dbb23a5973065b3f0836adfc00a6ba8;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 7ac0d63..c6d67ea --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -20,7 +20,6 @@ // INTERNAL INCLUDES #include -#include #include #include @@ -41,12 +40,10 @@ #include #include #include -#include #include #include #include -#include -#include +#include #include #include #include @@ -56,17 +53,12 @@ #include #include #include -#include -#include -#include +#include #include #include #include -#include #include -#include -#include // Un-comment to enable node tree debug logging //#define NODE_TREE_LOGGING 1 @@ -104,19 +96,64 @@ namespace Internal namespace SceneGraph { -typedef OwnerContainer< Shader* > ShaderContainer; -typedef ShaderContainer::Iterator ShaderIter; -typedef ShaderContainer::ConstIterator ShaderConstIter; +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 + typename OwnerContainer::Iterator iter = container.Begin(); + const typename OwnerContainer::ConstIterator endIter = container.End(); + for ( ; iter != endIter; ++iter ) + { + (*iter)->ResetToBaseValues( updateBufferIndex ); + } +} + +/** + * Helper to Erase an object from OwnerContainer using discard queue + * @param container to remove from + * @param object to remove + * @param discardQueue to put the object to + * @param updateBufferIndex to use + */ +template < class T > +inline void EraseUsingDiscardQueue( OwnerContainer& container, T* object, DiscardQueue& discardQueue, BufferIndex updateBufferIndex ) +{ + DALI_ASSERT_DEBUG( object && "NULL object not allowed" ); + typename OwnerContainer::Iterator iter = container.Begin(); + const typename OwnerContainer::ConstIterator endIter = container.End(); + for ( ; iter != endIter; ++iter ) + { + if ( *iter == object ) + { + // Transfer ownership to the discard queue, this keeps the object alive, until the render-thread has finished with it + discardQueue.Add( updateBufferIndex, container.Release( iter ) ); + return; + } + } +} + +} + +typedef OwnerContainer< Shader* > ShaderOwner; +typedef ShaderOwner::Iterator ShaderIter; typedef std::vector ShaderDataBinaryQueue; -typedef OwnerContainer GestureContainer; -typedef GestureContainer::Iterator GestureIter; -typedef GestureContainer::ConstIterator GestureConstIter; +typedef OwnerContainer< TextureSet* > TextureSetOwner; +typedef TextureSetOwner::Iterator TextureSetIter; + +typedef OwnerContainer RendererOwner; +typedef RendererOwner::Iterator RendererIter; -typedef OwnerContainer< TextureSet* > TextureSetContainer; -typedef TextureSetContainer::Iterator TextureSetIter; -typedef TextureSetContainer::ConstIterator TextureSetConstIter; +typedef OwnerContainer< Camera* > CameraOwner; +typedef OwnerContainer< PropertyOwner* > CustomObjectOwner; /** * Structure to contain UpdateManager internal data @@ -126,47 +163,44 @@ struct UpdateManager::Impl Impl( NotificationManager& notificationManager, CompleteNotificationInterface& animationFinishedNotifier, PropertyNotifier& propertyNotifier, - ResourceManager& resourceManager, DiscardQueue& discardQueue, RenderController& renderController, RenderManager& renderManager, RenderQueue& renderQueue, - TouchResampler& touchResampler, - SceneGraphBuffers& sceneGraphBuffers ) + SceneGraphBuffers& sceneGraphBuffers, + RenderTaskProcessor& renderTaskProcessor ) : renderMessageDispatcher( renderManager, renderQueue, sceneGraphBuffers ), notificationManager( notificationManager ), transformManager(), animationFinishedNotifier( animationFinishedNotifier ), propertyNotifier( propertyNotifier ), shaderSaver( NULL ), - resourceManager( resourceManager ), discardQueue( discardQueue ), renderController( renderController ), sceneController( NULL ), renderManager( renderManager ), renderQueue( renderQueue ), renderInstructions( renderManager.GetRenderInstructionContainer() ), - touchResampler( touchResampler ), + renderTaskProcessor( renderTaskProcessor ), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), - taskList( renderMessageDispatcher, resourceManager ), - systemLevelTaskList( renderMessageDispatcher, resourceManager ), + taskList( renderMessageDispatcher ), + systemLevelTaskList( renderMessageDispatcher ), root( NULL ), systemLevelRoot( NULL ), - renderers( sceneGraphBuffers, discardQueue ), + renderers(), textureSets(), + shaders(), + panGestureProcessor( NULL ), messageQueue( renderController, sceneGraphBuffers ), keepRenderingSeconds( 0.0f ), - animationFinishedDuringUpdate( false ), nodeDirtyFlags( TransformFlag ), // set to TransformFlag to ensure full update the first time through Update() - previousUpdateScene( false ), frameCounter( 0 ), - renderSortingHelper(), + animationFinishedDuringUpdate( false ), + previousUpdateScene( false ), renderTaskWaiting( false ) { sceneController = new SceneControllerImpl( renderMessageDispatcher, renderQueue, discardQueue ); - renderers.SetSceneController( *sceneController ); - // create first 'dummy' node nodes.PushBack(0u); } @@ -192,7 +226,7 @@ struct UpdateManager::Impl for(;iter!=endIter;++iter) { (*iter)->OnDestroy(); - delete(*iter); + Node::Delete(*iter); } // If there is root, reset it, otherwise do nothing as rendering was never started @@ -200,7 +234,7 @@ struct UpdateManager::Impl { root->OnDestroy(); - delete root; + Node::Delete( root ); root = NULL; } @@ -208,7 +242,7 @@ struct UpdateManager::Impl { systemLevelRoot->OnDestroy(); - delete systemLevelRoot; + Node::Delete( systemLevelRoot ); systemLevelRoot = NULL; } @@ -222,14 +256,13 @@ struct UpdateManager::Impl CompleteNotificationInterface& animationFinishedNotifier; ///< Provides notification to applications when animations are finished. PropertyNotifier& propertyNotifier; ///< Provides notification to applications when properties are modified. ShaderSaver* shaderSaver; ///< Saves shader binaries. - ResourceManager& resourceManager; ///< resource manager DiscardQueue& discardQueue; ///< Nodes are added here when disconnected from the scene-graph. RenderController& renderController; ///< render controller 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 - TouchResampler& touchResampler; ///< Used to resample touch events on every update. + RenderTaskProcessor& renderTaskProcessor; ///< Handles RenderTasks and RenderInstrucitons Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame. @@ -244,16 +277,16 @@ struct UpdateManager::Impl 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) + CameraOwner cameras; ///< A container of cameras + CustomObjectOwner customObjects; ///< A container of owned objects (with custom properties) AnimationContainer animations; ///< A container of owned animations PropertyNotificationContainer propertyNotifications; ///< A container of owner property notifications. - ObjectOwnerContainer renderers; - TextureSetContainer textureSets; ///< A container of texture sets - - ShaderContainer shaders; ///< A container of owned shaders + RendererOwner renderers; ///< A container of owned renderers + TextureSetOwner textureSets; ///< A container of owned texture sets + ShaderOwner shaders; ///< A container of owned shaders + OwnerPointer panGestureProcessor; ///< Owned pan gesture processor; it lives for the lifecycle of UpdateManager MessageQueue messageQueue; ///< The messages queued from the event-thread ShaderDataBinaryQueue renderCompiledShaders; ///< Shaders compiled on Render thread are inserted here for update thread to pass on to event thread. @@ -261,42 +294,39 @@ struct UpdateManager::Impl Mutex compiledShaderMutex; ///< lock to ensure no corruption on the renderCompiledShaders float keepRenderingSeconds; ///< Set via Dali::Stage::KeepRendering - bool animationFinishedDuringUpdate; ///< Flag whether any animations finished during the Update() - int nodeDirtyFlags; ///< cumulative node dirty flags from previous frame - bool previousUpdateScene; ///< True if the scene was updated in the previous frame (otherwise it was optimized out) - int frameCounter; ///< Frame counter used in debugging to choose which frame to debug and which to ignore. - RendererSortingHelper renderSortingHelper; ///< helper used to sort transparent renderers - GestureContainer gestures; ///< A container of owned gesture detectors + bool animationFinishedDuringUpdate; ///< Flag whether any animations finished during the Update() + bool previousUpdateScene; ///< True if the scene was updated in the previous frame (otherwise it was optimized out) bool renderTaskWaiting; ///< A REFRESH_ONCE render task is waiting to be rendered + +private: + + Impl( const Impl& ); ///< Undefined + Impl& operator=( const Impl& ); ///< Undefined }; UpdateManager::UpdateManager( NotificationManager& notificationManager, CompleteNotificationInterface& animationFinishedNotifier, PropertyNotifier& propertyNotifier, - ResourceManager& resourceManager, DiscardQueue& discardQueue, RenderController& controller, RenderManager& renderManager, RenderQueue& renderQueue, - TextureCacheDispatcher& textureCacheDispatcher, - TouchResampler& touchResampler ) + RenderTaskProcessor& renderTaskProcessor ) : mImpl(NULL) { mImpl = new Impl( notificationManager, animationFinishedNotifier, propertyNotifier, - resourceManager, discardQueue, controller, renderManager, renderQueue, - touchResampler, - mSceneGraphBuffers ); + mSceneGraphBuffers, + renderTaskProcessor ); - textureCacheDispatcher.SetBufferIndices( &mSceneGraphBuffers ); } UpdateManager::~UpdateManager() @@ -313,13 +343,13 @@ void UpdateManager::InstallRoot( SceneGraph::Layer* layer, bool systemLevel ) { DALI_ASSERT_DEBUG( mImpl->root == NULL && "Root Node already installed" ); mImpl->root = layer; - mImpl->root->CreateTransform( &mImpl->transformManager); + mImpl->root->CreateTransform( &mImpl->transformManager ); } else { DALI_ASSERT_DEBUG( mImpl->systemLevelRoot == NULL && "System-level Root Node already installed" ); mImpl->systemLevelRoot = layer; - mImpl->systemLevelRoot->CreateTransform( &mImpl->transformManager); + mImpl->systemLevelRoot->CreateTransform( &mImpl->transformManager ); } layer->SetRoot(true); @@ -337,7 +367,7 @@ void UpdateManager::AddNode( Node* node ) if(node > (*iter)) { mImpl->nodes.Insert((iter+1), node); - node->CreateTransform( &mImpl->transformManager); + node->CreateTransform( &mImpl->transformManager ); break; } } @@ -392,21 +422,8 @@ void UpdateManager::AddCamera( Camera* camera ) void UpdateManager::RemoveCamera( const Camera* camera ) { - // Find the camera - OwnerContainer::Iterator iter = mImpl->cameras.Begin(); - OwnerContainer::ConstIterator end = mImpl->cameras.End(); - for ( ; iter != end; ++iter ) - { - Camera* value = *iter; - if ( camera == value ) - { - // Transfer ownership to the discard queue - mImpl->discardQueue.Add( mSceneGraphBuffers.GetUpdateBufferIndex(), mImpl->cameras.Release( iter ) ); - - return; - } - } - + // Find the camera and destroy it + EraseUsingDiscardQueue( mImpl->cameras, const_cast( camera ), mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); } void UpdateManager::AddObject( PropertyOwner* object ) @@ -418,23 +435,7 @@ void UpdateManager::AddObject( PropertyOwner* object ) void UpdateManager::RemoveObject( PropertyOwner* object ) { - DALI_ASSERT_DEBUG( NULL != object ); - - OwnerContainer< PropertyOwner* >& customObjects = mImpl->customObjects; - - // Find the object and destroy it - for ( OwnerContainer< PropertyOwner* >::Iterator iter = customObjects.Begin(); iter != customObjects.End(); ++iter ) - { - PropertyOwner* current = *iter; - if ( current == object ) - { - customObjects.Erase( iter ); - return; - } - } - - // Should not reach here - DALI_ASSERT_DEBUG(false); + mImpl->customObjects.EraseObject( object ); } void UpdateManager::AddAnimation( Animation* animation ) @@ -489,18 +490,7 @@ void UpdateManager::AddPropertyNotification( PropertyNotification* propertyNotif void UpdateManager::RemovePropertyNotification( PropertyNotification* propertyNotification ) { - PropertyNotificationContainer &propertyNotifications = mImpl->propertyNotifications; - PropertyNotificationIter iter = propertyNotifications.Begin(); - - while ( iter != propertyNotifications.End() ) - { - if( *iter == propertyNotification ) - { - propertyNotifications.Erase(iter); - break; - } - ++iter; - } + mImpl->propertyNotifications.EraseObject( propertyNotification ); } void UpdateManager::PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode ) @@ -509,52 +499,17 @@ void UpdateManager::PropertyNotificationSetNotify( PropertyNotification* propert propertyNotification->SetNotifyMode( notifyMode ); } -ObjectOwnerContainer& UpdateManager::GetRendererOwner() -{ - return mImpl->renderers; -} - void UpdateManager::AddShader( Shader* shader ) { DALI_ASSERT_DEBUG( NULL != shader ); - if( mImpl->shaders.Count() == 0 ) - { - // the first added shader becomes our default shader - // Construct message in the render queue memory; note that delete should not be called on the return value - typedef MessageValue1< RenderManager, Shader* > 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::SetDefaultShader, shader ); - } - mImpl->shaders.PushBack( shader ); } void UpdateManager::RemoveShader( Shader* shader ) { - DALI_ASSERT_DEBUG(shader != NULL); - - ShaderContainer& shaders = mImpl->shaders; - // Find the shader and destroy it - for ( ShaderIter iter = shaders.Begin(); iter != shaders.End(); ++iter ) - { - Shader& current = **iter; - if ( ¤t == shader ) - { - // Transfer ownership to the discard queue - // This keeps the shader alive, until the render-thread has finished with it - mImpl->discardQueue.Add( mSceneGraphBuffers.GetUpdateBufferIndex(), shaders.Release( iter ) ); - - return; - } - } - // Should not reach here - DALI_ASSERT_DEBUG(false); + EraseUsingDiscardQueue( mImpl->shaders, shader, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); } void UpdateManager::SetShaderProgram( Shader* shader, @@ -584,64 +539,58 @@ void UpdateManager::SaveBinary( Internal::ShaderDataPtr shaderData ) } } -RenderTaskList* UpdateManager::GetRenderTaskList( bool systemLevel ) +void UpdateManager::SetShaderSaver( ShaderSaver& upstream ) { - 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); - } + mImpl->shaderSaver = &upstream; } -void UpdateManager::AddGesture( PanGesture* gesture ) +void UpdateManager::AddRenderer( Renderer* renderer ) { - DALI_ASSERT_DEBUG( NULL != gesture ); + DALI_ASSERT_DEBUG( renderer != NULL ); + + mImpl->renderers.PushBack( renderer ); - mImpl->gestures.PushBack( gesture ); + renderer->ConnectToSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() ); } -void UpdateManager::RemoveGesture( PanGesture* gesture ) +void UpdateManager::RemoveRenderer( Renderer* renderer ) { - DALI_ASSERT_DEBUG( gesture != NULL ); + // Find the renderer and destroy it + EraseUsingDiscardQueue( mImpl->renderers, renderer, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); + // Need to remove the render object as well + renderer->DisconnectFromSceneGraph( *mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex() ); +} - GestureContainer& gestures = mImpl->gestures; +void UpdateManager::SetPanGestureProcessor( PanGesture* panGestureProcessor ) +{ + DALI_ASSERT_DEBUG( NULL != panGestureProcessor ); - // Find the gesture and destroy it - for ( GestureIter iter = gestures.Begin(), endIter = gestures.End(); iter != endIter; ++iter ) - { - PanGesture& current = **iter; - if ( ¤t == gesture ) - { - mImpl->gestures.Erase( iter ); - return; - } - } - // Should not reach here - DALI_ASSERT_DEBUG(false); + mImpl->panGestureProcessor = panGestureProcessor; } void UpdateManager::AddTextureSet( TextureSet* textureSet ) { DALI_ASSERT_DEBUG( NULL != textureSet ); + mImpl->textureSets.PushBack( textureSet ); } void UpdateManager::RemoveTextureSet( TextureSet* textureSet ) { - DALI_ASSERT_DEBUG(textureSet != NULL); - size_t textureSetCount( mImpl->textureSets.Size() ); - for( size_t i(0); itextureSets.EraseObject( textureSet ); +} + +RenderTaskList* UpdateManager::GetRenderTaskList( bool systemLevel ) +{ + if ( !systemLevel ) { - if( textureSet == mImpl->textureSets[i] ) - { - mImpl->textureSets.Remove( mImpl->textureSets.Begin() + i ); - return; - } + // 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); } } @@ -680,54 +629,36 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex ) // Reset all the nodes Vector::Iterator iter = mImpl->nodes.Begin()+1; Vector::Iterator endIter = mImpl->nodes.End(); - for(;iter != endIter; ++iter) + for( ;iter != endIter; ++iter ) { (*iter)->ResetToBaseValues( bufferIndex ); } // Reset system-level render-task list properties to base values - const RenderTaskList::RenderTaskContainer& systemLevelTasks = mImpl->systemLevelTaskList.GetTasks(); - - for (RenderTaskList::RenderTaskContainer::ConstIterator iter = systemLevelTasks.Begin(); iter != systemLevelTasks.End(); ++iter) - { - (*iter)->ResetToBaseValues( bufferIndex ); - } + ResetToBaseValues( mImpl->systemLevelTaskList.GetTasks(), bufferIndex ); // Reset render-task list properties to base values. - const RenderTaskList::RenderTaskContainer& tasks = mImpl->taskList.GetTasks(); - - for (RenderTaskList::RenderTaskContainer::ConstIterator iter = tasks.Begin(); iter != tasks.End(); ++iter) - { - (*iter)->ResetToBaseValues( bufferIndex ); - } + ResetToBaseValues( mImpl->taskList.GetTasks(), bufferIndex ); // Reset custom object properties to base values - for (OwnerContainer::Iterator iter = mImpl->customObjects.Begin(); iter != mImpl->customObjects.End(); ++iter) - { - (*iter)->ResetToBaseValues( bufferIndex ); - } + ResetToBaseValues( mImpl->customObjects, bufferIndex ); - mImpl->renderers.ResetToBaseValues( bufferIndex ); + // Reset animatable renderer properties to base values + ResetToBaseValues( mImpl->renderers, bufferIndex ); // Reset animatable shader properties to base values - for (ShaderIter iter = mImpl->shaders.Begin(); iter != mImpl->shaders.End(); ++iter) - { - (*iter)->ResetToBaseValues( bufferIndex ); - } + ResetToBaseValues( mImpl->shaders, bufferIndex ); } bool UpdateManager::ProcessGestures( BufferIndex bufferIndex, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ) { bool gestureUpdated( false ); - // constrain gestures... (in construction order) - GestureContainer& gestures = mImpl->gestures; - - for ( GestureIter iter = gestures.Begin(), endIter = gestures.End(); iter != endIter; ++iter ) + if( mImpl->panGestureProcessor ) { - PanGesture& gesture = **iter; - gesture.ResetToBaseValues( bufferIndex ); // Needs to be done every time as gesture data is written directly to an update-buffer rather than via a message - gestureUpdated |= gesture.UpdateProperties( lastVSyncTimeMilliseconds, nextVSyncTimeMilliseconds ); + // gesture processor only supports default properties + mImpl->panGestureProcessor->ResetDefaultProperties( bufferIndex ); // Needs to be done every time as gesture data is written directly to an update-buffer rather than via a message + gestureUpdated |= mImpl->panGestureProcessor->UpdateProperties( lastVSyncTimeMilliseconds, nextVSyncTimeMilliseconds ); } return gestureUpdated; @@ -801,7 +732,7 @@ void UpdateManager::ConstrainRenderTasks( BufferIndex bufferIndex ) void UpdateManager::ConstrainShaders( BufferIndex bufferIndex ) { // constrain shaders... (in construction order) - ShaderContainer& shaders = mImpl->shaders; + ShaderOwner& shaders = mImpl->shaders; for ( ShaderIter iter = shaders.Begin(); iter != shaders.End(); ++iter ) { Shader& shader = **iter; @@ -826,16 +757,6 @@ void UpdateManager::ProcessPropertyNotifications( BufferIndex bufferIndex ) } } -void UpdateManager::PrepareTextureSets( BufferIndex bufferIndex ) -{ - size_t textureSetCount( mImpl->textureSets.Size() ); - for( size_t i(0); itextureSets[i]->Prepare( mImpl->resourceManager ); - } -} - void UpdateManager::ForwardCompiledShadersToEventThread() { DALI_ASSERT_DEBUG( (mImpl->shaderSaver != 0) && "shaderSaver should be wired-up during startup." ); @@ -865,17 +786,13 @@ void UpdateManager::ForwardCompiledShadersToEventThread() void UpdateManager::UpdateRenderers( BufferIndex bufferIndex ) { - const OwnerContainer& rendererContainer( mImpl->renderers.GetObjectContainer() ); - unsigned int rendererCount( rendererContainer.Size() ); - for( unsigned int i(0); irenderers.Count(); + for( unsigned int i = 0; i < rendererCount; ++i ) { //Apply constraints - ConstrainPropertyOwner( *rendererContainer[i], bufferIndex ); + ConstrainPropertyOwner( *mImpl->renderers[i], bufferIndex ); - if( rendererContainer[i]->IsReferenced() ) - { - rendererContainer[i]->PrepareRender( bufferIndex ); - } + mImpl->renderers[i]->PrepareRender( bufferIndex ); } } @@ -892,14 +809,12 @@ void UpdateManager::UpdateNodes( BufferIndex bufferIndex ) // And add the renderers to the sorted layers. Start from root, which is also a layer mImpl->nodeDirtyFlags = UpdateNodeTree( *( mImpl->root ), bufferIndex, - mImpl->resourceManager, mImpl->renderQueue ); if ( mImpl->systemLevelRoot ) { mImpl->nodeDirtyFlags |= UpdateNodeTree( *( mImpl->systemLevelRoot ), bufferIndex, - mImpl->resourceManager, mImpl->renderQueue ); } } @@ -913,18 +828,13 @@ unsigned int UpdateManager::Update( float elapsedSeconds, //Clear nodes/resources which were previously discarded mImpl->discardQueue.Clear( bufferIndex ); - //Grab any loaded resources - bool resourceChanged = mImpl->resourceManager.UpdateCache( bufferIndex ); - //Process Touches & Gestures - mImpl->touchResampler.Update(); const bool gestureUpdated = ProcessGestures( bufferIndex, lastVSyncTimeMilliseconds, nextVSyncTimeMilliseconds ); - const bool updateScene = // The scene-graph requires an update if.. + bool updateScene = // The scene-graph requires an update if.. (mImpl->nodeDirtyFlags & RenderableUpdateFlags) || // ..nodes were dirty in previous frame OR IsAnimationRunning() || // ..at least one animation is running OR mImpl->messageQueue.IsSceneUpdateRequired() || // ..a message that modifies the scene graph node tree is queued OR - resourceChanged || // ..one or more resources were updated/changed OR gestureUpdated; // ..a gesture property was updated @@ -937,11 +847,10 @@ unsigned int UpdateManager::Update( float elapsedSeconds, mImpl->transformManager.ResetToBaseValue(); } - //Process the queued scene messages - mImpl->messageQueue.ProcessMessages( bufferIndex ); - - //Post Process Ids of resources updated by renderer - mImpl->resourceManager.PostProcessResources( bufferIndex ); + // Process the queued scene messages. Note, MessageQueue::FlushQueue may be called + // between calling IsSceneUpdateRequired() above and here, so updateScene should + // be set again + updateScene |= mImpl->messageQueue.ProcessMessages( bufferIndex ); //Forward compiled shader programs to event thread for saving ForwardCompiledShadersToEventThread(); @@ -957,9 +866,6 @@ unsigned int UpdateManager::Update( float elapsedSeconds, //Constraint custom objects ConstrainCustomObjects( bufferIndex ); - //Prepare texture sets and apply constraints to them - PrepareTextureSets( bufferIndex ); - //Clear the lists of renderers from the previous update for( size_t i(0); isortedLayers.size(); ++i ) { @@ -995,22 +901,20 @@ unsigned int UpdateManager::Update( float elapsedSeconds, if ( NULL != mImpl->root ) { - ProcessRenderTasks( bufferIndex, - mImpl->taskList, - *mImpl->root, - mImpl->sortedLayers, - mImpl->renderSortingHelper, - mImpl->renderInstructions ); + mImpl->renderTaskProcessor.Process( bufferIndex, + mImpl->taskList, + *mImpl->root, + mImpl->sortedLayers, + mImpl->renderInstructions ); // Process the system-level RenderTasks last if ( NULL != mImpl->systemLevelRoot ) { - ProcessRenderTasks( bufferIndex, - mImpl->systemLevelTaskList, - *mImpl->systemLevelRoot, - mImpl->systemLevelSortedLayers, - mImpl->renderSortingHelper, - mImpl->renderInstructions ); + mImpl->renderTaskProcessor.Process( bufferIndex, + mImpl->systemLevelTaskList, + *mImpl->systemLevelRoot, + mImpl->systemLevelSortedLayers, + mImpl->renderInstructions ); } } } @@ -1137,14 +1041,26 @@ void UpdateManager::SetLayerDepths( const SortedLayerPointers& layers, bool syst } } -void UpdateManager::SetShaderSaver( ShaderSaver& upstream ) +void UpdateManager::SetDepthIndices( NodeDepths* nodeDepths ) { - mImpl->shaderSaver = &upstream; + if( nodeDepths ) + { + // note,this vector is already in depth order. It could be used as-is to + // remove sorting in update algorithm. However, it lacks layer boundary markers. + for( std::vector::iterator iter = nodeDepths->nodeDepths.begin(), + end = nodeDepths->nodeDepths.end() ; + iter != end ; ++iter ) + { + iter->node->SetDepthIndex( iter->sortedDepth ); + } + delete nodeDepths; + } } void UpdateManager::AddSampler( Render::Sampler* sampler ) { - typedef MessageValue1< RenderManager, Render::Sampler* > DerivedType; + // Message has ownership of Sampler while in transit from update to render + typedef MessageValue1< RenderManager, OwnerPointer< Render::Sampler > > DerivedType; // Reserve some memory inside the render queue unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); @@ -1175,20 +1091,21 @@ void UpdateManager::SetFilterMode( Render::Sampler* sampler, unsigned int minFil new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetFilterMode, sampler, minFilterMode, magFilterMode ); } -void UpdateManager::SetWrapMode( Render::Sampler* sampler, unsigned int uWrapMode, unsigned int vWrapMode ) +void UpdateManager::SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode ) { - typedef MessageValue3< RenderManager, Render::Sampler*, unsigned int, unsigned int > DerivedType; + typedef MessageValue4< RenderManager, Render::Sampler*, unsigned int, unsigned int, unsigned 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::SetWrapMode, sampler, uWrapMode, vWrapMode ); + new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetWrapMode, sampler, rWrapMode, sWrapMode, tWrapMode ); } void UpdateManager::AddPropertyBuffer( Render::PropertyBuffer* propertyBuffer ) { - typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType; + // Message has ownership of format while in transit from update -> render + typedef MessageValue1< RenderManager, OwnerPointer< Render::PropertyBuffer > > DerivedType; // Reserve some memory inside the render queue unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); @@ -1210,7 +1127,8 @@ void UpdateManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer void UpdateManager::SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format ) { - typedef MessageValue2< RenderManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > DerivedType; + // Message has ownership of format while in transit from update -> render + 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 ) ); @@ -1221,7 +1139,8 @@ void UpdateManager::SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuff void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, Dali::Vector* data, size_t size ) { - typedef MessageValue3< RenderManager, Render::PropertyBuffer*, Dali::Vector*, size_t > DerivedType; + // Message has ownership of format while in transit from update -> render + typedef MessageValue3< RenderManager, Render::PropertyBuffer*, OwnerPointer< Dali::Vector >, size_t > DerivedType; // Reserve some memory inside the render queue unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); @@ -1232,7 +1151,8 @@ void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffe void UpdateManager::AddGeometry( Render::Geometry* geometry ) { - typedef MessageValue1< RenderManager, Render::Geometry* > DerivedType; + // Message has ownership of format while in transit from update -> render + typedef MessageValue1< RenderManager, OwnerPointer< Render::Geometry > > DerivedType; // Reserve some memory inside the render queue unsigned int* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) ); @@ -1296,6 +1216,83 @@ void UpdateManager::AddVertexBuffer( Render::Geometry* geometry, Render::Propert new (slot) DerivedType( &mImpl->renderManager, &RenderManager::AddVertexBuffer, geometry, propertyBuffer ); } +void UpdateManager::AddTexture( Render::Texture* texture ) +{ + // Message has ownership of Texture while in transit from update -> render + typedef MessageValue1< RenderManager, OwnerPointer< Render::Texture > > 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::AddTexture, texture ); +} + +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 ) ); + + // 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 ); +} + +void UpdateManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params ) +{ + 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 ) ); + + // 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 ); +} + +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 ) ); + + // 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 ) +{ + typedef MessageValue1< RenderManager, Render::FrameBuffer* > 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::AddFrameBuffer, frameBuffer ); +} + +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 ) ); + + // 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 ) +{ + typedef MessageValue4< RenderManager, Render::FrameBuffer*, Render::Texture*, unsigned int, unsigned 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::AttachColorTextureToFrameBuffer, frameBuffer, texture, mipmapLevel, layer ); +} } // namespace SceneGraph