Improve asynchronous SVG loading performance 58/246158/11
authorhuiyu.eun <huiyu.eun@samsung.com>
Mon, 26 Oct 2020 06:26:33 +0000 (15:26 +0900)
committerhuiyu.eun <huiyu.eun@samsung.com>
Thu, 29 Oct 2020 03:57:26 +0000 (12:57 +0900)
Change-Id: I9dc63a5d2a6dcc5e2790771be781e458d33d65fb
Signed-off-by: huiyu.eun <huiyu.eun@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp
dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp
dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h
dali-toolkit/internal/visuals/visual-factory-cache.cpp
dali-toolkit/internal/visuals/visual-factory-cache.h

index 33ed1ee..ad0dc43 100644 (file)
@@ -1134,9 +1134,6 @@ int UtcDaliVisualFactoryGetSvgVisual(void)
   application.SendNotification();
   application.Render();
 
-  // renderer is not added to actor until the rasterization is completed.
-  DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
-
   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
 
   // renderer is added to actor
@@ -1173,9 +1170,6 @@ int UtcDaliVisualFactoryGetSvgVisualLarge(void)
   application.SendNotification();
   application.Render();
 
-  // renderer is not added to actor until the rasterization is completed.
-  DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
-
   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
 
   // renderer is added to actor
index 75286ca..8bd9f0a 100644 (file)
@@ -121,15 +121,20 @@ PixelData RasterizingTask::GetPixelData() const
   return mPixelData;
 }
 
-SvgRasterizeThread::SvgRasterizeThread( EventThreadCallback* trigger )
-: mTrigger( std::unique_ptr< EventThreadCallback >(trigger) ),
+SvgRasterizeThread::SvgRasterizeThread()
+: mTrigger( new EventThreadCallback( MakeCallback( this, &SvgRasterizeThread::ApplyRasterizedSVGToSampler ) ) ),
   mLogFactory( Dali::Adaptor::Get().GetLogFactory() ),
-  mIsThreadWaiting( false )
+  mIsThreadWaiting( false ),
+  mProcessorRegistered( false )
 {
 }
 
 SvgRasterizeThread::~SvgRasterizeThread()
 {
+  if( mProcessorRegistered )
+  {
+    Adaptor::Get().UnregisterProcessor( *this );
+  }
 }
 
 void SvgRasterizeThread::TerminateThread( SvgRasterizeThread*& thread )
@@ -168,6 +173,12 @@ void SvgRasterizeThread::AddTask( RasterizingTaskPtr task )
       }
     }
     mRasterizeTasks.push_back( task );
+
+    if( !mProcessorRegistered )
+    {
+      Adaptor::Get().RegisterProcessor( *this );
+      mProcessorRegistered = true;
+    }
   }
 
   if( wasEmpty)
@@ -209,6 +220,8 @@ void SvgRasterizeThread::RemoveTask( SvgVisual* visual )
       }
     }
   }
+
+  UnregisterProcessor();
 }
 
 void SvgRasterizeThread::DeleteImage( VectorImageRenderer vectorRenderer )
@@ -276,6 +289,34 @@ void SvgRasterizeThread::Run()
   }
 }
 
+void SvgRasterizeThread::ApplyRasterizedSVGToSampler()
+{
+  while( RasterizingTaskPtr task = NextCompletedTask() )
+  {
+    task->GetSvgVisual()->ApplyRasterizedImage(task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded());
+  }
+
+  UnregisterProcessor();
+}
+
+void SvgRasterizeThread::Process()
+{
+  ApplyRasterizedSVGToSampler();
+}
+
+void SvgRasterizeThread::UnregisterProcessor()
+{
+  if ( mProcessorRegistered )
+  {
+    if( mRasterizeTasks.empty() && mCompletedTasks.empty() )
+    {
+      Adaptor::Get().UnregisterProcessor( *this );
+      mProcessorRegistered = false;
+    }
+  }
+}
+
+
 } // namespace Internal
 
 } // namespace Toolkit
index d7eb16b..705d411 100644 (file)
@@ -29,6 +29,7 @@
 #include <dali/public-api/rendering/texture-set.h>
 #include <dali/devel-api/adaptor-framework/vector-image-renderer.h>
 #include <dali/integration-api/adaptor-framework/log-factory-interface.h>
+#include <dali/integration-api/processor-interface.h>
 #include <memory>
 
 // INTERNAL INCLUDES
@@ -128,7 +129,7 @@ private:
 /**
  * The worker thread for SVG rasterization.
  */
-class SvgRasterizeThread : public Thread
+class SvgRasterizeThread : public Thread, Integration::Processor
 {
 public:
 
@@ -137,7 +138,7 @@ public:
    *
    * @param[in] trigger The trigger to wake up the main thread.
    */
-  SvgRasterizeThread( EventThreadCallback* trigger );
+  SvgRasterizeThread();
 
   /**
    * Terminate the svg rasterize thread, join and delete.
@@ -176,6 +177,11 @@ public:
    */
   void DeleteImage( VectorImageRenderer vectorImage );
 
+    /**
+   * @copydoc Dali::Integration::Processor::Process()
+   */
+  void Process() override;
+
 private:
 
   /**
@@ -192,6 +198,17 @@ private:
    */
   void AddCompletedTask( RasterizingTaskPtr task );
 
+  /**
+   * Applies the rasterized image to material
+   */
+  void ApplyRasterizedSVGToSampler();
+
+  /**
+   * @brief Unregister a previously registered processor
+   *
+   */
+  void UnregisterProcessor();
+
 protected:
 
   /**
@@ -225,6 +242,7 @@ private:
   std::unique_ptr< EventThreadCallback > mTrigger;
   const Dali::LogFactoryInterface&       mLogFactory;
   bool                       mIsThreadWaiting;
+  bool                       mProcessorRegistered;
 };
 
 } // namespace Internal
index 0fa35b9..bb6eb81 100644 (file)
@@ -125,7 +125,7 @@ SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread()
 {
   if( !mSvgRasterizeThread )
   {
-    mSvgRasterizeThread = new SvgRasterizeThread( new EventThreadCallback( MakeCallback( this, &VisualFactoryCache::ApplyRasterizedSVGToSampler ) ) );
+    mSvgRasterizeThread = new SvgRasterizeThread();
     mSvgRasterizeThread->Start();
   }
   return mSvgRasterizeThread;
@@ -140,14 +140,6 @@ VectorAnimationManager& VisualFactoryCache::GetVectorAnimationManager()
   return *mVectorAnimationManager;
 }
 
-void VisualFactoryCache::ApplyRasterizedSVGToSampler()
-{
-  while( RasterizingTaskPtr task = mSvgRasterizeThread->NextCompletedTask() )
-  {
-    task->GetSvgVisual()->ApplyRasterizedImage(task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded());
-  }
-}
-
 Geometry VisualFactoryCache::CreateGridGeometry( Uint16Pair gridSize )
 {
   uint16_t gridWidth = gridSize.GetWidth();
index 5fab354..8037857 100644 (file)
@@ -220,13 +220,6 @@ public:
    */
   VectorAnimationManager& GetVectorAnimationManager();
 
-private: // for svg rasterization thread
-
-  /**
-   * Applies the rasterized image to material
-   */
-  void ApplyRasterizedSVGToSampler();
-
 protected:
 
   /**