Move mItemsDirtyRects from Scene to SceneGraph::Scene 34/267634/4
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 8 Dec 2021 05:49:56 +0000 (14:49 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Thu, 16 Dec 2021 00:43:02 +0000 (09:43 +0900)
The list is used in the update thread. So move it to SceneGraph::Scene

Change-Id: Ic3b374d2e3840c05d72ed8b55697db4e5eef1f13

automated-tests/src/dali/utc-Dali-Actor.cpp
dali/internal/event/common/scene-impl.cpp
dali/internal/event/common/scene-impl.h
dali/internal/render/common/render-manager.cpp
dali/internal/update/common/scene-graph-scene.cpp
dali/internal/update/common/scene-graph-scene.h

index b9f8dba..5293137 100644 (file)
@@ -8595,6 +8595,31 @@ int utcDaliActorPartialUpdateTwoActors(void)
   DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
   DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
 
+  // Change a Renderer of actor1
+  Geometry geometry    = CreateQuadGeometry();
+  Shader   shader      = CreateShader();
+  Renderer newRenderer = Renderer::New(geometry, shader);
+  Renderer renderer    = actor.GetRendererAt(0);
+
+  actor.RemoveRenderer(renderer);
+  actor.AddRenderer(newRenderer);
+
+  damagedRects.clear();
+
+  application.SendNotification();
+  application.PreRenderWithPartialUpdate(TestApplication::DEFAULT_RENDER_INTERVAL, nullptr, damagedRects);
+
+  DALI_TEST_CHECK(damagedRects.size() > 0);
+  DALI_TEST_EQUALS<Rect<int>>(Rect<int>(64, 672, 64, 64), damagedRects[0], TEST_LOCATION);
+
+  // in screen coordinates, adaptor would calculate it using previous frames information
+  application.RenderWithPartialUpdate(damagedRects, clippingRect);
+
+  DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION);
+  DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION);
+  DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION);
+  DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION);
+
   END_TEST;
 }
 
index 7994cdf..ba88152 100644 (file)
@@ -420,11 +420,6 @@ Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
   return mWheelEventSignal;
 }
 
-std::vector<Dali::Internal::SceneGraph::DirtyRect>& Scene::GetItemsDirtyRects()
-{
-  return mItemsDirtyRects;
-}
-
 } // namespace Internal
 
 } // namespace Dali
index 7065c16..34ab1a8 100644 (file)
@@ -38,63 +38,9 @@ struct Event;
 
 namespace Internal
 {
-//@todo Break this dependence somehow.
-namespace Render
-{
-class Renderer;
-}
-
 namespace SceneGraph
 {
 class Scene;
-
-struct DirtyRect
-{
-  DirtyRect(Node* node, Render::Renderer* renderer, int32_t frame, Rect<int>& rect)
-  : node(node),
-    renderer(renderer),
-    frame(frame),
-    rect(rect),
-    visited(true)
-  {
-  }
-
-  DirtyRect()
-  : node(nullptr),
-    renderer(nullptr),
-    frame(0),
-    rect(),
-    visited(true)
-  {
-  }
-
-  bool operator<(const DirtyRect& rhs) const
-  {
-    if(node == rhs.node)
-    {
-      if(renderer == rhs.renderer)
-      {
-        return frame > rhs.frame; // Most recent rects come first
-      }
-      else
-      {
-        return renderer < rhs.renderer;
-      }
-    }
-    else
-    {
-      return node < rhs.node;
-    }
-  }
-
-  Node*             node;
-  Render::Renderer* renderer;
-  int32_t           frame;
-
-  Rect<int32_t> rect;
-  bool          visited;
-};
-
 } // namespace SceneGraph
 
 class EventProcessor;
@@ -351,13 +297,6 @@ public:
    */
   Integration::Scene::WheelEventSignalType& WheelEventSignal();
 
-  /**
-   * @brief Get ItemsDirtyRects
-   *
-   * @return the ItemsDirtyRects
-   */
-  std::vector<Dali::Internal::SceneGraph::DirtyRect>& GetItemsDirtyRects();
-
 public:
   /**
    * From RenderTaskDefaults; retrieve the default root actor.
@@ -436,8 +375,6 @@ private:
 
   // The wheel event signal
   Integration::Scene::WheelEventSignalType mWheelEventSignal;
-
-  std::vector<Dali::Internal::SceneGraph::DirtyRect> mItemsDirtyRects;
 };
 
 } // namespace Internal
index 2d63a0a..3772183 100644 (file)
@@ -519,7 +519,7 @@ void RenderManager::PreRender(Integration::Scene& scene, std::vector<Rect<int>>&
 
   // Mark previous dirty rects in the sorted array. The array is already sorted by node and renderer, frame number.
   // so you don't need to sort: std::stable_sort(itemsDirtyRects.begin(), itemsDirtyRects.end());
-  std::vector<DirtyRect>& itemsDirtyRects = sceneInternal.GetItemsDirtyRects();
+  std::vector<DirtyRect>& itemsDirtyRects = sceneObject->GetItemsDirtyRects();
   for(DirtyRect& dirtyRect : itemsDirtyRects)
   {
     dirtyRect.visited = false;
index 55e94c7..1ad1c93 100644 (file)
@@ -178,10 +178,15 @@ void Scene::SetRotationCompletedAcknowledgement()
 bool Scene::IsRotationCompletedAcknowledgementSet()
 {
   bool setRotationCompletedAcknowledgement = mRotationCompletedAcknowledgement;
-  mRotationCompletedAcknowledgement     = false;
+  mRotationCompletedAcknowledgement        = false;
   return setRotationCompletedAcknowledgement;
 }
 
+std::vector<DirtyRect>& Scene::GetItemsDirtyRects()
+{
+  return mItemsDirtyRects;
+}
+
 } // namespace SceneGraph
 
 } // namespace Internal
index 14bcb08..f1f0f5a 100644 (file)
@@ -30,9 +30,54 @@ namespace Dali
 {
 namespace Internal
 {
+namespace Render
+{
+class Renderer;
+}
+
 namespace SceneGraph
 {
 class RenderInstructionContainer;
+class Node;
+
+struct DirtyRect
+{
+  DirtyRect(Node* node, Render::Renderer* renderer, int32_t frame, Rect<int>& rect)
+  : node(node),
+    renderer(renderer),
+    frame(frame),
+    rect(rect),
+    visited(true)
+  {
+  }
+
+  DirtyRect() = default;
+
+  bool operator<(const DirtyRect& rhs) const
+  {
+    if(node == rhs.node)
+    {
+      if(renderer == rhs.renderer)
+      {
+        return frame > rhs.frame; // Most recent rects come first
+      }
+      else
+      {
+        return renderer < rhs.renderer;
+      }
+    }
+    else
+    {
+      return node < rhs.node;
+    }
+  }
+
+  Node*             node{nullptr};
+  Render::Renderer* renderer{nullptr};
+  int32_t           frame{0};
+  Rect<int32_t>     rect{};
+  bool              visited{true};
+};
 
 class Scene
 {
@@ -213,6 +258,13 @@ public:
     return mClearValues;
   }
 
+  /**
+   * @brief Get ItemsDirtyRects
+   *
+   * @return the ItemsDirtyRects
+   */
+  std::vector<DirtyRect>& GetItemsDirtyRects();
+
 private:
   // Render instructions describe what should be rendered during RenderManager::RenderScene()
   // Update manager updates instructions for the next frame while we render the current one
@@ -224,9 +276,9 @@ private:
 
   bool mSkipRendering; ///< A flag to skip rendering
 
-  Rect<int32_t> mSurfaceRect;        ///< The rectangle of surface which is related ot this scene.
-  int32_t       mSurfaceOrientation; ///< The orientation of surface which is related of this scene
-  bool          mSurfaceRectChanged; ///< The flag of surface's rectangle is changed when is resized, moved or rotated.
+  Rect<int32_t> mSurfaceRect;                      ///< The rectangle of surface which is related ot this scene.
+  int32_t       mSurfaceOrientation;               ///< The orientation of surface which is related of this scene
+  bool          mSurfaceRectChanged;               ///< The flag of surface's rectangle is changed when is resized, moved or rotated.
   bool          mRotationCompletedAcknowledgement; ///< The flag of sending the acknowledgement to complete window rotation.
 
   // Render pass and render target
@@ -240,8 +292,8 @@ private:
   Graphics::UniquePtr<Graphics::RenderPass> mRenderPassNoClear{nullptr}; ///< The render pass created to render the surface without clearing color
   Graphics::RenderTarget*                   mRenderTarget{nullptr};      ///< This is created in the event thread when surface is created/resized/replaced
 
-  // clear colors
-  std::vector<Graphics::ClearValue> mClearValues{};
+  std::vector<Graphics::ClearValue>                  mClearValues{};     ///< Clear colors
+  std::vector<Dali::Internal::SceneGraph::DirtyRect> mItemsDirtyRects{}; ///< Dirty rect list
 };
 
 /// Messages