[Tizen] Fixed Cache for AnimatedVectorImageVisual 47/302147/3 accepted/tizen/7.0/unified/20231205.172628 accepted/tizen/7.0/unified/20231207.071835
authorseungho baek <sbsh.baek@samsung.com>
Thu, 26 Oct 2023 09:17:10 +0000 (18:17 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Fri, 1 Dec 2023 06:29:04 +0000 (15:29 +0900)
Change-Id: I3b48cb16f221031157501834474a4298da661d5c
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.cpp
dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.h

index a093c96..67bf3c8 100644 (file)
@@ -80,7 +80,8 @@ TizenVectorAnimationRenderer::TizenVectorAnimationRenderer()
   mLoadFailed(false),
   mResourceReady(false),
   mShaderChanged(false),
-  mResourceReadyTriggered(false)
+  mResourceReadyTriggered(false),
+  mEnableFixedCache(false)
 {
   TizenVectorAnimationManager::Get().AddEventHandler(*this);
 }
@@ -204,6 +205,15 @@ bool TizenVectorAnimationRenderer::Render(uint32_t frameNumber)
 {
   Dali::Mutex::ScopedLock lock(mMutex);
 
+  if(mEnableFixedCache)
+  {
+    if(mDecodedBuffers.size() < mTotalFrameNumber)
+    {
+      mDecodedBuffers.clear();
+      mDecodedBuffers.resize(mTotalFrameNumber, std::make_pair<std::vector<uint8_t>, bool>(std::vector<uint8_t>(), false));
+    }
+  }
+
   if(!mTbmQueue || !mVectorRenderer || !mTargetSurface)
   {
     return false;
@@ -232,7 +242,15 @@ bool TizenVectorAnimationRenderer::Render(uint32_t frameNumber)
   }
 
   tbm_surface_info_s info;
-  int                ret = tbm_surface_map(tbmSurface, TBM_OPTION_WRITE, &info);
+  int                ret = TBM_SURFACE_ERROR_NONE;
+  if(mEnableFixedCache && !mDecodedBuffers[frameNumber].second)
+  {
+    ret = tbm_surface_map(tbmSurface, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &info);
+  }
+  else
+  {
+    ret = tbm_surface_map(tbmSurface, TBM_SURF_OPTION_WRITE, &info);
+  }
   if(ret != TBM_SURFACE_ERROR_NONE)
   {
     DALI_LOG_ERROR("TizenVectorAnimationRenderer::Render: tbm_surface_map is failed! [%d] [%p]\n", ret, this);
@@ -271,19 +289,35 @@ bool TizenVectorAnimationRenderer::Render(uint32_t frameNumber)
     }
   }
 
-  if(!existing)
+  if(mEnableFixedCache && mDecodedBuffers[frameNumber].second)
+  {
+    const int bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+    memcpy(buffer, &mDecodedBuffers[frameNumber].first[0], bufferSize);
+  }
+  else
   {
-    tbm_surface_internal_ref(tbmSurface);
+    if(!existing)
+    {
+      tbm_surface_internal_ref(tbmSurface);
 
-    // Create Surface object
-    surface = rlottie::Surface(reinterpret_cast<uint32_t*>(buffer), mWidth, mHeight, static_cast<size_t>(info.planes[0].stride));
+      // Create Surface object
+      surface = rlottie::Surface(reinterpret_cast<uint32_t*>(buffer), mWidth, mHeight, static_cast<size_t>(info.planes[0].stride));
 
-    // Push the buffer
-    mBuffers.push_back(SurfacePair(tbmSurface, surface));
-  }
+      // Push the buffer
+      mBuffers.push_back(SurfacePair(tbmSurface, surface));
+    }
+
+    // Render the frame
+    mVectorRenderer->renderSync(frameNumber, surface);
 
-  // Render the frame
-  mVectorRenderer->renderSync(frameNumber, surface);
+    if(mEnableFixedCache)
+    {
+      const uint32_t       bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+      std::vector<uint8_t> rasterizeBuffer(buffer, buffer + bufferSize);
+      mDecodedBuffers[frameNumber].first  = std::move(rasterizeBuffer);
+      mDecodedBuffers[frameNumber].second = true;
+    }
+  }
 
   tbm_surface_unmap(tbmSurface);
 
@@ -529,6 +563,13 @@ void TizenVectorAnimationRenderer::AddPropertyValueCallback(const std::string& k
   }
 }
 
+void TizenVectorAnimationRenderer::KeepRasterizedBuffer()
+{
+  Dali::Mutex::ScopedLock lock(mMutex);
+  mEnableFixedCache = true;
+  mDecodedBuffers.clear();
+}
+
 VectorAnimationRendererPlugin::UploadCompletedSignalType& TizenVectorAnimationRenderer::UploadCompletedSignal()
 {
   return mUploadCompletedSignal;
index 6f08892..2a3f0c3 100644 (file)
@@ -20,6 +20,7 @@
 
 // EXTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/native-image-source-queue.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
 #include <dali/devel-api/adaptor-framework/vector-animation-renderer-plugin.h>
 #include <dali/devel-api/threading/mutex.h>
 #include <dali/public-api/common/vector-wrapper.h>
@@ -116,6 +117,8 @@ public:
    */
   void AddPropertyValueCallback(const std::string& keyPath, VectorProperty property, CallbackBase* callback, int32_t id) override;
 
+  void KeepRasterizedBuffer();
+
   /**
    * @copydoc Dali::VectorAnimationRendererPlugin::UploadCompletedSignal()
    */
@@ -144,6 +147,7 @@ private:
   std::string                         mUrl;                    ///< The content file path
   std::vector<SurfacePair>            mBuffers;                ///< EGL Image vector
   std::vector<std::unique_ptr<CallbackBase>> mPropertyCallbacks; ///< Property callback list
+  std::vector<std::pair<std::vector<uint8_t>, bool>> mDecodedBuffers;
 
   mutable Dali::Mutex                 mMutex;                  ///< Mutex
   Dali::Renderer                      mRenderer;               ///< Renderer
@@ -164,6 +168,7 @@ private:
   bool                                mResourceReady;          ///< Whether the resource is ready
   bool                                mShaderChanged;          ///< Whether the shader is changed to support native image
   bool                                mResourceReadyTriggered; ///< Whether the resource ready is triggered
+  bool                                mEnableFixedCache;
 };
 
 } // namespace Plugin