ResourceManager ResourcePostProcessQueue no longer double bufferred 09/60509/8
authorAgnelo Vaz <agnelo.vaz@samsung.com>
Fri, 26 Feb 2016 16:43:24 +0000 (16:43 +0000)
committerAgnelo Vaz <agnelo.vaz@samsung.com>
Wed, 2 Mar 2016 14:42:34 +0000 (06:42 -0800)
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

14 files changed:
automated-tests/src/dali-internal/utc-Dali-Internal-ResourceClient.cpp
automated-tests/src/dali/dali-test-suite-utils/test-application.cpp
automated-tests/src/dali/dali-test-suite-utils/test-application.h
dali/internal/common/core-impl.cpp
dali/internal/common/core-impl.h
dali/internal/render/common/render-manager.cpp
dali/internal/render/common/render-manager.h
dali/internal/render/common/texture-uploaded-dispatcher.h [moved from dali/internal/render/common/post-process-resource-dispatcher.h with 69% similarity]
dali/internal/render/gl-resources/texture-cache.cpp
dali/internal/render/gl-resources/texture-cache.h
dali/internal/render/shaders/program-controller.cpp
dali/internal/update/resources/resource-manager-declarations.h
dali/internal/update/resources/resource-manager.cpp
dali/internal/update/resources/resource-manager.h

index 2b20971..154e47d 100644 (file)
@@ -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;
 }
 
index 5fb6e11..e1dc101 100644 (file)
@@ -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++;
index cb5a92c..1f1161a 100644 (file)
@@ -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;
index 6147e6b..efd603d 100644 (file)
@@ -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()
index 1056163..89bf41e 100644 (file)
@@ -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<PropertyNotificationManager> mPropertyNotificationManager; ///< For safe signal emmision of property changed notifications
index a586036..5a37c02 100644 (file)
@@ -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 )
index 6dc0d3d..2b56a42 100644 (file)
@@ -21,8 +21,8 @@
 // INTERNAL INCLUDES
 #include <dali/public-api/math/rect.h>
 #include <dali/internal/common/shader-saver.h>
-#include <dali/internal/render/common/post-process-resource-dispatcher.h>
 #include <dali/internal/update/resources/resource-manager-declarations.h>
+#include <dali/internal/render/common/texture-uploaded-dispatcher.h>
 #include <dali/internal/render/gl-resources/gpu-buffer.h>
 #include <dali/internal/render/renderers/render-property-buffer.h>
 
@@ -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
  *
  */
 
+// INTERNAL INCLUDES
+#include <dali/integration-api/resource-declarations.h>
+
 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(){}
 };
 
 
index a735e99..1cb5f04 100644 (file)
  *
  */
 
-#include <dali/internal/render/gl-resources/texture-cache.h>
-
+#include <dali/integration-api/debug.h>
 #include <dali/integration-api/bitmap.h>
-
-#include <dali/internal/update/resources/resource-manager-declarations.h>
-#include <dali/internal/render/common/post-process-resource-dispatcher.h>
+#include <dali/internal/render/common/texture-uploaded-dispatcher.h>
 #include <dali/internal/render/queue/render-queue.h>
 #include <dali/internal/render/gl-resources/context.h>
 #include <dali/internal/render/gl-resources/texture-factory.h>
 #include <dali/internal/render/gl-resources/texture.h>
+#include <dali/internal/render/gl-resources/texture-cache.h>
 #include <dali/internal/render/gl-resources/texture-observer.h>
 #include <dali/internal/render/gl-resources/bitmap-texture.h>
 #include <dali/internal/render/gl-resources/native-texture.h>
 #include <dali/internal/render/gl-resources/frame-buffer-texture.h>
-
-#include <dali/integration-api/debug.h>
+#include <dali/internal/update/resources/resource-manager-declarations.h>
 
 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);
   }
 }
 
index a2d5468..558adf1 100644 (file)
@@ -59,7 +59,7 @@ class TextureObserver;
 namespace SceneGraph
 {
 class RenderQueue;
-class PostProcessResourceDispatcher;
+class TextureUploadedDispatcher;
 
 typedef std::map<ResourceId, TexturePointer >   TextureContainer;
 typedef std::pair<ResourceId, TexturePointer >  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;
index 0958710..d365753 100644 (file)
 // INTERNAL INCLUDES
 #include <dali/integration-api/gl-defines.h>
 #include <dali/internal/common/shader-saver.h>
-#include <dali/internal/update/resources/resource-manager-declarations.h>
-#include <dali/internal/render/shaders/program.h>
-#include <dali/internal/render/common/post-process-resource-dispatcher.h>
+#include <dali/internal/render/common/texture-uploaded-dispatcher.h>
 #include <dali/internal/render/gl-resources/gl-call-debug.h>
+#include <dali/internal/render/shaders/program.h>
+#include <dali/internal/update/resources/resource-manager-declarations.h>
 
 namespace Dali
 {
index 8fbadac..5b27d0b 100644 (file)
  */
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/threading/mutex.h>
 #include <dali/integration-api/resource-cache.h>
 #include <dali/internal/update/common/double-buffered.h>
+#include <dali/public-api/common/dali-vector.h>
 
 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<std::vector< ResourcePostProcessRequest> > ResourcePostProcessList;
 
 } // Internal
 } // Dali
index 71e79e7..81716ef 100644 (file)
@@ -42,7 +42,6 @@
 #include <dali/internal/render/queue/render-queue.h>
 
 #include <dali/internal/render/common/texture-cache-dispatcher.h>
-#include <dali/internal/render/common/post-process-resource-dispatcher.h>
 
 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();
 }
 
 
index 67c994e..74c2bce 100644 (file)
@@ -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 );