To Caching UniformMap per node/renderer/program triple. 77/296077/7
authorseungho baek <sbsh.baek@samsung.com>
Wed, 19 Jul 2023 08:30:46 +0000 (17:30 +0900)
committerseunghobaek <sbsh.baek@samsung.com>
Mon, 31 Jul 2023 10:13:16 +0000 (19:13 +0900)
Change-Id: I67dee410688be3f5e0e7e2911fdaa89b66354938
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/renderers/render-renderer.h

index 60f3a53..06d8b68 100644 (file)
@@ -696,11 +696,12 @@ std::size_t Renderer::BuildUniformIndexMap(BufferIndex bufferIndex, const SceneG
   // Specially, if node don't have uniformMap, we mark nodePtr as nullptr.
   // So, all nodes without uniformMap will share same UniformIndexMap, contains only render data providers.
   const auto nodePtr = uniformMapNode.Count() ? &node : nullptr;
+  const auto programPtr = &program;
 
   const auto nodeChangeCounter          = nodePtr ? uniformMapNode.GetChangeCounter() : 0;
   const auto renderItemMapChangeCounter = uniformMap.GetChangeCounter();
 
-  auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [nodePtr](RenderItemLookup& element) { return element.node == nodePtr; });
+  auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [nodePtr, programPtr](RenderItemLookup& element) { return (element.node == nodePtr && element.program == programPtr); });
 
   std::size_t renderItemMapIndex;
   if(iter == mNodeIndexMap.end())
@@ -708,6 +709,7 @@ std::size_t Renderer::BuildUniformIndexMap(BufferIndex bufferIndex, const SceneG
     renderItemMapIndex = mUniformIndexMaps.size();
     RenderItemLookup renderItemLookup;
     renderItemLookup.node                       = nodePtr;
+    renderItemLookup.program                    = programPtr;
     renderItemLookup.index                      = renderItemMapIndex;
     renderItemLookup.nodeChangeCounter          = nodeChangeCounter;
     renderItemLookup.renderItemMapChangeCounter = renderItemMapChangeCounter;
@@ -1017,8 +1019,7 @@ void Renderer::DetachFromNodeDataProvider(const SceneGraph::NodeDataProvider& no
 
   // Remove mNodeIndexMap and mUniformIndexMaps.
   auto iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [&node](RenderItemLookup& element) { return element.node == &node; });
-
-  if(iter != mNodeIndexMap.end())
+  while(iter != mNodeIndexMap.end())
   {
     // Swap between end of mUniformIndexMaps and removed.
     auto nodeIndex           = iter->index;
@@ -1043,6 +1044,8 @@ void Renderer::DetachFromNodeDataProvider(const SceneGraph::NodeDataProvider& no
 
     // Remove uniform index maps.
     mUniformIndexMaps.pop_back();
+
+    iter = std::find_if(mNodeIndexMap.begin(), mNodeIndexMap.end(), [&node](RenderItemLookup& element) { return element.node == &node; });
   }
 }
 
index a348bb4..c12d253 100644 (file)
@@ -657,7 +657,8 @@ private:
   /** Struct to map node to index into mNodeMapCounters and mUniformIndexMaps */
   struct RenderItemLookup
   {
-    const SceneGraph::NodeDataProvider* node{nullptr}; ///<Node key. It can be nullptr if this NodeIndex don't need node uniform
+    const SceneGraph::NodeDataProvider* node{nullptr};    ///< Node key. It can be nullptr if this NodeIndex don't need node uniform
+    const Program*                      program{nullptr}; ///< Program key.
 
     std::size_t index{0};                       ///<Index into mUniformIndexMap
     std::size_t nodeChangeCounter{0};           ///<The last known change counter for this node's uniform map