Skip rendering before the first renderer is added to node 43/256743/2
authorHeeyong Song <heeyong.song@samsung.com>
Mon, 12 Apr 2021 07:33:49 +0000 (16:33 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Mon, 12 Apr 2021 08:16:05 +0000 (17:16 +0900)
Change-Id: Id48c2fe92790ddbdcf926d754b60a6f6e5d8fd7a

automated-tests/src/dali/utc-Dali-Scene.cpp
dali/internal/event/actors/actor-impl.cpp
dali/internal/update/manager/update-manager.cpp
dali/internal/update/manager/update-manager.h
dali/internal/update/nodes/node.h

index 474f278..290d896 100644 (file)
@@ -1426,6 +1426,14 @@ int UtcDaliSceneEmptySceneRendering(void)
   Shader   shader   = CreateShader();
   Renderer renderer = Renderer::New(geometry, shader);
 
+  // Render before adding renderer
+  application.SendNotification();
+  application.Render();
+
+  // Check the clear count and the render status
+  DALI_TEST_EQUALS(glAbstraction.GetClearCountCalled(), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetRenderNeedsPostRender(), false, TEST_LOCATION);
+
   Actor actor = Actor::New();
   actor.AddRenderer(renderer);
 
index d499716..408c273 100644 (file)
@@ -1038,7 +1038,7 @@ uint32_t Actor::AddRenderer(Renderer& renderer)
   uint32_t    index       = static_cast<uint32_t>(mRenderers->size()); //  4,294,967,295 renderers per actor
   RendererPtr rendererPtr = RendererPtr(&renderer);
   mRenderers->push_back(rendererPtr);
-  AttachRendererMessage(GetEventThreadServices(), GetNode(), renderer.GetRendererSceneObject());
+  AttachRendererMessage(GetEventThreadServices().GetUpdateManager(), GetNode(), renderer.GetRendererSceneObject());
   return index;
 }
 
index b082a9c..abad331 100644 (file)
@@ -604,7 +604,6 @@ void UpdateManager::AddRenderer(OwnerPointer<Renderer>& renderer)
 
   renderer->ConnectToSceneGraph(*mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex());
   mImpl->renderers.PushBack(renderer.Release());
-  mImpl->renderersAdded = true;
 }
 
 void UpdateManager::RemoveRenderer(Renderer* renderer)
@@ -617,6 +616,12 @@ void UpdateManager::RemoveRenderer(Renderer* renderer)
   renderer->DisconnectFromSceneGraph(*mImpl->sceneController, mSceneGraphBuffers.GetUpdateBufferIndex());
 }
 
+void UpdateManager::AttachRenderer(Node* node, Renderer* renderer)
+{
+  node->AddRenderer(renderer);
+  mImpl->renderersAdded = true;
+}
+
 void UpdateManager::SetPanGestureProcessor(PanGesture* panGestureProcessor)
 {
   DALI_ASSERT_DEBUG(NULL != panGestureProcessor);
index 29d0e0f..a34cdb6 100644 (file)
@@ -333,6 +333,12 @@ public:
    */
   void RemoveRenderer(Renderer* renderer);
 
+  /**
+   * Attach a renderer to node
+   * @param renderer to attach
+   */
+  void AttachRenderer(Node* node, Renderer* renderer);
+
   // Gestures
 
   /**
@@ -1099,6 +1105,16 @@ inline void RemoveRendererMessage(UpdateManager& manager, const Renderer& object
   new(slot) LocalType(&manager, &UpdateManager::RemoveRenderer, const_cast<Renderer*>(&object));
 }
 
+inline void AttachRendererMessage(UpdateManager& manager, const Node& node, const Renderer& renderer)
+{
+  using LocalType = MessageValue2<UpdateManager, Node*, Renderer*>;
+
+  // Reserve some memory inside the message queue
+  uint32_t* slot = manager.ReserveMessageSlot(sizeof(LocalType));
+  // Construct message in the message queue memory; note that delete should not be called on the return value
+  new(slot) LocalType(&manager, &UpdateManager::AttachRenderer, const_cast<Node*>(&node), const_cast<Renderer*>(&renderer));
+}
+
 // The render thread can safely change the Shader
 inline void AddTextureSetMessage(UpdateManager& manager, OwnerPointer<TextureSet>& textureSet)
 {
index 6026c00..6f6e681 100644 (file)
@@ -1038,17 +1038,6 @@ inline void SetDrawModeMessage(EventThreadServices& eventThreadServices, const N
   new(slot) LocalType(&node, &Node::SetDrawMode, drawMode);
 }
 
-inline void AttachRendererMessage(EventThreadServices& eventThreadServices, const Node& node, const Renderer& renderer)
-{
-  using LocalType = MessageValue1<Node, Renderer*>;
-
-  // Reserve some memory inside the message queue
-  uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
-
-  // Construct message in the message queue memory; note that delete should not be called on the return value
-  new(slot) LocalType(&node, &Node::AddRenderer, const_cast<Renderer*>(&renderer));
-}
-
 inline void DetachRendererMessage(EventThreadServices& eventThreadServices, const Node& node, const Renderer& renderer)
 {
   using LocalType = MessageValue1<Node, const Renderer*>;