[Tizen] Fixed Cache for AnimatedVectorImageVisual 23/303623/1
authorseungho baek <sbsh.baek@samsung.com>
Thu, 26 Oct 2023 09:17:10 +0000 (18:17 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 2 Jan 2024 11:37:18 +0000 (20:37 +0900)
Change-Id: I3b48cb16f221031157501834474a4298da661d5c
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp
dali-extension/vector-animation-renderer/vector-animation-renderer.cpp
dali-extension/vector-animation-renderer/vector-animation-renderer.h

index 6322935..8ce4542 100644 (file)
@@ -70,6 +70,15 @@ bool VectorAnimationRendererTizen::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;
@@ -98,7 +107,16 @@ bool VectorAnimationRendererTizen::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 && (frameNumber < mDecodedBuffers.size()) && (!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("VectorAnimationRendererTizen::Render: tbm_surface_map is failed! [%d] [%p]\n", ret, this);
@@ -137,15 +155,31 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber)
     }
   }
 
-  if(!existing)
+  if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()) && mDecodedBuffers[frameNumber].second)
   {
-    tbm_surface_internal_ref(tbmSurface);
+    const int bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+    memcpy(buffer, &mDecodedBuffers[frameNumber].first[0], bufferSize);
+  }
+  else
+  {
+    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));
+    }
+
+    if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()))
+    {
+      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;
+    }
   }
 
   // Render the frame
index 6f85639..ff7d94f 100644 (file)
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <dali/devel-api/common/hash.h>
 #include <dali/integration-api/debug.h>
+#include <dali/integration-api/texture-integ.h>
 #include <dali/public-api/object/property-array.h>
 
 #include <cstring> // for strlen()
@@ -58,7 +59,8 @@ VectorAnimationRenderer::VectorAnimationRenderer()
   mLoadFailed(false),
   mResourceReady(false),
   mShaderChanged(false),
-  mResourceReadyTriggered(false)
+  mResourceReadyTriggered(false),
+  mEnableFixedCache(false)
 {
   VectorAnimationPluginManager::Get().AddEventHandler(*this);
 }
@@ -421,6 +423,13 @@ void VectorAnimationRenderer::AddPropertyValueCallback(const std::string& keyPat
   }
 }
 
+void VectorAnimationRenderer::KeepRasterizedBuffer()
+{
+  Dali::Mutex::ScopedLock lock(mMutex);
+  mEnableFixedCache = true;
+  mDecodedBuffers.clear();
+}
+
 VectorAnimationRendererPlugin::UploadCompletedSignalType& VectorAnimationRenderer::UploadCompletedSignal()
 {
   return mUploadCompletedSignal;
index bf2334c..0d1c22c 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 // EXTERNAL INCLUDES
+#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>
@@ -113,6 +114,8 @@ public:
    */
   void AddPropertyValueCallback(const std::string& keyPath, VectorProperty property, CallbackBase* callback, int32_t id) override;
 
+  void KeepRasterizedBuffer();
+
   /**
    * @copydoc Dali::VectorAnimationRendererPlugin::UploadCompletedSignal()
    */
@@ -171,8 +174,9 @@ protected:
   virtual Dali::Texture GetTargetTexture() = 0;
 
 protected:
-  std::string                                mUrl;               ///< The content file path
-  std::vector<std::unique_ptr<CallbackBase>> mPropertyCallbacks; ///< Property callback list
+  std::string                                        mUrl;               ///< The content file path
+  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
@@ -189,6 +193,7 @@ protected:
   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