From fcad00af9e151ec04ee3d1bcc62d688ed06563e8 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Wed, 15 Mar 2023 18:00:54 +0900 Subject: [PATCH] Add updated texture list to RenderManager Then we don't need to iterate all textures in PostRender Change-Id: I4dbe227941505da4d1f38c4a7745f090797f86f1 --- dali/internal/render/common/render-manager.cpp | 19 ++++++++++++++-- dali/internal/render/common/render-manager.h | 6 +++++ .../controllers/render-message-dispatcher.cpp | 10 +++++++++ .../update/controllers/render-message-dispatcher.h | 13 +++++++++++ dali/internal/update/manager/update-manager.cpp | 1 + .../update/rendering/scene-graph-texture-set.cpp | 26 ++++++++++++++++++++-- .../update/rendering/scene-graph-texture-set.h | 14 +++++++++--- 7 files changed, 82 insertions(+), 7 deletions(-) diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index 4f8e236..9a895fc 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -177,6 +177,7 @@ struct RenderManager::Impl std::unique_ptr threadPool; ///< The thread pool Vector boundTextures; ///< The textures bound for rendering Vector textureDependencyList; ///< The dependency list of bound textures + Vector 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(); diff --git a/dali/internal/render/common/render-manager.h b/dali/internal/render/common/render-manager.h index cf40117..6bd9a3d 100644 --- a/dali/internal/render/common/render-manager.h +++ b/dali/internal/render/common/render-manager.h @@ -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 */ diff --git a/dali/internal/update/controllers/render-message-dispatcher.cpp b/dali/internal/update/controllers/render-message-dispatcher.cpp index c0d7b20..df1fa69 100644 --- a/dali/internal/update/controllers/render-message-dispatcher.cpp +++ b/dali/internal/update/controllers/render-message-dispatcher.cpp @@ -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 diff --git a/dali/internal/update/controllers/render-message-dispatcher.h b/dali/internal/update/controllers/render-message-dispatcher.h index 59a6e81..4242c13 100644 --- a/dali/internal/update/controllers/render-message-dispatcher.h +++ b/dali/internal/update/controllers/render-message-dispatcher.h @@ -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; diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index d47185a..5092309 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -691,6 +691,7 @@ void UpdateManager::SetPanGestureProcessor(PanGesture* panGestureProcessor) void UpdateManager::AddTextureSet(OwnerPointer& textureSet) { + textureSet->SetRenderMessageDispatcher(&mImpl->renderMessageDispatcher); mImpl->textureSets.PushBack(textureSet.Release()); } diff --git a/dali/internal/update/rendering/scene-graph-texture-set.cpp b/dali/internal/update/rendering/scene-graph-texture-set.cpp index 106b711..338c335 100644 --- a/dali/internal/update/rendering/scene-graph-texture-set.cpp +++ b/dali/internal/update/rendering/scene-graph-texture-set.cpp @@ -20,7 +20,9 @@ // INTERNAL HEADERS #include #include +#include #include +#include #include namespace //Unnamed namespace @@ -75,7 +77,14 @@ void TextureSet::SetSampler(uint32_t index, Render::Sampler* sampler) if(index < static_cast(mTextures.Size())) { - mTextures[index]->SetUpdated(true); + // Send a message to the RenderManagerReserveMessageSlot + using DerivedType = MessageValue1; + + // 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; + + // 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(); diff --git a/dali/internal/update/rendering/scene-graph-texture-set.h b/dali/internal/update/rendering/scene-graph-texture-set.h index 8f58ce2..25336fd 100644 --- a/dali/internal/update/rendering/scene-graph-texture-set.h +++ b/dali/internal/update/rendering/scene-graph-texture-set.h @@ -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 mSamplers; ///< List of samplers used by each texture. Not owned - Vector mTextures; ///< List of Textures. Not owned - bool mHasAlpha; ///< if any of the textures has an alpha channel + Vector mSamplers; ///< List of samplers used by each texture. Not owned + Vector 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) -- 2.7.4