Changed Render::Renderer to use MemoryPoolAllocator 78/286778/6
authorDavid Steele <david.steele@samsung.com>
Thu, 12 Jan 2023 18:50:00 +0000 (18:50 +0000)
committerDavid Steele <david.steele@samsung.com>
Fri, 20 Jan 2023 16:46:50 +0000 (16:46 +0000)
Changing the Renderer to use the pool allocator means:
ptrs to the renderer can utilize 32bit key instead of
64bit ptr.

Change-Id: Ibfc625f5f929bc1836ff50ee8b1fa1ebfe5d59ec
Signed-off-by: David Steele <david.steele@samsung.com>
15 files changed:
dali/internal/common/owner-key-container.h
dali/internal/render/common/render-algorithms.cpp
dali/internal/render/common/render-item.cpp
dali/internal/render/common/render-item.h
dali/internal/render/common/render-list.h
dali/internal/render/common/render-manager.cpp
dali/internal/render/common/render-manager.h
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/renderers/render-renderer.h
dali/internal/update/common/scene-graph-scene.h
dali/internal/update/controllers/render-message-dispatcher.cpp
dali/internal/update/controllers/render-message-dispatcher.h
dali/internal/update/manager/render-instruction-processor.cpp
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.h

index 2b61c12..badbaaa 100644 (file)
@@ -143,6 +143,26 @@ public:
   }
 
   /**
+   * Erase an object from OwnerKeyContainer
+   * @param[in] object to remove
+   */
+  inline void EraseKey(MemoryPoolKey<ObjectType> key)
+  {
+    DALI_ASSERT_DEBUG(key && "NULL object not allowed");
+
+    Iterator            iter    = BaseType::Begin();
+    const ConstIterator endIter = BaseType::End();
+    for(; iter != endIter; ++iter)
+    {
+      if(*iter == key)
+      {
+        Erase(iter);
+        return;
+      }
+    }
+  }
+
+  /**
    * Release the ownership of an object, without deleting it.
    * @param[in] position A dereferencable iterator to an element in mContainer.
    * @post iterators are invalidated by this method.
index d5ba85d..152798d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -502,7 +502,7 @@ inline void RenderAlgorithms::SetupClipping(const RenderItem&
                                             int                                 orientation)
 {
   RenderMode::Type renderMode = RenderMode::AUTO;
-  const Renderer*  renderer   = item.mRenderer;
+  RendererKey      renderer   = item.mRenderer;
   if(renderer)
   {
     renderMode = renderer->GetRenderMode();
index 9949611..0197443 100644 (file)
@@ -52,7 +52,7 @@ RenderItem::RenderItem()
 : mModelMatrix(false),
   mModelViewMatrix(false),
   mSize(),
-  mRenderer(nullptr),
+  mRenderer{},
   mNode(nullptr),
   mTextureSet(nullptr),
   mDepthIndex(0),
index cda4331..c13e98d 100644 (file)
@@ -118,16 +118,16 @@ struct RenderItem
    */
   void operator delete(void* ptr);
 
-  Matrix            mModelMatrix;
-  Matrix            mModelViewMatrix;
-  Vector3           mSize;
-  Vector4           mUpdateArea; ///< Update area hint is provided for damaged area calculation. (x, y, width, height)
-  Render::Renderer* mRenderer;
-  Node*             mNode;
-  const void*       mTextureSet; ///< Used for sorting only
-  int               mDepthIndex;
-  bool              mIsOpaque : 1;
-  bool              mIsUpdated : 1;
+  Matrix              mModelMatrix;
+  Matrix              mModelViewMatrix;
+  Vector3             mSize;
+  Vector4             mUpdateArea; ///< Update area hint is provided for damaged area calculation. (x, y, width, height)
+  Render::RendererKey mRenderer;
+  Node*               mNode;
+  const void*         mTextureSet; ///< Used for sorting only
+  int                 mDepthIndex;
+  bool                mIsOpaque : 1;
+  bool                mIsUpdated : 1;
 
   /**
    * Get the capacity of the global pool.
index 720eec1..ebd240a 100644 (file)
@@ -146,10 +146,10 @@ public:
   /**
    * Get renderer from an item in the list
    */
-  const Render::Renderer& GetRenderer(uint32_t index) const
+  Render::RendererKey GetRenderer(uint32_t index) const
   {
     DALI_ASSERT_DEBUG(index < GetCachedItemCount());
-    return *mItems[index]->mRenderer;
+    return mItems[index]->mRenderer;
   }
 
   /**
index 715c3e0..2cd5efc 100644 (file)
@@ -154,12 +154,12 @@ struct RenderManager::Impl
   std::vector<SceneGraph::Scene*> sceneContainer;   ///< List of pointers to the scene graph objects of the scenes
   Render::RenderAlgorithms        renderAlgorithms; ///< The RenderAlgorithms object is used to action the renders required by a RenderInstruction
 
-  OwnerContainer<Render::Renderer*>      rendererContainer;     ///< List of owned renderers
   OwnerContainer<Render::Sampler*>       samplerContainer;      ///< List of owned samplers
   OwnerContainer<Render::FrameBuffer*>   frameBufferContainer;  ///< List of owned framebuffers
   OwnerContainer<Render::VertexBuffer*>  vertexBufferContainer; ///< List of owned vertex buffers
   OwnerContainer<Render::Geometry*>      geometryContainer;     ///< List of owned Geometries
   OwnerContainer<Render::RenderTracker*> mRenderTrackers;       ///< List of render trackers
+  OwnerKeyContainer<Render::Renderer>    rendererContainer;     ///< List of owned renderers
   OwnerKeyContainer<Render::Texture>     textureContainer;      ///< List of owned textures
 
   ProgramController   programController; ///< Owner of the programs
@@ -215,17 +215,17 @@ void RenderManager::SetShaderSaver(ShaderSaver& upstream)
 {
 }
 
-void RenderManager::AddRenderer(OwnerPointer<Render::Renderer>& renderer)
+void RenderManager::AddRenderer(const Render::RendererKey& renderer)
 {
   // Initialize the renderer as we are now in render thread
   renderer->Initialize(mImpl->graphicsController, mImpl->programController, mImpl->shaderCache, *(mImpl->uniformBufferManager.get()), *(mImpl->pipelineCache.get()));
 
-  mImpl->rendererContainer.PushBack(renderer.Release());
+  mImpl->rendererContainer.PushBack(renderer);
 }
 
-void RenderManager::RemoveRenderer(Render::Renderer* renderer)
+void RenderManager::RemoveRenderer(const Render::RendererKey& renderer)
 {
-  mImpl->rendererContainer.EraseObject(renderer);
+  mImpl->rendererContainer.EraseKey(renderer);
 }
 
 void RenderManager::AddSampler(OwnerPointer<Render::Sampler>& sampler)
index 5b49aeb..7f4843f 100644 (file)
@@ -23,6 +23,7 @@
 #include <dali/integration-api/core-enumerations.h>
 #include <dali/internal/common/shader-saver.h>
 #include <dali/internal/event/rendering/texture-impl.h>
+#include <dali/internal/render/renderers/render-renderer.h>
 #include <dali/internal/render/renderers/render-vertex-buffer.h>
 #include <dali/public-api/math/rect.h>
 
@@ -107,16 +108,16 @@ public:
   /**
    * Add a Renderer to the render manager.
    * @param[in] renderer The renderer to add.
-   * @post renderer is owned by RenderManager
+   * @post renderer is notionally owned by RenderManager
    */
-  void AddRenderer(OwnerPointer<Render::Renderer>& renderer);
+  void AddRenderer(const Render::RendererKey& renderer);
 
   /**
    * Remove a Renderer from the render manager.
    * @param[in] renderer The renderer to remove.
    * @post renderer is destroyed.
    */
-  void RemoveRenderer(Render::Renderer* renderer);
+  void RemoveRenderer(const Render::RendererKey& renderer);
 
   /**
    * Add a sampler to the render manager.
index d9a0351..3bea0e5 100644 (file)
@@ -23,6 +23,7 @@
 #include <dali/integration-api/debug.h>
 #include <dali/internal/common/image-sampler.h>
 #include <dali/internal/common/matrix-utils.h>
+#include <dali/internal/common/memory-pool-object-allocator.h>
 #include <dali/internal/event/rendering/texture-impl.h>
 #include <dali/internal/render/common/render-instruction.h>
 #include <dali/internal/render/data-providers/node-data-provider.h>
@@ -149,18 +150,28 @@ inline uint32_t GetUniformBufferDataAlignment(uint32_t dataSize)
 
 namespace Render
 {
-Renderer* Renderer::New(SceneGraph::RenderDataProvider* dataProvider,
-                        Render::Geometry*               geometry,
-                        uint32_t                        blendingBitmask,
-                        const Vector4&                  blendColor,
-                        FaceCullingMode::Type           faceCullingMode,
-                        bool                            preMultipliedAlphaEnabled,
-                        DepthWriteMode::Type            depthWriteMode,
-                        DepthTestMode::Type             depthTestMode,
-                        DepthFunction::Type             depthFunction,
-                        StencilParameters&              stencilParameters)
+namespace
+{
+MemoryPoolObjectAllocator<Renderer> gRenderRendererMemoryPool;
+}
+
+RendererKey Renderer::NewKey(SceneGraph::RenderDataProvider* dataProvider,
+                             Render::Geometry*               geometry,
+                             uint32_t                        blendingBitmask,
+                             const Vector4&                  blendColor,
+                             FaceCullingMode::Type           faceCullingMode,
+                             bool                            preMultipliedAlphaEnabled,
+                             DepthWriteMode::Type            depthWriteMode,
+                             DepthTestMode::Type             depthTestMode,
+                             DepthFunction::Type             depthFunction,
+                             StencilParameters&              stencilParameters)
 {
-  return new Renderer(dataProvider, geometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled, depthWriteMode, depthTestMode, depthFunction, stencilParameters);
+  void* ptr = gRenderRendererMemoryPool.AllocateRawThreadSafe();
+  auto  key = gRenderRendererMemoryPool.GetKeyFromPtr(static_cast<Renderer*>(ptr));
+
+  // Use placement new to construct renderer.
+  new(ptr) Renderer(dataProvider, geometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled, depthWriteMode, depthTestMode, depthFunction, stencilParameters);
+  return RendererKey(key);
 }
 
 Renderer::Renderer(SceneGraph::RenderDataProvider* dataProvider,
@@ -207,10 +218,21 @@ void Renderer::Initialize(Graphics::Controller& graphicsController, ProgramCache
 
 Renderer::~Renderer() = default;
 
+void Renderer::operator delete(void* ptr)
+{
+  gRenderRendererMemoryPool.FreeThreadSafe(static_cast<Renderer*>(ptr));
+}
+
+Renderer* Renderer::Get(RendererKey::KeyType rendererKey)
+{
+  return gRenderRendererMemoryPool.GetPtrFromKey(rendererKey);
+}
+
 void Renderer::SetGeometry(Render::Geometry* geometry)
 {
   mGeometry = geometry;
 }
+
 void Renderer::SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size)
 {
   mDrawCommands.clear();
index 94e34c8..9f25651 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDER_RENDERER_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -59,7 +59,26 @@ struct ShaderCache;
 class PipelineCache;
 class UniformBufferManager;
 class PipelineCache;
+class Renderer;
 
+using RendererKey = MemoryPoolKey<Render::Renderer>;
+} //namespace Render
+} //namespace Internal
+
+// Ensure RendererKey can be used in Dali::Vector
+template<>
+struct TypeTraits<Internal::Render::RendererKey> : public BasicTypes<Internal::Render::RendererKey>
+{
+  enum
+  {
+    IS_TRIVIAL_TYPE = true
+  };
+};
+
+namespace Internal
+{
+namespace Render
+{
 /**
  * Renderers are used to render meshes
  * These objects are used during RenderManager::Render(), so properties modified during
@@ -108,16 +127,16 @@ public:
    * @param[in] depthFunction Depth function
    * @param[in] stencilParameters Struct containing all stencil related options
    */
-  static Renderer* New(SceneGraph::RenderDataProvider* dataProviders,
-                       Render::Geometry*               geometry,
-                       uint32_t                        blendingBitmask,
-                       const Vector4&                  blendColor,
-                       FaceCullingMode::Type           faceCullingMode,
-                       bool                            preMultipliedAlphaEnabled,
-                       DepthWriteMode::Type            depthWriteMode,
-                       DepthTestMode::Type             depthTestMode,
-                       DepthFunction::Type             depthFunction,
-                       StencilParameters&              stencilParameters);
+  static RendererKey NewKey(SceneGraph::RenderDataProvider* dataProviders,
+                            Render::Geometry*               geometry,
+                            uint32_t                        blendingBitmask,
+                            const Vector4&                  blendColor,
+                            FaceCullingMode::Type           faceCullingMode,
+                            bool                            preMultipliedAlphaEnabled,
+                            DepthWriteMode::Type            depthWriteMode,
+                            DepthTestMode::Type             depthTestMode,
+                            DepthFunction::Type             depthFunction,
+                            StencilParameters&              stencilParameters);
 
   /**
    * Constructor.
@@ -144,23 +163,6 @@ public:
            StencilParameters&              stencilParameters);
 
   /**
-   * Change the geometry used by the renderer
-   * @param[in] geometry The new geometry
-   */
-  void SetGeometry(Render::Geometry* geometry);
-
-  void SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size);
-
-  /**
-   * @brief Returns a reference to an array of draw commands
-   * @return Valid array of draw commands (may be empty)
-   */
-  [[nodiscard]] const std::vector<Dali::DevelRenderer::DrawCommand>& GetDrawCommands() const
-  {
-    return mDrawCommands;
-  }
-
-  /**
    * Second-phase construction.
    * This is called when the renderer is inside render thread
    * @param[in] graphicsController The graphics controller to use
@@ -181,6 +183,35 @@ public:
   ~Renderer();
 
   /**
+   * Overriden delete operator
+   * Deletes the renderer from its global memory pool
+   */
+  void operator delete(void* ptr);
+
+  /**
+   * Get a pointer to the object from the given key.
+   * Used by MemoryPoolKey to provide pointer semantics.
+   */
+  static Renderer* Get(RendererKey::KeyType rendererKey);
+
+  /**
+   * Change the geometry used by the renderer
+   * @param[in] geometry The new geometry
+   */
+  void SetGeometry(Render::Geometry* geometry);
+
+  void SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size);
+
+  /**
+   * @brief Returns a reference to an array of draw commands
+   * @return Valid array of draw commands (may be empty)
+   */
+  [[nodiscard]] const std::vector<Dali::DevelRenderer::DrawCommand>& GetDrawCommands() const
+  {
+    return mDrawCommands;
+  }
+
+  /**
    * Set the face-culling mode.
    * @param[in] mode The face-culling mode.
    */
index 8d5339e..057ba16 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_SCENE_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 #include <dali/internal/common/message.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/internal/render/common/render-instruction-container.h>
+#include <dali/internal/render/renderers/render-renderer.h> // RendererKey
 #include <dali/internal/update/nodes/scene-graph-layer.h>
 #include <dali/public-api/common/vector-wrapper.h>
 
@@ -31,11 +32,6 @@ namespace Dali
 {
 namespace Internal
 {
-namespace Render
-{
-class Renderer;
-}
-
 namespace SceneGraph
 {
 class RenderInstructionContainer;
@@ -43,7 +39,7 @@ class Node;
 
 struct DirtyRect
 {
-  DirtyRect(Node* node, Render::Renderer* renderer, Rect<int>& rect)
+  DirtyRect(Node* node, Render::RendererKey renderer, Rect<int>& rect)
   : node(node),
     renderer(renderer),
     rect(rect),
@@ -57,7 +53,7 @@ struct DirtyRect
   {
     if(node == rhs.node)
     {
-      return renderer < rhs.renderer;
+      return renderer.Value() < rhs.renderer.Value();
     }
     else
     {
@@ -65,10 +61,10 @@ struct DirtyRect
     }
   }
 
-  Node*             node{nullptr};
-  Render::Renderer* renderer{nullptr};
-  Rect<int32_t>     rect{};
-  bool              visited{true};
+  Node*               node{nullptr};
+  Render::RendererKey renderer{};
+  Rect<int32_t>       rect{};
+  bool                visited{true};
 };
 
 class Scene
index 14fc652..c0d7b20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,10 +39,10 @@ RenderMessageDispatcher::RenderMessageDispatcher(RenderManager& renderManager, R
 
 RenderMessageDispatcher::~RenderMessageDispatcher() = default;
 
-void RenderMessageDispatcher::AddRenderer(OwnerPointer<Render::Renderer>& renderer)
+void RenderMessageDispatcher::AddRenderer(const Render::RendererKey& renderer)
 {
   // Message has ownership of renderer while in transit from update -> render
-  typedef MessageValue1<RenderManager, OwnerPointer<Render::Renderer> > DerivedType;
+  typedef MessageValue1<RenderManager, Render::RendererKey> DerivedType;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
@@ -51,15 +51,15 @@ void RenderMessageDispatcher::AddRenderer(OwnerPointer<Render::Renderer>& render
   new(slot) DerivedType(&mRenderManager, &RenderManager::AddRenderer, renderer);
 }
 
-void RenderMessageDispatcher::RemoveRenderer(Render::Renderer& renderer)
+void RenderMessageDispatcher::RemoveRenderer(const Render::RendererKey& renderer)
 {
-  using DerivedType = MessageValue1<RenderManager, Render::Renderer*>;
+  using DerivedType = MessageValue1<RenderManager, Render::RendererKey>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new(slot) DerivedType(&mRenderManager, &RenderManager::RemoveRenderer, &renderer);
+  new(slot) DerivedType(&mRenderManager, &RenderManager::RemoveRenderer, renderer);
 }
 
 void RenderMessageDispatcher::AddRenderTracker(Render::RenderTracker& renderTracker)
index 48ea1b0..59a6e81 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SCENE_GRAPH_RENDER_MESSAGE_DISPATCHER_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -59,14 +59,14 @@ public:
    * @param[in] renderer The renderer to add.
    * @post renderer ownership is transferred.
    */
-  void AddRenderer(OwnerPointer<Render::Renderer>& renderer);
+  void AddRenderer(const Render::RendererKey& renderer);
 
   /**
    * Remove a Renderer.
    * @param[in] renderer The renderer to remove.
    * @post renderer will be destroyed in the next Render.
    */
-  void RemoveRenderer(Render::Renderer& renderer);
+  void RemoveRenderer(const Render::RendererKey& renderer);
 
   /**
    * Add a Render tracker.
index cf81d88..45e1f87 100644 (file)
@@ -266,13 +266,13 @@ inline void AddRendererToRenderList(BufferIndex               updateBufferIndex,
 
       if(DALI_LIKELY(renderable.mRenderer))
       {
-        item.mRenderer   = &renderable.mRenderer->GetRenderer();
+        item.mRenderer   = renderable.mRenderer->GetRenderer();
         item.mTextureSet = renderable.mRenderer->GetTextureSet();
         item.mDepthIndex += renderable.mRenderer->GetDepthIndex();
       }
       else
       {
-        item.mRenderer = nullptr;
+        item.mRenderer = Render::RendererKey{};
       }
 
       item.mIsUpdated |= isLayer3d;
@@ -385,14 +385,14 @@ inline bool TryReuseCachedRenderers(Layer&               layer,
     //@todo just use keys, don't deref.
     for(uint32_t index = 0; index < renderableCount; ++index)
     {
-      if(DALI_LIKELY(renderables[index].mRenderer != nullptr))
+      if(DALI_LIKELY(renderables[index].mRenderer))
       {
-        const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
-        checkSumNew += reinterpret_cast<std::size_t>(&renderer);
+        Render::RendererKey renderer = renderables[index].mRenderer->GetRenderer();
+        checkSumNew += renderer.Value();
       }
       if(DALI_LIKELY(renderList.GetItem(index).mRenderer))
       {
-        checkSumOld += reinterpret_cast<std::size_t>(&renderList.GetRenderer(index));
+        checkSumOld += renderList.GetItem(index).mRenderer.Value();
       }
     }
     if(checkSumNew == checkSumOld)
@@ -506,7 +506,7 @@ inline void RenderInstructionProcessor::SortRenderItems(BufferIndex bufferIndex,
   for(uint32_t index = 0; index < renderableCount; ++index, ++renderListIter)
   {
     *renderListIter = mSortingHelper[index].renderItem;
-    DALI_LOG_INFO(gRenderListLogFilter, Debug::Verbose, "  sortedList[%d] = %p\n", index, mSortingHelper[index].renderItem->mRenderer);
+    DALI_LOG_INFO(gRenderListLogFilter, Debug::Verbose, "  sortedList[%d] = %x\n", index, mSortingHelper[index].renderItem->mRenderer);
   }
 }
 
index e5a2f05..476afdf 100644 (file)
@@ -78,11 +78,6 @@ enum Flags
 
 } // Anonymous namespace
 
-Renderer* Renderer::New()
-{
-  return new(gRendererMemoryPool.AllocateRawThreadSafe()) Renderer();
-}
-
 RendererKey Renderer::NewKey()
 {
   void* ptr = gRendererMemoryPool.AllocateRawThreadSafe();
@@ -93,7 +88,7 @@ RendererKey Renderer::NewKey()
 
 Renderer::Renderer()
 : mSceneController(nullptr),
-  mRenderer(nullptr),
+  mRenderer{},
   mTextureSet(nullptr),
   mGeometry(nullptr),
   mShader(nullptr),
@@ -170,151 +165,152 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
 
   if(mResendFlag != 0)
   {
+    Render::Renderer* rendererPtr = mRenderer.Get();
     if(mResendFlag & RESEND_GEOMETRY)
     {
       typedef MessageValue1<Render::Renderer, Render::Geometry*> DerivedType;
       uint32_t*                                                  slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetGeometry, mGeometry);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetGeometry, mGeometry);
     }
 
     if(mResendFlag & RESEND_DRAW_COMMANDS)
     {
       using DerivedType = MessageValue2<Render::Renderer, Dali::DevelRenderer::DrawCommand*, uint32_t>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetDrawCommands, mDrawCommands.data(), mDrawCommands.size());
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDrawCommands, mDrawCommands.data(), mDrawCommands.size());
     }
 
     if(mResendFlag & RESEND_FACE_CULLING_MODE)
     {
       using DerivedType = MessageValue1<Render::Renderer, FaceCullingMode::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode);
     }
 
     if(mResendFlag & RESEND_BLEND_BIT_MASK)
     {
       using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetBlendingBitMask, mBlendBitmask);
     }
 
     if(mResendFlag & RESEND_BLEND_COLOR)
     {
       using DerivedType = MessageValue1<Render::Renderer, Vector4>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetBlendColor, GetBlendColor());
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetBlendColor, GetBlendColor());
     }
 
     if(mResendFlag & RESEND_PREMULTIPLIED_ALPHA)
     {
       using DerivedType = MessageValue1<Render::Renderer, bool>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled);
     }
 
     if(mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT)
     {
       using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement);
     }
 
     if(mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT)
     {
       using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount);
     }
 
     if(mResendFlag & RESEND_DEPTH_WRITE_MODE)
     {
       using DerivedType = MessageValue1<Render::Renderer, DepthWriteMode::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode);
     }
 
     if(mResendFlag & RESEND_DEPTH_TEST_MODE)
     {
       using DerivedType = MessageValue1<Render::Renderer, DepthTestMode::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthTestMode, mDepthTestMode);
     }
 
     if(mResendFlag & RESEND_DEPTH_FUNCTION)
     {
       using DerivedType = MessageValue1<Render::Renderer, DepthFunction::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetDepthFunction, mDepthFunction);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthFunction, mDepthFunction);
     }
 
     if(mResendFlag & RESEND_RENDER_MODE)
     {
       using DerivedType = MessageValue1<Render::Renderer, RenderMode::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetRenderMode, mStencilParameters.renderMode);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderMode, mStencilParameters.renderMode);
     }
 
     if(mResendFlag & RESEND_STENCIL_FUNCTION)
     {
       using DerivedType = MessageValue1<Render::Renderer, StencilFunction::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction);
     }
 
     if(mResendFlag & RESEND_STENCIL_FUNCTION_MASK)
     {
       using DerivedType = MessageValue1<Render::Renderer, int>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask);
     }
 
     if(mResendFlag & RESEND_STENCIL_FUNCTION_REFERENCE)
     {
       using DerivedType = MessageValue1<Render::Renderer, int>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference);
     }
 
     if(mResendFlag & RESEND_STENCIL_MASK)
     {
       using DerivedType = MessageValue1<Render::Renderer, int>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask);
     }
 
     if(mResendFlag & RESEND_STENCIL_OPERATION_ON_FAIL)
     {
       using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail);
     }
 
     if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_FAIL)
     {
       using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail);
     }
 
     if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_PASS)
     {
       using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass);
     }
 
     if(mResendFlag & RESEND_SHADER)
     {
       using DerivedType = MessageValue1<Render::Renderer, bool>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetShaderChanged, true);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetShaderChanged, true);
     }
 
     if(mResendFlag & RESEND_SET_RENDER_CALLBACK)
     {
       using DerivedType = MessageValue1<Render::Renderer, Dali::RenderCallback*>;
       uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
-      new(slot) DerivedType(mRenderer, &Render::Renderer::SetRenderCallback, mRenderCallback);
+      new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderCallback, mRenderCallback);
     }
 
     SetUpdated(true);
@@ -603,10 +599,9 @@ void Renderer::ConnectToSceneGraph(SceneController& sceneController, BufferIndex
   mRegenerateUniformMap = true;
   mSceneController      = &sceneController;
 
-  mRenderer = Render::Renderer::New(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
+  mRenderer = Render::Renderer::NewKey(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
 
-  OwnerPointer<Render::Renderer> transferOwnership(mRenderer);
-  mSceneController->GetRenderMessageDispatcher().AddRenderer(transferOwnership);
+  mSceneController->GetRenderMessageDispatcher().AddRenderer(mRenderer);
 }
 
 // Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
@@ -615,15 +610,15 @@ void Renderer::DisconnectFromSceneGraph(SceneController& sceneController, Buffer
   // Remove renderer from RenderManager
   if(mRenderer)
   {
-    mSceneController->GetRenderMessageDispatcher().RemoveRenderer(*mRenderer);
-    mRenderer = nullptr;
+    mSceneController->GetRenderMessageDispatcher().RemoveRenderer(mRenderer);
+    mRenderer = Render::RendererKey{};
   }
   mSceneController = nullptr;
 }
 
-Render::Renderer& Renderer::GetRenderer()
+Render::RendererKey Renderer::GetRenderer()
 {
-  return *mRenderer;
+  return mRenderer;
 }
 
 Renderer::OpacityType Renderer::GetOpacityType(BufferIndex updateBufferIndex, const Node& node) const
index 84243ca..be4bf71 100644 (file)
@@ -173,8 +173,6 @@ public:
   /**
    * Construct a new Renderer
    */
-  static Renderer* New();
-
   static RendererKey NewKey();
 
   /**
@@ -188,6 +186,10 @@ public:
    */
   void operator delete(void* ptr);
 
+  /**
+   * Get a pointer to the object from the given key.
+   * Used by MemoryPoolKey to provide pointer semantics.
+   */
   static Renderer* Get(RendererKey::KeyType);
 
   /**
@@ -475,7 +477,7 @@ public:
    * Retrieve the Render thread renderer
    * @return The associated render thread renderer
    */
-  Render::Renderer& GetRenderer();
+  Render::RendererKey GetRenderer();
 
   /**
    * Query whether the renderer is fully opaque, fully transparent or transparent.
@@ -621,11 +623,11 @@ private:
 private:
   CollectedUniformMap mCollectedUniformMap; ///< Uniform maps collected by the renderer
 
-  SceneController*  mSceneController; ///< Used for initializing renderers
-  Render::Renderer* mRenderer;        ///< Raw pointer to the renderer (that's owned by RenderManager)
-  TextureSet*       mTextureSet;      ///< The texture set this renderer uses. (Not owned)
-  Render::Geometry* mGeometry;        ///< The geometry this renderer uses. (Not owned)
-  Shader*           mShader;          ///< The shader this renderer uses. (Not owned)
+  SceneController*    mSceneController; ///< Used for initializing renderers
+  Render::RendererKey mRenderer;        ///< Key to the renderer (that's owned by RenderManager)
+  TextureSet*         mTextureSet;      ///< The texture set this renderer uses. (Not owned)
+  Render::Geometry*   mGeometry;        ///< The geometry this renderer uses. (Not owned)
+  Shader*             mShader;          ///< The shader this renderer uses. (Not owned)
 
   OwnerPointer<VisualRenderer::AnimatableVisualProperties> mVisualProperties{nullptr}; ///< VisualProperties (optional/owned)
   OwnerPointer<Vector4>                                    mBlendColor;                ///< The blend color for blending operation