From 393dc6a392a2ff06ffd1a1a721849f9104cadf3c Mon Sep 17 00:00:00 2001 From: Agnelo Vaz Date: Fri, 26 Feb 2016 16:43:24 +0000 Subject: [PATCH] ResourceManager ResourcePostProcessQueue no longer double bufferred Previously the queue consisted of two buffers which held update messages. The resouce load message would come in but may not be stored in the current buffer. Hence the message would only be processed on the next update when the buffers switched. As the only post process is to notify an UPLOADED texture (DELETED is a no-op) the queue is now only of resource ID's indicating resource that has uploaded. UtcDaliInternalRequestReloadBitmapRequests01, updated as now the Upload message will be sent before having to do another render-update. Test-suite-utils updated to show location in code of Render WARNINGs Change-Id: Ia38a2a32e3f45f6d3e07c0061db5cdfefa54ad12 --- .../utc-Dali-Internal-ResourceClient.cpp | 17 ++++--- .../dali-test-suite-utils/test-application.cpp | 8 ++-- .../dali/dali-test-suite-utils/test-application.h | 4 +- dali/internal/common/core-impl.cpp | 12 ++--- dali/internal/common/core-impl.h | 2 +- dali/internal/render/common/render-manager.cpp | 22 ++++----- dali/internal/render/common/render-manager.h | 10 ++-- ...-dispatcher.h => texture-uploaded-dispatcher.h} | 17 ++++--- .../internal/render/gl-resources/texture-cache.cpp | 39 +++++++-------- dali/internal/render/gl-resources/texture-cache.h | 6 +-- .../internal/render/shaders/program-controller.cpp | 6 +-- .../resources/resource-manager-declarations.h | 36 ++++++++++---- .../internal/update/resources/resource-manager.cpp | 56 ++++++++-------------- dali/internal/update/resources/resource-manager.h | 6 +-- 14 files changed, 115 insertions(+), 126 deletions(-) rename dali/internal/render/common/{post-process-resource-dispatcher.h => texture-uploaded-dispatcher.h} (69%) diff --git a/automated-tests/src/dali-internal/utc-Dali-Internal-ResourceClient.cpp b/automated-tests/src/dali-internal/utc-Dali-Internal-ResourceClient.cpp index 2b20971..154e47d 100644 --- a/automated-tests/src/dali-internal/utc-Dali-Internal-ResourceClient.cpp +++ b/automated-tests/src/dali-internal/utc-Dali-Internal-ResourceClient.cpp @@ -55,15 +55,15 @@ public: {} int LoadFailedCalled() { - tet_printf("TicketObserver: LoadingFailed() called %d times", mLoadingFailedCalled); + tet_printf("TicketObserver: LoadingFailed() called %d times\n", mLoadingFailedCalled); return mLoadingFailedCalled; } int LoadSucceededCalled() { - tet_printf("TicketObserver: LoadingSucceeded() called %d times", mLoadingSucceededCalled); + tet_printf("TicketObserver: LoadingSucceeded() called %d times\n", mLoadingSucceededCalled); return mLoadingSucceededCalled; } int UploadCalled() { - tet_printf("TicketObserver: Uploaded() called %d times", mUploadedCount); + tet_printf("TicketObserver: Uploaded() called %d times\n", mUploadedCount); return mUploadedCount; } void Reset() { @@ -413,7 +413,7 @@ int UtcDaliInternalRequestReloadBitmapRequests01(void) DALI_TEST_CHECK( req->GetId() == ticket->GetId() ); application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2); - application.Render(0); // Process update messages / UpdateCache + application.Render(0 , TEST_LOCATION ); // Process update messages / UpdateCache DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) ); DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id)); @@ -427,11 +427,11 @@ int UtcDaliInternalRequestReloadBitmapRequests01(void) DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION ); application.SendNotification(); // Process event messages - application.Render(0); // Process update messages / UpdateCache + application.Render(0, TEST_LOCATION ); // Process update messages / UpdateCache application.SendNotification(); // Process event messages DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION ); - DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 1, TEST_LOCATION ); DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION ); DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION ); DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION ); @@ -439,9 +439,8 @@ int UtcDaliInternalRequestReloadBitmapRequests01(void) } // Discard ticket application.SendNotification(); // Flush update queue (with ticket discarded message - application.Render(1); // Process update messages + application.Render(1, TEST_LOCATION ); // Process update messages application.SendNotification(); // Send event notifications - application.Render(1); // Process update messages // Resource should have been discarded. DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) ); @@ -449,7 +448,7 @@ int UtcDaliInternalRequestReloadBitmapRequests01(void) DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION ); DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION ); - DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 1, TEST_LOCATION ); END_TEST; } diff --git a/automated-tests/src/dali/dali-test-suite-utils/test-application.cpp b/automated-tests/src/dali/dali-test-suite-utils/test-application.cpp index 5fb6e11..e1dc101 100644 --- a/automated-tests/src/dali/dali-test-suite-utils/test-application.cpp +++ b/automated-tests/src/dali/dali-test-suite-utils/test-application.cpp @@ -154,13 +154,13 @@ void TestApplication::SetSurfaceWidth( unsigned int width, unsigned height ) mCore->SurfaceResized( mSurfaceWidth, mSurfaceHeight ); } -void TestApplication::DoUpdate( unsigned int intervalMilliseconds ) +void TestApplication::DoUpdate( unsigned int intervalMilliseconds, const char* location ) { if( GetUpdateStatus() == 0 && mRenderStatus.NeedsUpdate() == false && ! GetRenderController().WasCalled(TestRenderController::RequestUpdateFunc) ) { - fprintf(stderr, "WARNING - Update not required\n"); + fprintf(stderr, "WARNING - Update not required :%s\n", location==NULL?"NULL":location); } unsigned int nextVSyncTime = mLastVSyncTime + intervalMilliseconds; @@ -173,9 +173,9 @@ void TestApplication::DoUpdate( unsigned int intervalMilliseconds ) mLastVSyncTime = nextVSyncTime; } -bool TestApplication::Render( unsigned int intervalMilliseconds ) +bool TestApplication::Render( unsigned int intervalMilliseconds, const char* location ) { - DoUpdate( intervalMilliseconds ); + DoUpdate( intervalMilliseconds, location ); mCore->Render( mRenderStatus ); mFrame++; diff --git a/automated-tests/src/dali/dali-test-suite-utils/test-application.h b/automated-tests/src/dali/dali-test-suite-utils/test-application.h index cb5a92c..1f1161a 100644 --- a/automated-tests/src/dali/dali-test-suite-utils/test-application.h +++ b/automated-tests/src/dali/dali-test-suite-utils/test-application.h @@ -73,7 +73,7 @@ public: void ProcessEvent(const Integration::Event& event); void SendNotification(); void SetSurfaceWidth( unsigned int width, unsigned height ); - bool Render( unsigned int intervalMilliseconds = DEFAULT_RENDER_INTERVAL ); + bool Render( unsigned int intervalMilliseconds = DEFAULT_RENDER_INTERVAL, const char* location=NULL ); unsigned int GetUpdateStatus(); bool UpdateOnly( unsigned int intervalMilliseconds = DEFAULT_RENDER_INTERVAL ); bool RenderOnly( ); @@ -82,7 +82,7 @@ public: bool GetRenderHasRendered(); private: - void DoUpdate( unsigned int intervalMilliseconds ); + void DoUpdate( unsigned int intervalMilliseconds, const char* location=NULL ); protected: TestPlatformAbstraction mPlatformAbstraction; diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp index 6147e6b..efd603d 100644 --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -90,7 +90,7 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mUpdateManager(NULL), mRenderManager(NULL), mDiscardQueue(NULL), - mResourcePostProcessQueue(), + mTextureUploadedQueue(), mNotificationManager(NULL), mImageFactory(NULL), mShaderFactory(NULL), @@ -109,10 +109,9 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mPropertyNotificationManager = PropertyNotificationManager::New(); - std::vector< ResourcePostProcessRequest> init; - mResourcePostProcessQueue = new ResourcePostProcessList(init); + mTextureUploadedQueue = new LockedResourceQueue; - mRenderManager = RenderManager::New( glAbstraction, glSyncAbstraction, *mResourcePostProcessQueue ); + mRenderManager = RenderManager::New( glAbstraction, glSyncAbstraction, *mTextureUploadedQueue ); RenderQueue& renderQueue = mRenderManager->GetRenderQueue(); TextureCache& textureCache = mRenderManager->GetTextureCache(); @@ -129,8 +128,7 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mResourceManager = new ResourceManager( mPlatform, *mNotificationManager, textureCache, - *mResourcePostProcessQueue, - *mRenderManager, + *mTextureUploadedQueue, *mDiscardQueue, renderQueue ); @@ -210,7 +208,7 @@ Core::~Core() delete mTouchResampler; delete mRenderManager; delete mDiscardQueue; - delete mResourcePostProcessQueue; + delete mTextureUploadedQueue; } Integration::ContextNotifierInterface* Core::GetContextNotifier() diff --git a/dali/internal/common/core-impl.h b/dali/internal/common/core-impl.h index 1056163..89bf41e 100644 --- a/dali/internal/common/core-impl.h +++ b/dali/internal/common/core-impl.h @@ -288,7 +288,7 @@ private: SceneGraph::UpdateManager* mUpdateManager; ///< Update manager SceneGraph::RenderManager* mRenderManager; ///< Render manager SceneGraph::DiscardQueue* mDiscardQueue; ///< Used to cleanup nodes & resources when no longer in use. - ResourcePostProcessList* mResourcePostProcessQueue; ///< Stores resource ids which require post processing after render + LockedResourceQueue* mTextureUploadedQueue; ///< Stores resource ids which require post processing after render NotificationManager* mNotificationManager; ///< Notification manager AnimationPlaylistOwner mAnimationPlaylist; ///< For 'Fire and forget' animation support OwnerPointer mPropertyNotificationManager; ///< For safe signal emmision of property changed notifications diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index a586036..5a37c02 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -73,13 +73,13 @@ struct RenderManager::Impl { Impl( Integration::GlAbstraction& glAbstraction, Integration::GlSyncAbstraction& glSyncAbstraction, - ResourcePostProcessList& resourcePostProcessQ, - PostProcessResourceDispatcher& postProcessDispatcher ) + LockedResourceQueue& textureUploadedQ, + TextureUploadedDispatcher& postProcessDispatcher ) : context( glAbstraction ), glSyncAbstraction( glSyncAbstraction ), renderQueue(), textureCache( renderQueue, postProcessDispatcher, context ), - resourcePostProcessQueue( resourcePostProcessQ ), + textureUploadedQueue( textureUploadedQ ), instructions(), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), frameCount( 0 ), @@ -132,7 +132,7 @@ struct RenderManager::Impl RenderQueue renderQueue; ///< A message queue for receiving messages from the update-thread. TextureCache textureCache; ///< Cache for all GL textures Render::UniformNameCache uniformNameCache; ///< Cache to provide unique indices for uniforms - ResourcePostProcessList& resourcePostProcessQueue; ///< A queue for requesting resource post processing in update thread + LockedResourceQueue& textureUploadedQueue; ///< A queue for requesting resource post processing in update thread // Render instructions describe what should be rendered during RenderManager::Render() // Owned by RenderManager. Update manager updates instructions for the next frame while we render the current one @@ -161,10 +161,10 @@ struct RenderManager::Impl RenderManager* RenderManager::New( Integration::GlAbstraction& glAbstraction, Integration::GlSyncAbstraction& glSyncAbstraction, - ResourcePostProcessList& resourcePostProcessQ ) + LockedResourceQueue& textureUploadedQ ) { RenderManager* manager = new RenderManager; - manager->mImpl = new Impl( glAbstraction, glSyncAbstraction, resourcePostProcessQ, *manager ); + manager->mImpl = new Impl( glAbstraction, glSyncAbstraction, textureUploadedQ, *manager ); return manager; } @@ -215,9 +215,9 @@ void RenderManager::ContextDestroyed() } } -void RenderManager::DispatchPostProcessRequest(ResourcePostProcessRequest& request) +void RenderManager::DispatchTextureUploaded(ResourceId request) { - mImpl->resourcePostProcessQueue[ mImpl->renderBufferIndex ].push_back( request ); + mImpl->textureUploadedQueue.PushBack( request ); } void RenderManager::SetShaderSaver( ShaderSaver& upstream ) @@ -497,9 +497,6 @@ bool RenderManager::Render( Integration::RenderStatus& status ) } } - // check if anything has been posted to the update thread - bool updateRequired = !mImpl->resourcePostProcessQueue[ mImpl->renderBufferIndex ].empty(); - //Notify RenderGeometries that rendering has finished for ( RenderGeometryOwnerIter iter = mImpl->renderGeometryContainer.Begin(); iter != mImpl->renderGeometryContainer.End(); ++iter ) { @@ -515,7 +512,8 @@ bool RenderManager::Render( Integration::RenderStatus& status ) DALI_PRINT_RENDER_END(); - return updateRequired; + // check if anything has been posted to the update thread, if IsEmpty then no update required. + return !mImpl->textureUploadedQueue.IsEmpty(); } void RenderManager::DoRender( RenderInstruction& instruction, Shader& defaultShader ) diff --git a/dali/internal/render/common/render-manager.h b/dali/internal/render/common/render-manager.h index 6dc0d3d..2b56a42 100644 --- a/dali/internal/render/common/render-manager.h +++ b/dali/internal/render/common/render-manager.h @@ -21,8 +21,8 @@ // INTERNAL INCLUDES #include #include -#include #include +#include #include #include @@ -65,7 +65,7 @@ class PropertyBufferDataProvider; * RenderManager is responsible for rendering the result of the previous "update", which * is provided in a RenderCommand during UpdateManager::Update(). */ -class RenderManager : public PostProcessResourceDispatcher +class RenderManager : public TextureUploadedDispatcher { public: @@ -77,7 +77,7 @@ public: */ static RenderManager* New( Integration::GlAbstraction& glAbstraction, Integration::GlSyncAbstraction& glSyncAbstraction, - ResourcePostProcessList& resourcePostProcessQueue ); + LockedResourceQueue& resourcePostProcessQueue ); /** * Non-virtual destructor; not intended as a base class @@ -109,9 +109,9 @@ public: /** * Dispatch requests onto the postProcessResourcesQueue - * @param[in] request The request to dispatch + * @param[in] resource The Id of the resource to dispatch */ - virtual void DispatchPostProcessRequest( ResourcePostProcessRequest& request ); + virtual void DispatchTextureUploaded( ResourceId resource ); /** * Set the upstream interface for compiled shader binaries to be sent back to for eventual diff --git a/dali/internal/render/common/post-process-resource-dispatcher.h b/dali/internal/render/common/texture-uploaded-dispatcher.h similarity index 69% rename from dali/internal/render/common/post-process-resource-dispatcher.h rename to dali/internal/render/common/texture-uploaded-dispatcher.h index ccea682..5c9c622 100644 --- a/dali/internal/render/common/post-process-resource-dispatcher.h +++ b/dali/internal/render/common/texture-uploaded-dispatcher.h @@ -18,33 +18,36 @@ * */ +// INTERNAL INCLUDES +#include + namespace Dali { namespace Internal { -struct ResourcePostProcessRequest; +typedef Integration::ResourceId ResourceId; namespace SceneGraph { /** - * Interface which offers a dispatch mechanism for post process requests on resources + * Interface which offers a dispatch mechanism for uploaded notifications on textures * Should be offered by a Render Thread object */ -class PostProcessResourceDispatcher +class TextureUploadedDispatcher { public: /** - * Dispatch a post process resource request to the Update thread - * @param[in] request A post process request + * Dispatch a post process resource uploaded request to the Update thread + * @param[in] resource A post process request */ - virtual void DispatchPostProcessRequest(ResourcePostProcessRequest& request) = 0; + virtual void DispatchTextureUploaded( ResourceId resource ) = 0; protected: /** * Virtual destructor */ - virtual ~PostProcessResourceDispatcher(){} + virtual ~TextureUploadedDispatcher(){} }; diff --git a/dali/internal/render/gl-resources/texture-cache.cpp b/dali/internal/render/gl-resources/texture-cache.cpp index a735e99..1cb5f04 100644 --- a/dali/internal/render/gl-resources/texture-cache.cpp +++ b/dali/internal/render/gl-resources/texture-cache.cpp @@ -15,22 +15,19 @@ * */ -#include - +#include #include - -#include -#include +#include #include #include #include #include +#include #include #include #include #include - -#include +#include using Dali::Internal::Texture; using Dali::Internal::FrameBufferTexture; @@ -75,10 +72,10 @@ void GlContextDestroyed( TextureContainer& textures ) } TextureCache::TextureCache( RenderQueue& renderQueue, - PostProcessResourceDispatcher& postProcessResourceDispatcher, + TextureUploadedDispatcher& postProcessResourceDispatcher, Context& context) : TextureCacheDispatcher(renderQueue), - mPostProcessResourceDispatcher(postProcessResourceDispatcher), + mTextureUploadedDispatcher(postProcessResourceDispatcher), mContext(context), mDiscardBitmapsPolicy(ResourcePolicy::OWNED_DISCARD) { @@ -165,8 +162,8 @@ void TextureCache::UpdateTexture( ResourceId id, Integration::BitmapPtr bitmap ) { texturePtr->Update( bitmap.Get() ); - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::UPLOADED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); + ResourceId ppRequest( id ); + mTextureUploadedDispatcher.DispatchTextureUploaded(ppRequest); } } } @@ -183,8 +180,8 @@ void TextureCache::UpdateTexture( ResourceId id, Integration::BitmapPtr bitmap, { texturePtr->Update( bitmap.Get(), xOffset, yOffset ); - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::UPLOADED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); + ResourceId ppRequest( id ); + mTextureUploadedDispatcher.DispatchTextureUploaded(ppRequest); } } } @@ -214,8 +211,8 @@ void TextureCache::UpdateTexture( ResourceId id, PixelDataPtr pixelData, std::si { texturePtr->Update( pixelData.Get(), xOffset, yOffset ); - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::UPLOADED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); + ResourceId ppRequest( id ); + mTextureUploadedDispatcher.DispatchTextureUploaded(ppRequest); } } } @@ -232,8 +229,8 @@ void TextureCache::UpdateTextureArea( ResourceId id, const Dali::RectArea& area { texturePtr->UpdateArea( area ); - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::UPLOADED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); + ResourceId ppRequest( id ); + mTextureUploadedDispatcher.DispatchTextureUploaded(ppRequest); } } } @@ -293,10 +290,6 @@ void TextureCache::DiscardTexture( ResourceId id ) mObservers.erase( observersIter ); } } - - // Tell resource manager - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::DELETED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); } } @@ -305,8 +298,8 @@ void TextureCache::BindTexture( Texture *texture, ResourceId id, GLenum target, bool created = texture->Bind(target, textureunit); if( created && texture->UpdateOnCreate() ) // i.e. the pixel data was sent to GL { - ResourcePostProcessRequest ppRequest( id, ResourcePostProcessRequest::UPLOADED ); - mPostProcessResourceDispatcher.DispatchPostProcessRequest(ppRequest); + ResourceId ppRequest( id ); + mTextureUploadedDispatcher.DispatchTextureUploaded(ppRequest); } } diff --git a/dali/internal/render/gl-resources/texture-cache.h b/dali/internal/render/gl-resources/texture-cache.h index a2d5468..558adf1 100644 --- a/dali/internal/render/gl-resources/texture-cache.h +++ b/dali/internal/render/gl-resources/texture-cache.h @@ -59,7 +59,7 @@ class TextureObserver; namespace SceneGraph { class RenderQueue; -class PostProcessResourceDispatcher; +class TextureUploadedDispatcher; typedef std::map TextureContainer; typedef std::pair TexturePair; @@ -79,7 +79,7 @@ public: * @param[in] context GL Context */ TextureCache( RenderQueue& renderQueue, - PostProcessResourceDispatcher& postProcessDispatcher, + TextureUploadedDispatcher& postProcessDispatcher, Context& context ); /** @@ -322,7 +322,7 @@ protected: // Implements TextureCacheDispatcher private: - PostProcessResourceDispatcher& mPostProcessResourceDispatcher; + TextureUploadedDispatcher& mTextureUploadedDispatcher; Context& mContext; TextureContainer mTextures; TextureContainer mFramebufferTextures; diff --git a/dali/internal/render/shaders/program-controller.cpp b/dali/internal/render/shaders/program-controller.cpp index 0958710..d365753 100644 --- a/dali/internal/render/shaders/program-controller.cpp +++ b/dali/internal/render/shaders/program-controller.cpp @@ -21,10 +21,10 @@ // INTERNAL INCLUDES #include #include -#include -#include -#include +#include #include +#include +#include namespace Dali { diff --git a/dali/internal/update/resources/resource-manager-declarations.h b/dali/internal/update/resources/resource-manager-declarations.h index 8fbadac..5b27d0b 100644 --- a/dali/internal/update/resources/resource-manager-declarations.h +++ b/dali/internal/update/resources/resource-manager-declarations.h @@ -19,8 +19,10 @@ */ // INTERNAL INCLUDES +#include #include #include +#include namespace Dali { @@ -34,24 +36,38 @@ typedef Integration::ResourceId ResourceId; * Post processing required on the resource after the resource has been modified by the render thread * Should only be handled by update thread */ -struct ResourcePostProcessRequest + +typedef Dali::Vector< ResourceId > TextureUploadedQueue; + +class LockedResourceQueue { - enum PostProcess + +public: + void PushBack( ResourceId request ) { - UPLOADED, - DELETED - }; + Dali::Mutex::ScopedLock lock( mMutex ); + mQueue.PushBack( request ); + } - ResourceId id; - PostProcess postProcess; + bool IsEmpty() const + { + Dali::Mutex::ScopedLock lock( mMutex ); + return mQueue.Empty(); + } - ResourcePostProcessRequest( ResourceId anId, PostProcess aPostProcess ) - : id(anId), postProcess(aPostProcess) + void SwapQueue( TextureUploadedQueue& list ) { + Dali::Mutex::ScopedLock lock( mMutex ); + list.Clear(); + mQueue.Swap( list ); } + +private: + + TextureUploadedQueue mQueue; + mutable Dali::Mutex mMutex; }; -typedef SceneGraph::DoubleBuffered > ResourcePostProcessList; } // Internal } // Dali diff --git a/dali/internal/update/resources/resource-manager.cpp b/dali/internal/update/resources/resource-manager.cpp index 71e79e7..81716ef 100644 --- a/dali/internal/update/resources/resource-manager.cpp +++ b/dali/internal/update/resources/resource-manager.cpp @@ -42,7 +42,6 @@ #include #include -#include using namespace Dali::Integration; @@ -81,16 +80,15 @@ struct ResourceManager::ResourceManagerImpl ResourceManagerImpl( PlatformAbstraction& platformAbstraction, NotificationManager& notificationManager, SceneGraph::TextureCacheDispatcher& textureCacheDispatcher, - ResourcePostProcessList& resourcePostProcessQueue, - SceneGraph::PostProcessResourceDispatcher& postProcessResourceDispatcher, + LockedResourceQueue& textureUploadedQueue, DiscardQueue& discardQueue, RenderQueue& renderQueue ) : mPlatformAbstraction(platformAbstraction), mNotificationManager(notificationManager), mResourceClient(NULL), mTextureCacheDispatcher(textureCacheDispatcher), - mResourcePostProcessQueue(resourcePostProcessQueue), - mPostProcessResourceDispatcher(postProcessResourceDispatcher), + mTextureUploadedQueue(textureUploadedQueue), + mTextureUploadedProcessingQueue(), mDiscardQueue(discardQueue), mRenderQueue(renderQueue), mNotificationCount(0), @@ -103,16 +101,16 @@ struct ResourceManager::ResourceManagerImpl { } - PlatformAbstraction& mPlatformAbstraction; - NotificationManager& mNotificationManager; - ResourceClient* mResourceClient; // (needs to be a ptr - it's not instantiated yet) - TextureCacheDispatcher& mTextureCacheDispatcher; - ResourcePostProcessList& mResourcePostProcessQueue; - SceneGraph::PostProcessResourceDispatcher& mPostProcessResourceDispatcher; - DiscardQueue& mDiscardQueue; ///< Unwanted resources are added here during UpdateCache() - RenderQueue& mRenderQueue; - unsigned int mNotificationCount; - bool cacheUpdated; ///< returned by UpdateCache(). Set true in NotifyTickets to indicate a change in a resource + PlatformAbstraction& mPlatformAbstraction; + NotificationManager& mNotificationManager; + ResourceClient* mResourceClient; // (needs to be a ptr - it's not instantiated yet) + TextureCacheDispatcher& mTextureCacheDispatcher; + LockedResourceQueue& mTextureUploadedQueue; + TextureUploadedQueue mTextureUploadedProcessingQueue; + DiscardQueue& mDiscardQueue; ///< Unwanted resources are added here during UpdateCache() + RenderQueue& mRenderQueue; + unsigned int mNotificationCount; + bool cacheUpdated; ///< returned by UpdateCache(). Set true in NotifyTickets to indicate a change in a resource /** * These containers are used to processs requests, and ResourceCache callbacks. @@ -142,8 +140,7 @@ struct ResourceManager::ResourceManagerImpl ResourceManager::ResourceManager( PlatformAbstraction& platformAbstraction, NotificationManager& notificationManager, TextureCacheDispatcher& textureCacheDispatcher, - ResourcePostProcessList& resourcePostProcessQueue, - SceneGraph::PostProcessResourceDispatcher& postProcessResourceDispatcher, + LockedResourceQueue& resourcePostProcessQueue, DiscardQueue& discardQueue, RenderQueue& renderQueue ) { @@ -151,7 +148,6 @@ ResourceManager::ResourceManager( PlatformAbstraction& platformAbstraction, notificationManager, textureCacheDispatcher, resourcePostProcessQueue, - postProcessResourceDispatcher, discardQueue, renderQueue ); } @@ -195,29 +191,17 @@ void ResourceManager::PostProcessResources( BufferIndex updateBufferIndex ) DALI_ASSERT_DEBUG( mImpl->mResourceClient != NULL ); DALI_LOG_INFO(Debug::Filter::gResource, Debug::Verbose, "ResourceManager: PostProcessResources()\n"); - unsigned int numIds = mImpl->mResourcePostProcessQueue[ updateBufferIndex ].size(); + mImpl->mTextureUploadedQueue.SwapQueue( mImpl->mTextureUploadedProcessingQueue ); + + unsigned int numIds = mImpl->mTextureUploadedProcessingQueue.Size(); unsigned int i; // process the list where RenderManager put post process requests - for (i = 0; i < numIds; ++i) + for ( i = 0; i < numIds; ++i ) { - ResourcePostProcessRequest ppRequest = mImpl->mResourcePostProcessQueue[ updateBufferIndex ][i]; - switch(ppRequest.postProcess) - { - case ResourcePostProcessRequest::UPLOADED: - { - SendToClient( UploadedMessage( *mImpl->mResourceClient, ppRequest.id ) ); - break; - } - case ResourcePostProcessRequest::DELETED: - { - // TextureObservers handled in TextureCache - break; - } - } + ResourceId resourceId = mImpl->mTextureUploadedProcessingQueue[i]; + SendToClient( UploadedMessage( *mImpl->mResourceClient, resourceId ) ); } - - mImpl->mResourcePostProcessQueue[ updateBufferIndex ].clear(); } diff --git a/dali/internal/update/resources/resource-manager.h b/dali/internal/update/resources/resource-manager.h index 67c994e..74c2bce 100644 --- a/dali/internal/update/resources/resource-manager.h +++ b/dali/internal/update/resources/resource-manager.h @@ -70,7 +70,6 @@ namespace SceneGraph class DiscardQueue; class RenderQueue; class TextureCacheDispatcher; -class PostProcessResourceDispatcher; } class NotificationManager; @@ -100,15 +99,14 @@ public: * There should exactly one of these objects per Dali Core. * @param[in] platformAbstraction Used to request resources from the native filesystem. * @param[in] notificationManager Used to send NotifyTickets message. - * @param[in] postProcessResourcesQueue Used for performing post processing on resources + * @param[in] textureUploadedProcessResourcesQueue Used for performing post processing on resources * @param[in] discardQueue Used to cleanup nodes & resources when no longer in use. * @param[in] renderQueue Used to queue resource updates until the next Render. */ ResourceManager( Integration::PlatformAbstraction& platformAbstraction, NotificationManager& notificationManager, SceneGraph::TextureCacheDispatcher& textureCacheDispatcher, - ResourcePostProcessList& postProcessResourcesQueue, - SceneGraph::PostProcessResourceDispatcher& postProcessResourceDispatcher, + LockedResourceQueue& textureUploadedProcessResourcesQueue, SceneGraph::DiscardQueue& discardQueue, SceneGraph::RenderQueue& renderQueue ); -- 2.7.4