Add updated texture list to RenderManager 09/289909/3
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 15 Mar 2023 09:00:54 +0000 (18:00 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 24 Mar 2023 04:57:32 +0000 (13:57 +0900)
Then we don't need to iterate all textures in PostRender

Change-Id: I4dbe227941505da4d1f38c4a7745f090797f86f1

dali/internal/render/common/render-manager.cpp
dali/internal/render/common/render-manager.h
dali/internal/update/controllers/render-message-dispatcher.cpp
dali/internal/update/controllers/render-message-dispatcher.h
dali/internal/update/manager/update-manager.cpp
dali/internal/update/rendering/scene-graph-texture-set.cpp
dali/internal/update/rendering/scene-graph-texture-set.h

index 4f8e236..9a895fc 100644 (file)
@@ -177,6 +177,7 @@ struct RenderManager::Impl
   std::unique_ptr<Dali::ThreadPool> threadPool;            ///< The thread pool
   Vector<Graphics::Texture*>        boundTextures;         ///< The textures bound for rendering
   Vector<Graphics::Texture*>        textureDependencyList; ///< The dependency list of bound textures
+  Vector<Render::TextureKey>        updatedTextures{};     ///< The updated texture list
 
   uint32_t    frameCount{0u};                                                    ///< The current frame count
   BufferIndex renderBufferIndex{SceneGraphBuffers::INITIAL_UPDATE_BUFFER_INDEX}; ///< The index of the buffer to read from; this is opposite of the "update" buffer
@@ -247,6 +248,7 @@ void RenderManager::AddTexture(const Render::TextureKey& textureKey)
 
   textureKey->Initialize(mImpl->graphicsController);
   mImpl->textureContainer.PushBack(textureKey);
+  mImpl->updatedTextures.PushBack(textureKey);
 }
 
 void RenderManager::RemoveTexture(const Render::TextureKey& textureKey)
@@ -267,12 +269,24 @@ void RenderManager::UploadTexture(const Render::TextureKey& textureKey, PixelDat
 {
   DALI_ASSERT_DEBUG(textureKey && "Trying to upload to empty texture key");
   textureKey->Upload(pixelData, params);
+
+  mImpl->updatedTextures.PushBack(textureKey);
 }
 
 void RenderManager::GenerateMipmaps(const Render::TextureKey& textureKey)
 {
   DALI_ASSERT_DEBUG(textureKey && "Trying to generate mipmaps on empty texture key");
   textureKey->GenerateMipmaps();
+
+  mImpl->updatedTextures.PushBack(textureKey);
+}
+
+void RenderManager::SetTextureUpdated(const Render::TextureKey& textureKey)
+{
+  DALI_ASSERT_DEBUG(textureKey && "Trying to set updated on empty texture key");
+  textureKey->SetUpdated(true);
+
+  mImpl->updatedTextures.PushBack(textureKey);
 }
 
 void RenderManager::SetFilterMode(Render::Sampler* sampler, uint32_t minFilterMode, uint32_t magFilterMode)
@@ -999,11 +1013,12 @@ void RenderManager::PostRender()
     iter->OnRenderFinished();
   }
 
-  // Notify RenderTexture that rendering has finished
-  for(auto&& iter : mImpl->textureContainer)
+  // Notify updated RenderTexture that rendering has finished
+  for(auto&& iter : mImpl->updatedTextures)
   {
     iter->OnRenderFinished();
   }
+  mImpl->updatedTextures.Clear();
 
   mImpl->UpdateTrackers();
 
index cf40117..6bd9a3d 100644 (file)
@@ -254,6 +254,12 @@ public:
   void GenerateMipmaps(const Render::TextureKey& texture);
 
   /**
+   * Sets the updated flag of a texture
+   * @param[in] texture The updated texture
+   */
+  void SetTextureUpdated(const Render::TextureKey& textureKey);
+
+  /**
    * Adds a framebuffer to the render manager
    * @param[in] frameBuffer The framebuffer to add
    */
index c0d7b20..df1fa69 100644 (file)
@@ -84,6 +84,16 @@ void RenderMessageDispatcher::RemoveRenderTracker(Render::RenderTracker& renderT
   new(slot) DerivedType(&mRenderManager, &RenderManager::RemoveRenderTracker, &renderTracker);
 }
 
+RenderManager& RenderMessageDispatcher::GetRenderManager()
+{
+  return mRenderManager;
+}
+
+uint32_t* RenderMessageDispatcher::ReserveMessageSlot(std::size_t size)
+{
+  return mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), size);
+}
+
 } // namespace SceneGraph
 
 } // namespace Internal
index 59a6e81..4242c13 100644 (file)
@@ -82,6 +82,19 @@ public:
    */
   void RemoveRenderTracker(Render::RenderTracker& renderTracker);
 
+  /**
+   * Return the render manager.
+   * @return A reference to the render manager.
+   */
+  RenderManager& GetRenderManager();
+
+  /**
+   * Reserve space for another message in the queue.
+   * @param[in] size The message size with respect to the size of type "char".
+   * @return A pointer to the first char allocated for the message.
+   */
+  uint32_t* ReserveMessageSlot(std::size_t size);
+
 private:
   RenderManager& mRenderManager;
   RenderQueue&   mRenderQueue;
index d47185a..5092309 100644 (file)
@@ -691,6 +691,7 @@ void UpdateManager::SetPanGestureProcessor(PanGesture* panGestureProcessor)
 
 void UpdateManager::AddTextureSet(OwnerPointer<TextureSet>& textureSet)
 {
+  textureSet->SetRenderMessageDispatcher(&mImpl->renderMessageDispatcher);
   mImpl->textureSets.PushBack(textureSet.Release());
 }
 
index 106b711..338c335 100644 (file)
@@ -20,7 +20,9 @@
 // INTERNAL HEADERS
 #include <dali/internal/common/internal-constants.h>
 #include <dali/internal/common/memory-pool-object-allocator.h>
+#include <dali/internal/render/common/render-manager.h>
 #include <dali/internal/render/renderers/render-texture.h>
+#include <dali/internal/update/controllers/render-message-dispatcher.h>
 #include <dali/internal/update/rendering/scene-graph-renderer.h>
 
 namespace //Unnamed namespace
@@ -75,7 +77,14 @@ void TextureSet::SetSampler(uint32_t index, Render::Sampler* sampler)
 
   if(index < static_cast<uint32_t>(mTextures.Size()))
   {
-    mTextures[index]->SetUpdated(true);
+    // Send a message to the RenderManagerReserveMessageSlot
+    using DerivedType = MessageValue1<RenderManager, Render::TextureKey>;
+
+    // Reserve some memory inside the render queue
+    uint32_t* slot = mRenderMessageDispatcher->ReserveMessageSlot(sizeof(DerivedType));
+
+    // Construct message in the render queue memory; note that delete should not be called on the return value
+    new(slot) DerivedType(&mRenderMessageDispatcher->GetRenderManager(), &RenderManager::SetTextureUpdated, mTextures[index]);
   }
 }
 
@@ -108,7 +117,15 @@ void TextureSet::SetTexture(uint32_t index, const Render::TextureKey& texture)
   if(texture)
   {
     mHasAlpha |= texture->HasAlphaChannel();
-    texture->SetUpdated(true);
+
+    // Send a message to the RenderManagerReserveMessageSlot
+    using DerivedType = MessageValue1<RenderManager, Render::TextureKey>;
+
+    // Reserve some memory inside the render queue
+    uint32_t* slot = mRenderMessageDispatcher->ReserveMessageSlot(sizeof(DerivedType));
+
+    // Construct message in the render queue memory; note that delete should not be called on the return value
+    new(slot) DerivedType(&mRenderMessageDispatcher->GetRenderManager(), &RenderManager::SetTextureUpdated, texture);
   }
 }
 
@@ -117,6 +134,11 @@ bool TextureSet::HasAlpha() const
   return mHasAlpha;
 }
 
+void TextureSet::SetRenderMessageDispatcher(RenderMessageDispatcher* renderMessageDispatcher)
+{
+  mRenderMessageDispatcher = renderMessageDispatcher;
+}
+
 uint32_t TextureSet::GetMemoryPoolCapacity()
 {
   return GetTextureSetMemoryPool().GetCapacity();
index 8f58ce2..25336fd 100644 (file)
@@ -37,6 +37,7 @@ class Texture;
 namespace SceneGraph
 {
 class Renderer;
+class RenderMessageDispatcher;
 
 class TextureSet
 {
@@ -94,6 +95,12 @@ public:
   }
 
   /**
+   * Set the renderMessageDispatcher to send message.
+   * @param[in] renderMessageDispatcher The renderMessageDispatcher to send messages.
+   */
+  void SetRenderMessageDispatcher(RenderMessageDispatcher* renderMessageDispatcher);
+
+  /**
    * Get the capacity of the memory pools
    * @return the capacity of the memory pools
    */
@@ -106,9 +113,10 @@ private:
   TextureSet();
 
 private:
-  Vector<Render::Sampler*>   mSamplers; ///< List of samplers used by each texture. Not owned
-  Vector<Render::TextureKey> mTextures; ///< List of Textures. Not owned
-  bool                       mHasAlpha; ///< if any of the textures has an alpha channel
+  Vector<Render::Sampler*>   mSamplers;                         ///< List of samplers used by each texture. Not owned
+  Vector<Render::TextureKey> mTextures;                         ///< List of Textures. Not owned
+  RenderMessageDispatcher*   mRenderMessageDispatcher{nullptr}; ///< for sending messages to render thread. Not owned
+  bool                       mHasAlpha;                         ///< if any of the textures has an alpha channel
 };
 
 inline void SetTextureMessage(EventThreadServices& eventThreadServices, const TextureSet& textureSet, uint32_t index, const Render::TextureKey& textureKey)