Add initialize resetter to reduce AnimatableProperty life 90/289690/13
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 13 Mar 2023 12:41:11 +0000 (21:41 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Thu, 23 Mar 2023 03:35:20 +0000 (03:35 +0000)
To ensure each PropertyOwner's animatable properties lifecycle,
send BakeResetter message when they are created.

And also, to reduce the number of resetter, make RendererResetter.
Now we can control all VisualRenderer properties by single resetter.

Change-Id: I36b97c90bb5a843803e7bfa2441d90a7aee4cb28
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
20 files changed:
dali/internal/file.list
dali/internal/update/common/double-buffered.h
dali/internal/update/common/property-owner.h
dali/internal/update/common/renderer-resetter.h [new file with mode: 0644]
dali/internal/update/common/resetter-manager.h [new file with mode: 0644]
dali/internal/update/manager/render-instruction-processor.cpp
dali/internal/update/manager/update-manager.cpp
dali/internal/update/manager/update-manager.h
dali/internal/update/nodes/node.cpp
dali/internal/update/nodes/node.h
dali/internal/update/render-tasks/scene-graph-camera.cpp
dali/internal/update/render-tasks/scene-graph-camera.h
dali/internal/update/render-tasks/scene-graph-render-task-list.cpp
dali/internal/update/render-tasks/scene-graph-render-task-list.h
dali/internal/update/render-tasks/scene-graph-render-task.cpp
dali/internal/update/render-tasks/scene-graph-render-task.h
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.h
dali/internal/update/rendering/scene-graph-visual-renderer.cpp [new file with mode: 0644]
dali/internal/update/rendering/scene-graph-visual-renderer.h

index a12bdbd..f96636a 100644 (file)
@@ -166,6 +166,7 @@ SET( internal_src_files
   ${internal_src_dir}/update/render-tasks/scene-graph-render-task-list.cpp
   ${internal_src_dir}/update/rendering/scene-graph-texture-set.cpp
   ${internal_src_dir}/update/rendering/scene-graph-renderer.cpp
+  ${internal_src_dir}/update/rendering/scene-graph-visual-renderer.cpp
 )
 
 SET( SOURCES ${SOURCES}
index 65f7cd6..8b71487 100644 (file)
@@ -132,8 +132,8 @@ public:
   };
 
   DoubleBuffered()
-  : mValue1(NULL),
-    mValue2(NULL)
+  : mValue1(nullptr),
+    mValue2(nullptr)
   {
   }
 
index 9eb16d0..769dc35 100644 (file)
@@ -35,6 +35,7 @@ namespace Internal
 namespace SceneGraph
 {
 class PropertyOwner;
+class ResetterManager;
 
 using OwnedPropertyContainer = OwnerContainer<PropertyBase*>;
 using OwnedPropertyIter      = OwnedPropertyContainer::Iterator;
@@ -220,6 +221,17 @@ public:
     return true;
   }
 
+  /**
+   * @brief Install custom resetter messages to resetter manager.
+   * @pre ConnectToSceneGraph() Should be called before this API.
+   *
+   * @param[in] manager ResetterManager to add resetter.
+   */
+  virtual void AddInitializeResetter(ResetterManager& manager) const
+  {
+    // Do nothing
+  }
+
 protected:
   /**
    * Protected constructor.
diff --git a/dali/internal/update/common/renderer-resetter.h b/dali/internal/update/common/renderer-resetter.h
new file mode 100644 (file)
index 0000000..2883440
--- /dev/null
@@ -0,0 +1,164 @@
+#ifndef DALI_INTERNAL_SCENEGRAPH_RENDERER_RESETTER_H
+#define DALI_INTERNAL_SCENEGRAPH_RENDERER_RESETTER_H
+
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// EXTERNAL INCLDUES
+#include <cstdint> // int8_t
+
+#include <dali/internal/update/animation/property-accessor.h>
+#include <dali/internal/update/animation/property-component-accessor.h>
+#include <dali/internal/update/common/property-owner.h>
+#include <dali/internal/update/rendering/scene-graph-renderer.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace SceneGraph
+{
+/**
+ * Class to reset the renderer's properties to their base values. Used by UpdateManager
+ * to reset the renderer properties after the renderer is created.
+ */
+class RendererResetter : public PropertyOwner::Observer
+{
+public:
+  /**
+   * New method.
+   * @param[in] renderer The renderer
+   * @return the new renderer resetter
+   */
+  static RendererResetter* New(const Renderer& renderer)
+  {
+    return new RendererResetter(const_cast<Renderer*>(&renderer));
+  }
+
+  /**
+   * Virtual Destructor
+   */
+  ~RendererResetter() override
+  {
+    if(mRenderer != nullptr)
+    {
+      mRenderer->RemoveObserver(*this);
+    }
+  }
+
+  /**
+   * Initialize.
+   *
+   * Watches the renderer to track if it's destroyed or not.
+   */
+  void Initialize()
+  {
+    mRenderer->AddObserver(*this);
+  }
+
+  /**
+   * Reset the renderer properties to their base values if the renderer is still alive and on stage
+   * @param[in] updateBufferIndex the current buffer index
+   */
+  void ResetToBaseValue(BufferIndex updateBufferIndex)
+  {
+    if(mRenderer != nullptr && mActive)
+    {
+      // Start aging the renderer properties.
+      // We need to reset the renderer properties for only one frames to ensure
+      // initialized case.
+      --mActive;
+
+      mRenderer->ResetToBaseValues(updateBufferIndex);
+    }
+  };
+
+  /**
+   * Called when the renderer is connected to the scene graph.
+   *
+   * Note, SceneGraph::Renderer don't call this API.
+   *
+   * @param[in] owner The property owner
+   */
+  void PropertyOwnerConnected(PropertyOwner& owner) override
+  {
+  }
+
+  /**
+   * Called when mPropertyOwner is disconnected from the scene graph.
+   *
+   * Note, SceneGraph::Renderer don't call this API.
+   *
+   * @param[in] bufferIndex the current buffer index
+   * @param[in] owner The property owner
+   */
+  void PropertyOwnerDisconnected(BufferIndex bufferIndex, PropertyOwner& owner) override
+  {
+  }
+
+  /**
+   * Called shortly before the propertyOwner is destroyed
+   * @param[in] owner The property owner
+   */
+  void PropertyOwnerDestroyed(PropertyOwner& owner) override
+  {
+    mRenderer = nullptr;
+
+    // Don't need to wait another frame as the properties are being destroyed
+    mActive = STOPPED;
+  }
+
+  /**
+   * Determine if the renderer resetter has finished.
+   *
+   * @return true if the renderer resetter has finished.
+   */
+  virtual bool IsFinished()
+  {
+    return mActive <= STOPPED;
+  }
+
+protected:
+  enum
+  {
+    STOPPED = 0,
+    AGING   = 1,
+    ACTIVE  = 2,
+  };
+
+  /**
+   * Constructor
+   *
+   * @param[in] renderer The renderer storing the base properties
+   */
+  RendererResetter(Renderer* renderer)
+  : mRenderer(renderer),
+    mActive(AGING) // Since we make this resetter only initialize case now.
+  {
+    mRenderer->MarkAsDirty();
+  }
+
+  Renderer* mRenderer; ///< The renderer that owns the properties
+  int8_t    mActive;   ///< 2 if active, 1 if aging, 0 if stopped
+};
+
+} // namespace SceneGraph
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif //DALI_INTERNAL_SCENEGRAPH_RENDERER_RESETTER_H
diff --git a/dali/internal/update/common/resetter-manager.h b/dali/internal/update/common/resetter-manager.h
new file mode 100644 (file)
index 0000000..66f31f2
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef DALI_INTERNAL_SCENEGRAPH_RESETTER_MANAGER_H
+#define DALI_INTERNAL_SCENEGRAPH_RESETTER_MANAGER_H
+
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// INTERNAL INCLDUES
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/internal/update/common/property-resetter.h>
+
+namespace Dali::Internal::SceneGraph
+{
+class Node;
+class Renderer;
+
+/**
+ * Abstract interface for passing a Resetter object add.
+ */
+class ResetterManager
+{
+public:
+  /**
+   * Add a property resetter. ResetterManager takes ownership of the object.
+   * It will be killed by ResetterManager when the associated animator or
+   * constraint has finished; or the property owner of the property is destroyed.
+   */
+  virtual void AddPropertyResetter(OwnerPointer<PropertyResetterBase>& propertyResetter) = 0;
+
+  /**
+   * Add a node resetter. ResetterManager takes ownership of the object.
+   * It will be killed by ResetterManager when the node is disconnected from the scene graph;
+   * or when the node is destroyed.
+   */
+  virtual void AddNodeResetter(const Node& node) = 0;
+
+  /**
+   * Add a renderer resetter. ResetterManager takes ownership of the object.
+   * It will be killed by ResetterManager when the renderer is destroyed
+   */
+  virtual void AddRendererResetter(const Renderer& renderer) = 0;
+
+protected:
+  /**
+   * Destructor. Protected as no derived class should ever be deleted
+   * through a reference to this pure abstract interface.
+   */
+  virtual ~ResetterManager() = default;
+};
+
+} // namespace Dali::Internal::SceneGraph
+
+#endif //DALI_INTERNAL_SCENEGRAPH_RESETTER_MANAGER_H
index 87c3c98..dcae779 100644 (file)
@@ -506,7 +506,7 @@ inline void RenderInstructionProcessor::SortRenderItems(BufferIndex bufferIndex,
   for(uint32_t index = 0; index < renderableCount; ++index, ++renderListIter)
   {
     *renderListIter = mSortingHelper[index].renderItem;
-    DALI_LOG_INFO(gRenderListLogFilter, Debug::Verbose, "  sortedList[%d] = %x\n", index, mSortingHelper[index].renderItem->mRenderer);
+    DALI_LOG_INFO(gRenderListLogFilter, Debug::Verbose, "  sortedList[%d] = node : %x renderer : %x\n", index, mSortingHelper[index].renderItem->mNode, mSortingHelper[index].renderItem->mRenderer.Get());
   }
 }
 
@@ -565,6 +565,10 @@ void RenderInstructionProcessor::Prepare(BufferIndex                 updateBuffe
         // We only use the clipping version of the sort comparitor if any clipping nodes exist within the RenderList.
         SortRenderItems(updateBufferIndex, *renderList, layer, hasClippingNodes, isOrthographicCamera);
       }
+      else
+      {
+        renderList->SetHasColorRenderItems(true);
+      }
 
       isRenderListAdded = true;
     }
@@ -589,6 +593,10 @@ void RenderInstructionProcessor::Prepare(BufferIndex                 updateBuffe
         // Clipping hierarchy is irrelevant when sorting overlay items, so we specify using the non-clipping version of the sort comparitor.
         SortRenderItems(updateBufferIndex, *renderList, layer, false, isOrthographicCamera);
       }
+      else
+      {
+        renderList->SetHasColorRenderItems(false);
+      }
 
       isRenderListAdded = true;
     }
index d47185a..8ba1f40 100644 (file)
@@ -281,6 +281,7 @@ struct UpdateManager::Impl
 
   ResetterContainer<PropertyResetterBase> propertyResetters; ///< A container of property resetters
   ResetterContainer<NodeResetter>         nodeResetters;     ///< A container of node resetters
+  ResetterContainer<RendererResetter>     rendererResetters; ///< A container of renderer resetters
 
   OwnerContainer<Animation*>            animations;            ///< A container of owned animations
   OwnerContainer<PropertyNotification*> propertyNotifications; ///< A container of owner property notifications.
@@ -356,7 +357,7 @@ void UpdateManager::InstallRoot(OwnerPointer<Layer>& layer)
   rootLayer->CreateTransform(&mImpl->transformManager);
   rootLayer->SetRoot(true);
 
-  AddNodeResetter(*rootLayer);
+  rootLayer->AddInitializeResetter(*this);
 
   mImpl->scenes.emplace_back(new Impl::SceneInfo(rootLayer));
 }
@@ -408,7 +409,7 @@ void UpdateManager::ConnectNode(Node* parent, Node* node)
 
   parent->ConnectChild(node);
 
-  AddNodeResetter(*node);
+  node->AddInitializeResetter(*this);
 
   // Inform the frame-callback-processor, if set, about the node-hierarchy changing
   if(mImpl->frameCallbackProcessor)
@@ -501,7 +502,7 @@ void UpdateManager::RemoveObject(PropertyOwner* object)
 void UpdateManager::AddRenderTaskList(OwnerPointer<RenderTaskList>& taskList)
 {
   RenderTaskList* taskListPointer = taskList.Release();
-  taskListPointer->SetRenderMessageDispatcher(&mImpl->renderMessageDispatcher);
+  taskListPointer->Initialize(*this, mImpl->renderMessageDispatcher);
 
   mImpl->scenes.back()->taskList = taskListPointer;
 }
@@ -613,6 +614,13 @@ void UpdateManager::AddNodeResetter(const Node& node)
   mImpl->nodeResetters.PushBack(nodeResetter.Release());
 }
 
+void UpdateManager::AddRendererResetter(const Renderer& renderer)
+{
+  OwnerPointer<SceneGraph::RendererResetter> rendererResetter = SceneGraph::RendererResetter::New(renderer);
+  rendererResetter->Initialize();
+  mImpl->rendererResetters.PushBack(rendererResetter.Release());
+}
+
 void UpdateManager::AddPropertyNotification(OwnerPointer<PropertyNotification>& propertyNotification)
 {
   mImpl->propertyNotifications.PushBack(propertyNotification.Release());
@@ -663,6 +671,8 @@ void UpdateManager::AddRenderer(const RendererKey& rendererKey)
   DALI_LOG_INFO(gLogFilter, Debug::General, "[%x] AddRenderer\n", renderer);
 
   renderer->ConnectToSceneGraph(*mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex());
+  renderer->AddInitializeResetter(*this);
+
   mImpl->renderers.PushBack(rendererKey);
 }
 
@@ -737,6 +747,9 @@ void UpdateManager::ResetProperties(BufferIndex bufferIndex)
   // Reset node properties
   mImpl->nodeResetters.ResetToBaseValues(bufferIndex);
 
+  // Reset renderer properties
+  mImpl->rendererResetters.ResetToBaseValues(bufferIndex);
+
   // Reset all animating / constrained properties
   mImpl->propertyResetters.ResetToBaseValues(bufferIndex);
 
index aacfe23..908f827 100644 (file)
@@ -36,6 +36,8 @@
 #include <dali/internal/update/animation/scene-graph-animation.h>
 #include <dali/internal/update/common/node-resetter.h>
 #include <dali/internal/update/common/property-resetter.h>
+#include <dali/internal/update/common/renderer-resetter.h>
+#include <dali/internal/update/common/resetter-manager.h>
 #include <dali/internal/update/common/scene-graph-buffers.h>
 #include <dali/internal/update/common/scene-graph-property-notification.h>
 #include <dali/internal/update/common/scene-graph-scene.h>
@@ -97,7 +99,7 @@ class VertexBuffer;
  * It also maintains the lifecycle of nodes and other property owners that are
  * disconnected from the scene graph.
  */
-class UpdateManager : public ShaderSaver
+class UpdateManager : public ShaderSaver, public ResetterManager
 {
 public:
   /**
@@ -242,19 +244,22 @@ public:
    */
   bool IsAnimationRunning() const;
 
+  // ResetterManager
+
+  /**
+   * @copydoc Dali::Internal::SceneGraph::ResetterManager::AddPropertyResetter()
+   */
+  void AddPropertyResetter(OwnerPointer<PropertyResetterBase>& propertyResetter) override;
+
   /**
-   * Add a property resetter. UpdateManager takes ownership of the object.
-   * It will be killed by UpdateManager when the associated animator or
-   * constraint has finished; or the property owner of the property is destroyed.
+   * @copydoc Dali::Internal::SceneGraph::ResetterManager::AddNodeResetter()
    */
-  void AddPropertyResetter(OwnerPointer<PropertyResetterBase>& propertyResetter);
+  void AddNodeResetter(const Node& node) override;
 
   /**
-   * Add a node resetter. UpdateManager takes ownership of the object.
-   * It will be killed by UpdateManager when the node is disconnected from the scene graph;
-   * or when the node is destroyed.
+   * @copydoc Dali::Internal::SceneGraph::ResetterManager::AddRendererResetter()
    */
-  void AddNodeResetter(const Node& node);
+  void AddRendererResetter(const Renderer& renderer) override;
 
   // Property Notification
 
index 5dc2e99..e999b1b 100644 (file)
@@ -25,6 +25,8 @@
 #include <dali/public-api/common/constants.h>
 #include <dali/public-api/common/dali-common.h>
 
+#include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
+
 namespace
 {
 // Memory pool used to allocate new nodes. Memory used by this pool will be released when process dies
@@ -162,6 +164,11 @@ bool Node::IsAnimationPossible() const
   return mIsConnectedToSceneGraph;
 }
 
+void Node::AddInitializeResetter(ResetterManager& manager) const
+{
+  manager.AddNodeResetter(*this);
+}
+
 void Node::ConnectChild(Node* childNode)
 {
   DALI_ASSERT_ALWAYS(this != childNode);
index a99129b..79f16a1 100644 (file)
@@ -58,6 +58,7 @@ namespace SceneGraph
 class Layer;
 class RenderTask;
 class UpdateManager;
+class ResetterManager;
 class Node;
 
 // Flags which require the scene renderable lists to be updated
@@ -906,6 +907,11 @@ public:
   bool IsAnimationPossible() const override;
 
   /**
+   * @copydoc Dali::Internal::SceneGraph::PropertyOwner::AddInitializeResetter
+   */
+  void AddInitializeResetter(ResetterManager& manager) const override;
+
+  /**
    * Called by UpdateManager when the node is added.
    * Creates a new transform component in the transform manager and initialize all the properties
    * related to the transformation
index 4557c4c..f714fb4 100644 (file)
@@ -29,6 +29,9 @@
 #include <dali/public-api/common/dali-common.h>
 #include <dali/public-api/math/math-utils.h>
 
+#include <dali/internal/update/common/property-resetter.h>
+#include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
+
 namespace // unnamed namespace
 {
 const uint32_t UPDATE_COUNT         = 2u; // Update projection or view matrix this many frames after a change
@@ -577,6 +580,19 @@ bool Camera::IsProjectionMatrixAnimated() const
          !mAspectRatio.IsClean();
 }
 
+void Camera::AddInitializeResetter(ResetterManager& manager) const
+{
+  // Call base class initialize resetter
+  Node::AddInitializeResetter(manager);
+
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterFieldOvView      = SceneGraph::BakerResetter::New(*this, mFieldOfView, SceneGraph::BakerResetter::Lifetime::BAKE);
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterOrthographicSize = SceneGraph::BakerResetter::New(*this, mOrthographicSize, SceneGraph::BakerResetter::Lifetime::BAKE);
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterAspectRatio      = SceneGraph::BakerResetter::New(*this, mAspectRatio, SceneGraph::BakerResetter::Lifetime::BAKE);
+  manager.AddPropertyResetter(resetterFieldOvView);
+  manager.AddPropertyResetter(resetterOrthographicSize);
+  manager.AddPropertyResetter(resetterAspectRatio);
+}
+
 uint32_t Camera::UpdateViewMatrix(BufferIndex updateBufferIndex)
 {
   uint32_t retval(mUpdateViewFlag);
index e779f49..016c809 100644 (file)
@@ -334,6 +334,12 @@ public:
    */
   bool IsProjectionMatrixAnimated() const;
 
+public:
+  /**
+   * @copydoc Dali::Internal::SceneGraph::PropertyOwner::AddInitializeResetter
+   */
+  void AddInitializeResetter(ResetterManager& manager) const override;
+
 private:
   /**
    * Constructor
index 080e2f0..ead6010 100644 (file)
@@ -20,6 +20,7 @@
 
 // INTERNAL INCLUDES
 #include <dali/internal/common/memory-pool-object-allocator.h>
+#include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
 
 namespace //Unnamed namespace
 {
@@ -56,9 +57,10 @@ void RenderTaskList::operator delete(void* ptr)
   GetRenderTaskListMemoryPool().FreeThreadSafe(static_cast<RenderTaskList*>(ptr));
 }
 
-void RenderTaskList::SetRenderMessageDispatcher(RenderMessageDispatcher* renderMessageDispatcher)
+void RenderTaskList::Initialize(ResetterManager& resetterManager, RenderMessageDispatcher& renderMessageDispatcher)
 {
-  mRenderMessageDispatcher = renderMessageDispatcher;
+  mResetterManager         = &resetterManager;
+  mRenderMessageDispatcher = &renderMessageDispatcher;
 }
 
 void RenderTaskList::AddTask(OwnerPointer<RenderTask>& newTask)
@@ -66,7 +68,7 @@ void RenderTaskList::AddTask(OwnerPointer<RenderTask>& newTask)
   DALI_ASSERT_DEBUG(newTask && "SceneGraph RenderTask is null");
   DALI_ASSERT_DEBUG(mRenderMessageDispatcher != NULL && "RenderMessageDispatcher is null");
 
-  newTask->Initialize(*mRenderMessageDispatcher);
+  newTask->Initialize(*mResetterManager, *mRenderMessageDispatcher);
 
   if(mOverlayRenderTask && mRenderTasks[mRenderTasks.Size() - 1] == mOverlayRenderTask)
   {
index 625cead..dd78e0c 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_RENDER_TASK_LIST_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -34,6 +34,7 @@ namespace SceneGraph
 {
 class RenderMessageDispatcher;
 class RenderTask;
+class ResetterManager;
 
 /**
  * An ordered list of render-tasks.
@@ -61,10 +62,11 @@ public:
   void operator delete(void* ptr);
 
   /**
-   * Set the renderMessageDispatcher to send message.
+   * Set the resetterManager and renderMessageDispatcher to send message.
+   * @param[in] resetterManager to send resetter
    * @param[in] renderMessageDispatcher The renderMessageDispatcher to send messages.
    */
-  void SetRenderMessageDispatcher(RenderMessageDispatcher* renderMessageDispatcher);
+  void Initialize(ResetterManager& resetterManager, RenderMessageDispatcher& renderMessageDispatcher);
 
   /**
    * Add a new RenderTask to the list.
@@ -133,6 +135,7 @@ private:
 
 private:
   CompleteNotificationInterface* mNotificationObject;      ///< object to pass in to the complete notification
+  ResetterManager*               mResetterManager;         ///< for sending bake resetter if rendertask initalized
   RenderMessageDispatcher*       mRenderMessageDispatcher; ///< for sending messages to render thread
   RenderTaskContainer            mRenderTasks;             ///< A container of owned RenderTasks
   RenderTask*                    mOverlayRenderTask;       ///< OverlayRenderTask.
index d49af14..1d1027e 100644 (file)
@@ -25,6 +25,9 @@
 #include <dali/internal/update/nodes/node.h>
 #include <dali/public-api/math/matrix.h>
 
+#include <dali/internal/update/common/property-resetter.h>
+#include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
+
 #include <dali/internal/update/render-tasks/scene-graph-render-task-debug.h>
 
 namespace Dali
@@ -58,8 +61,9 @@ RenderTask::~RenderTask()
   }
 }
 
-void RenderTask::Initialize(RenderMessageDispatcher& renderMessageDispatcher)
+void RenderTask::Initialize(ResetterManager& resetterManager, RenderMessageDispatcher& renderMessageDispatcher)
 {
+  mResetterManager         = &resetterManager;
   mRenderMessageDispatcher = &renderMessageDispatcher;
 }
 
@@ -475,10 +479,21 @@ void RenderTask::PropertyOwnerDestroyed(PropertyOwner& owner)
   }
 }
 
+void RenderTask::AddInitializeResetter(ResetterManager& manager) const
+{
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterViewportPosition = SceneGraph::BakerResetter::New(*this, mViewportPosition, SceneGraph::BakerResetter::Lifetime::BAKE);
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterViewportSize     = SceneGraph::BakerResetter::New(*this, mViewportSize, SceneGraph::BakerResetter::Lifetime::BAKE);
+  OwnerPointer<SceneGraph::PropertyResetterBase> resetterClearColor       = SceneGraph::BakerResetter::New(*this, mClearColor, SceneGraph::BakerResetter::Lifetime::BAKE);
+  manager.AddPropertyResetter(resetterViewportPosition);
+  manager.AddPropertyResetter(resetterViewportSize);
+  manager.AddPropertyResetter(resetterClearColor);
+}
+
 RenderTask::RenderTask()
 : mViewportPosition(Vector2::ZERO),
   mViewportSize(Vector2::ZERO),
   mClearColor(Dali::RenderTask::DEFAULT_CLEAR_COLOR),
+  mResetterManager(nullptr),
   mRenderMessageDispatcher(nullptr),
   mRenderSyncTracker(nullptr),
   mSourceNode(nullptr),
@@ -504,11 +519,19 @@ RenderTask::RenderTask()
 
 void RenderTask::SetActiveStatus()
 {
+  bool oldActive = mActive;
+
   // must have a source and camera both connected to scene
   mActive = (mSourceNode && mSourceNode->ConnectedToScene() &&
              mCameraNode && mCameraNode->ConnectedToScene() && mCamera);
   TASK_LOG_FMT(Debug::General, " Source node(%x) active %d.  Frame counter: %d\n", mSourceNode, mSourceNode && mSourceNode->ConnectedToScene(), mFrameCounter);
   TASK_LOG_FMT(Debug::General, " Camera node(%x) active %d\n", mCameraNode, mCameraNode && mCameraNode->ConnectedToScene());
+
+  if(!oldActive && mActive)
+  {
+    // Send resetter only if newly activated
+    AddInitializeResetter(*mResetterManager);
+  }
 }
 
 } // namespace SceneGraph
index 13947f8..d244882 100644 (file)
@@ -41,6 +41,7 @@ class Node;
 class Camera;
 class RenderInstruction;
 class RenderMessageDispatcher;
+class ResetterManager;
 
 /**
  * RenderTasks describe how the Dali scene should be rendered.
@@ -68,9 +69,10 @@ public:
 
   /**
    * Initialize the render task. Called in update thread
+   * @param[in] resetterManager to send resetter
    * @param[in] renderMessageDispatcher to send messages to render thread
    */
-  void Initialize(RenderMessageDispatcher& renderMessageDispatcher);
+  void Initialize(ResetterManager& resetterManager, RenderMessageDispatcher& renderMessageDispatcher);
 
   /**
    * Set the nodes to be rendered.
@@ -367,6 +369,12 @@ private: // from PropertyOwner::Observer
    */
   void PropertyOwnerDestroyed(PropertyOwner& owner) override;
 
+public:
+  /**
+   * @copydoc Dali::Internal::SceneGraph::PropertyOwner::AddInitializeResetter
+   */
+  void AddInitializeResetter(ResetterManager& manager) const override;
+
 private:
   void SetActiveStatus();
 
@@ -385,6 +393,7 @@ public:                                          // Animatable Properties
   AnimatableProperty<Vector4> mClearColor;       ///< clearColor
 
 private:
+  ResetterManager*         mResetterManager;
   RenderMessageDispatcher* mRenderMessageDispatcher;
   Render::RenderTracker*   mRenderSyncTracker;
   Node*                    mSourceNode;
index 1b666a4..3916e37 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 // CLASS HEADER
-#include "scene-graph-renderer.h"
+#include <dali/internal/update/rendering/scene-graph-renderer.h>
 
 // INTERNAL INCLUDES
 #include <dali/internal/common/blending-options.h>
@@ -32,6 +32,9 @@
 #include <dali/internal/update/nodes/node.h>
 #include <dali/internal/update/rendering/scene-graph-texture-set.h>
 
+#include <dali/internal/update/common/property-resetter.h>
+#include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
+
 #include <dali/integration-api/debug.h>
 
 namespace Dali
@@ -758,6 +761,24 @@ void Renderer::ResetDirtyFlag()
   SetUpdated(false);
 }
 
+void Renderer::ResetToBaseValues(BufferIndex updateBufferIndex)
+{
+  mOpacity.ResetToBaseValue(updateBufferIndex);
+  if(mVisualProperties)
+  {
+    mVisualProperties->ResetToBaseValues(updateBufferIndex);
+  }
+}
+
+void Renderer::MarkAsDirty()
+{
+  mOpacity.MarkAsDirty();
+  if(mVisualProperties)
+  {
+    mVisualProperties->MarkAsDirty();
+  }
+}
+
 uint32_t Renderer::GetMemoryPoolCapacity()
 {
   return GetRendererMemoryPool().GetCapacity();
@@ -769,6 +790,11 @@ void Renderer::OnMappingChanged()
   mRegenerateUniformMap = true; // Should remain true until this renderer is added to a RenderList.
 }
 
+void Renderer::AddInitializeResetter(ResetterManager& manager) const
+{
+  manager.AddRendererResetter(*this);
+}
+
 const CollectedUniformMap& Renderer::GetCollectedUniformMap() const
 {
   return mCollectedUniformMap;
index 153ff85..a1787aa 100644 (file)
@@ -476,6 +476,18 @@ public:
   void ResetDirtyFlag();
 
   /**
+   * @brief Reset to base values of all animatable properties.
+   *
+   * @param[in] updateBufferIndex the current buffer index
+   */
+  void ResetToBaseValues(BufferIndex updateBufferIndex);
+
+  /**
+   * @brief Mark all animatable properties as dirty.
+   */
+  void MarkAsDirty();
+
+  /**
    * Get the capacity of the memory pools
    * @return the capacity of the memory pools
    */
@@ -493,6 +505,11 @@ public: // PropertyOwner implementation
    */
   virtual void ResetDefaultProperties(BufferIndex updateBufferIndex){};
 
+  /**
+   * @copydoc Dali::Internal::SceneGraph::PropertyOwner::AddInitializeResetter
+   */
+  void AddInitializeResetter(ResetterManager& manager) const override;
+
 public: // From UniformMapDataProvider
   /**
    * @copydoc UniformMapDataProvider::GetCollectedUniformMap
diff --git a/dali/internal/update/rendering/scene-graph-visual-renderer.cpp b/dali/internal/update/rendering/scene-graph-visual-renderer.cpp
new file mode 100644 (file)
index 0000000..234edd9
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// CLASS HEADER
+#include <dali/internal/update/rendering/scene-graph-visual-renderer.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/update/common/property-resetter.h>
+#include <dali/internal/update/rendering/scene-graph-renderer.h>
+
+namespace Dali::Internal::SceneGraph::VisualRenderer
+{
+void AnimatableVisualProperties::ResetToBaseValues(BufferIndex updateBufferIndex)
+{
+  mTransformOffset.ResetToBaseValue(updateBufferIndex);
+  mTransformSize.ResetToBaseValue(updateBufferIndex);
+  mTransformOrigin.ResetToBaseValue(updateBufferIndex);
+  mTransformAnchorPoint.ResetToBaseValue(updateBufferIndex);
+  mTransformOffsetSizeMode.ResetToBaseValue(updateBufferIndex);
+  mExtraSize.ResetToBaseValue(updateBufferIndex);
+  mMixColor.ResetToBaseValue(updateBufferIndex);
+  mPreMultipliedAlpha.ResetToBaseValue(updateBufferIndex);
+  if(mExtendedProperties)
+  {
+    auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
+    decoratedVisualProperties->ResetToBaseValues(updateBufferIndex);
+  }
+}
+
+void AnimatableVisualProperties::MarkAsDirty()
+{
+  mTransformOffset.MarkAsDirty();
+  mTransformSize.MarkAsDirty();
+  mTransformOrigin.MarkAsDirty();
+  mTransformAnchorPoint.MarkAsDirty();
+  mTransformOffsetSizeMode.MarkAsDirty();
+  mExtraSize.MarkAsDirty();
+  mMixColor.MarkAsDirty();
+  mPreMultipliedAlpha.MarkAsDirty();
+  if(mExtendedProperties)
+  {
+    auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
+    decoratedVisualProperties->MarkAsDirty();
+  }
+}
+
+void AnimatableDecoratedVisualProperties::ResetToBaseValues(BufferIndex updateBufferIndex)
+{
+  mCornerRadius.ResetToBaseValue(updateBufferIndex);
+  mCornerRadiusPolicy.ResetToBaseValue(updateBufferIndex);
+  mBorderlineWidth.ResetToBaseValue(updateBufferIndex);
+  mBorderlineColor.ResetToBaseValue(updateBufferIndex);
+  mBorderlineOffset.ResetToBaseValue(updateBufferIndex);
+  mBlurRadius.ResetToBaseValue(updateBufferIndex);
+}
+
+void AnimatableDecoratedVisualProperties::MarkAsDirty()
+{
+  mCornerRadius.MarkAsDirty();
+  mCornerRadiusPolicy.MarkAsDirty();
+  mBorderlineWidth.MarkAsDirty();
+  mBorderlineColor.MarkAsDirty();
+  mBorderlineOffset.MarkAsDirty();
+  mBlurRadius.MarkAsDirty();
+}
+
+} // namespace Dali::Internal::SceneGraph::VisualRenderer
\ No newline at end of file
index 610aee0..888131f 100644 (file)
@@ -49,6 +49,18 @@ struct AnimatableVisualProperties
     }
   }
 
+public: // Public API
+  /**
+   * @copydoc Dali::Internal::SceneGraph::Renderer::ResetToBaseValues
+   */
+  void ResetToBaseValues(BufferIndex updateBufferIndex);
+
+  /**
+   * @copydoc Dali::Internal::SceneGraph::Renderer::MarkAsDirty
+   */
+  void MarkAsDirty();
+
+public:
   /**
    * @brief Cached coefficient value when we calculate visual transformed update size.
    * It can reduce complexity of calculate the vertex position.
@@ -110,6 +122,7 @@ struct AnimatableDecoratedVisualProperties
   {
   }
 
+public: // Public API
   // Delete function of AnimatableDecoratedVisualProperties* converted as void*
   static void DeleteFunction(void* data)
   {
@@ -117,6 +130,17 @@ struct AnimatableDecoratedVisualProperties
   }
 
   /**
+   * @copydoc Dali::Internal::SceneGraph::Renderer::ResetToBaseValues
+   */
+  void ResetToBaseValues(BufferIndex updateBufferIndex);
+
+  /**
+   * @copydoc Dali::Internal::SceneGraph::Renderer::MarkAsDirty
+   */
+  void MarkAsDirty();
+
+public:
+  /**
    * @brief Cached coefficient value when we calculate visual transformed update size.
    * It can reduce complexity of calculate the vertex position.
    *