(Vector) Ignore previous image when the queue is full 44/245944/2
authorHeeyong Song <heeyong.song@samsung.com>
Tue, 20 Oct 2020 08:31:22 +0000 (17:31 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Wed, 21 Oct 2020 01:08:02 +0000 (01:08 +0000)
Change-Id: Icd1a1fdabe75cd01e73dade6c5109d3cf6229e23

dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.cpp

index 75138cd..65202c4 100755 (executable)
@@ -146,8 +146,6 @@ void TizenVectorAnimationRenderer::SetRenderer( Renderer renderer )
 
     SetShader();
   }
-
-  DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::SetRenderer [%p]\n", this );
 }
 
 void TizenVectorAnimationRenderer::SetSize( uint32_t width, uint32_t height )
@@ -186,88 +184,97 @@ bool TizenVectorAnimationRenderer::Render( uint32_t frameNumber )
 {
   Dali::Mutex::ScopedLock lock( mMutex );
 
-  if( !mTbmQueue || !mVectorRenderer )
+  if( !mTbmQueue || !mVectorRenderer || !mTargetSurface )
   {
     return false;
   }
 
-  if( tbm_surface_queue_can_dequeue( mTbmQueue, 0 ) )
+  int canDequeue = tbm_surface_queue_can_dequeue( mTbmQueue, 0 );
+  if( !canDequeue )
   {
-    tbm_surface_h tbmSurface;
+    // Ignore the previous image which is inserted to the queue.
+    mTargetSurface->IgnoreSourceImage();
 
-    if( tbm_surface_queue_dequeue( mTbmQueue, &tbmSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
+    // Check again
+    canDequeue = tbm_surface_queue_can_dequeue( mTbmQueue, 0 );
+    if( !canDequeue )
     {
-      DALI_LOG_ERROR( "Failed to dequeue a tbm_surface [%p]\n", this );
       return false;
     }
+  }
 
-    tbm_surface_info_s info;
-    tbm_surface_map( tbmSurface, TBM_OPTION_WRITE, &info );
+  tbm_surface_h tbmSurface;
 
-    rlottie::Surface surface;
-    bool existing = false;
+  if( tbm_surface_queue_dequeue( mTbmQueue, &tbmSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
+  {
+    DALI_LOG_ERROR( "Failed to dequeue a tbm_surface [%p]\n", this );
+    return false;
+  }
 
-    if( !mResourceReady )
-    {
-      // Need to reset buffer list
-      ResetBuffers();
-    }
-    else
+  tbm_surface_info_s info;
+  tbm_surface_map( tbmSurface, TBM_OPTION_WRITE, &info );
+
+  rlottie::Surface surface;
+  bool existing = false;
+
+  if( !mResourceReady )
+  {
+    // Need to reset buffer list
+    ResetBuffers();
+  }
+  else
+  {
+    for( auto&& iter : mBuffers )
     {
-      for( auto&& iter : mBuffers )
+      if( iter.first == tbmSurface )
       {
-        if( iter.first == tbmSurface )
-        {
-          // Find the buffer in the existing list
-          existing = true;
-          surface = iter.second;
-          break;
-        }
+        // Find the buffer in the existing list
+        existing = true;
+        surface = iter.second;
+        break;
       }
     }
+  }
 
-    if( !existing )
+  if( !existing )
+  {
+    unsigned char* buffer = info.planes[0].ptr;
+    if( !buffer )
     {
-      unsigned char* buffer = info.planes[0].ptr;
-      if( !buffer )
-      {
-        DALI_LOG_ERROR( "TizenVectorAnimationRenderer::Render: tbm buffer pointer is null! [%p]\n", this );
-        tbm_surface_unmap( tbmSurface );
-        return false;
-      }
-
-      tbm_surface_internal_ref( tbmSurface );
+      DALI_LOG_ERROR( "TizenVectorAnimationRenderer::Render: tbm buffer pointer is null! [%p]\n", this );
+      tbm_surface_unmap( tbmSurface );
+      return false;
+    }
 
-      // Create Surface object
-      surface = rlottie::Surface( reinterpret_cast< uint32_t* >( buffer ), mWidth, mHeight, static_cast< size_t >( info.planes[0].stride ) );
+    tbm_surface_internal_ref( tbmSurface );
 
-      // Push the buffer
-      mBuffers.push_back( SurfacePair( tbmSurface, surface ) );
-    }
+    // Create Surface object
+    surface = rlottie::Surface( reinterpret_cast< uint32_t* >( buffer ), mWidth, mHeight, static_cast< size_t >( info.planes[0].stride ) );
 
-    // Render the frame
-    mVectorRenderer->renderSync( frameNumber, surface );
+    // Push the buffer
+    mBuffers.push_back( SurfacePair( tbmSurface, surface ) );
+  }
 
-    tbm_surface_unmap( tbmSurface );
+  // Render the frame
+  mVectorRenderer->renderSync( frameNumber, surface );
 
-    tbm_surface_queue_enqueue( mTbmQueue, tbmSurface );
+  tbm_surface_unmap( tbmSurface );
 
-    if( !mResourceReady )
-    {
-      mPreviousTexture = mRenderedTexture;  // It is used to destroy the object in the main thread.
-      mRenderedTexture = mTexture;
-      mResourceReady = true;
-      mResourceReadyTriggered = true;
+  tbm_surface_queue_enqueue( mTbmQueue, tbmSurface );
 
-      TizenVectorAnimationManager::Get().TriggerEvent( *this );
+  if( !mResourceReady )
+  {
+    mPreviousTexture = mRenderedTexture;  // It is used to destroy the object in the main thread.
+    mRenderedTexture = mTexture;
+    mResourceReady = true;
+    mResourceReadyTriggered = true;
 
-      DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::Render: Resource ready [current = %d] [%p]\n", frameNumber, this );
-    }
+    TizenVectorAnimationManager::Get().TriggerEvent( *this );
 
-    return true;
+    DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::Render: Resource ready [current = %d] [%p]\n", frameNumber, this );
   }
 
-  return false;
+  return true;
 }
 
 uint32_t TizenVectorAnimationRenderer::GetTotalFrameNumber() const
@@ -284,8 +291,6 @@ void TizenVectorAnimationRenderer::GetDefaultSize( uint32_t& width, uint32_t& he
 {
   width = mDefaultWidth;
   height = mDefaultHeight;
-
-  DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::GetDefaultSize: width = %d, height = %d [%p]\n", width, height, this );
 }
 
 void TizenVectorAnimationRenderer::GetLayerInfo( Property::Map& map ) const