[Tizen] Fix RenderTarget and RenderPass doesn't destroy issue 93/268093/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 13 Dec 2021 09:03:42 +0000 (18:03 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 16 Dec 2021 06:05:35 +0000 (15:05 +0900)
When we create and delete windows repeatly,
previous code doesn't release the memory of
GLES::RenderTarget and GLES::RenderPass.

And cause GLES::~RenderTarget not called,
graphics controller just stack suface infomations
in mSurfaceContexts.

This patch implement the 'TODO' codes so fix the memory issue.

Change-Id: Iebb87a4d4662e8f6c418690950ef46ca09b63d58
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/graphics/gles-impl/egl-graphics-controller.cpp
dali/internal/graphics/gles-impl/egl-graphics-controller.h
dali/internal/graphics/gles-impl/gles-graphics-render-pass.cpp
dali/internal/graphics/gles-impl/gles-graphics-render-pass.h
dali/internal/graphics/gles-impl/gles-graphics-render-target.cpp
dali/internal/graphics/gles-impl/gles-graphics-render-target.h
dali/internal/graphics/gles-impl/gles-graphics-shader.h
dali/internal/graphics/gles-impl/gles-graphics-texture.h

index eec74af..bee69ec 100644 (file)
@@ -347,6 +347,12 @@ void EglGraphicsController::ProcessDiscardQueues()
   // Process Framebuffers
   ProcessDiscardQueue<GLES::Framebuffer>(mDiscardFramebufferQueue);
 
+  // Process RenderPass
+  ProcessDiscardQueue<GLES::RenderPass>(mDiscardRenderPassQueue);
+
+  // Process RenderTarget
+  ProcessDiscardQueue<GLES::RenderTarget>(mDiscardRenderTargetQueue);
+
   // Process pipelines
   ProcessDiscardQueue(mDiscardPipelineQueue);
 
index a792eea..6af7383 100644 (file)
@@ -392,6 +392,30 @@ public:
   }
 
   /**
+   * @brief Pushes RenderPass to the discard queue
+   *
+   * Function is called from the UniquePtr custom deleter.
+   *
+   * @param[in] program Pointer to the RenderPass
+   */
+  void DiscardResource(GLES::RenderPass* renderPass)
+  {
+    mDiscardRenderPassQueue.push(renderPass);
+  }
+
+  /**
+   * @brief Pushes RenderTarget to the discard queue
+   *
+   * Function is called from the UniquePtr custom deleter.
+   *
+   * @param[in] program Pointer to the RenderTarget
+   */
+  void DiscardResource(GLES::RenderTarget* renderTarget)
+  {
+    mDiscardRenderTargetQueue.push(renderTarget);
+  }
+
+  /**
    * @brief Pushes Shader to the discard queue
    *
    * Function is called from the UniquePtr custom deleter.
@@ -747,6 +771,8 @@ private:
 
   std::queue<GLES::Program*>             mDiscardProgramQueue;       ///< Discard queue for program resource
   std::queue<GLES::Pipeline*>            mDiscardPipelineQueue;      ///< Discard queue of pipelines
+  std::queue<GLES::RenderPass*>          mDiscardRenderPassQueue;    ///< Discard queue for renderpass resource
+  std::queue<GLES::RenderTarget*>        mDiscardRenderTargetQueue;  ///< Discard queue for rendertarget resource
   std::queue<GLES::Shader*>              mDiscardShaderQueue;        ///< Discard queue of shaders
   std::queue<GLES::Sampler*>             mDiscardSamplerQueue;       ///< Discard queue of samplers
   std::queue<const GLES::CommandBuffer*> mDiscardCommandBufferQueue; ///< Discard queue of command buffers
index bb5d680..554bfe4 100644 (file)
@@ -18,6 +18,9 @@
 // CLASS HEADER
 #include "gles-graphics-render-pass.h"
 
+// INTERNAL INCLUDES
+#include "egl-graphics-controller.h"
+
 namespace Dali::Graphics::GLES
 {
 struct RenderPass::Impl
@@ -25,7 +28,7 @@ struct RenderPass::Impl
   Impl()  = default;
   ~Impl() = default;
 
-  std::vector<AttachmentDescription> attachments;
+  std::vector<AttachmentDescription> attachments{};
 };
 
 RenderPass::RenderPass(const Graphics::RenderPassCreateInfo& createInfo, Graphics::EglGraphicsController& controller)
@@ -41,4 +44,11 @@ RenderPass::RenderPass(const Graphics::RenderPassCreateInfo& createInfo, Graphic
   }
 }
 
+RenderPass::~RenderPass() = default;
+
+void RenderPass::DiscardResource()
+{
+  mController.DiscardResource(this);
+}
+
 } // namespace Dali::Graphics::GLES
index 1186f61..0281a66 100644 (file)
@@ -42,14 +42,14 @@ public:
   /**
    * @brief Destructor
    */
-  ~RenderPass() override = default;
+  ~RenderPass() override;
 
   /**
    * @brief Called when GL resources are destroyed
    */
   void DestroyResource() override
   {
-    // TODO: Implement destroying the resource
+    // There is no graphic resource here. do nothing.
   }
 
   /**
@@ -59,17 +59,14 @@ public:
    */
   bool InitializeResource() override
   {
-    // TODO: Implement initializing resource
-    return {};
+    // There is no graphic resource here. return true.
+    return true;
   }
 
   /**
    * @brief Called when UniquePtr<> on client-side dies
    */
-  void DiscardResource() override
-  {
-    // TODO: Implement moving to the discard queue
-  }
+  void DiscardResource() override;
 
 private:
   struct Impl;
index efdaeb2..8cfd3f1 100644 (file)
 
 namespace Dali::Graphics::GLES
 {
-struct RenderTarget::Impl
-{
-  Impl(EglGraphicsController& controller)
-  : controller(controller){};
-
-  ~Impl() = default;
-
-  EglGraphicsController& controller;
-};
 
 RenderTarget::RenderTarget(const Graphics::RenderTargetCreateInfo& createInfo, Graphics::EglGraphicsController& controller)
 : RenderTargetResource(createInfo, controller)
 {
-  mImpl = std::make_unique<Impl>(controller);
-
   if(createInfo.surface)
   {
     controller.CreateSurfaceContext(static_cast<Dali::RenderSurfaceInterface*>(createInfo.surface));
   }
 }
 
-RenderTarget::~RenderTarget()
+RenderTarget::~RenderTarget() = default;
+
+void RenderTarget::DestroyResource()
 {
+  // This is a proper destructor
   if(mCreateInfo.surface)
   {
-    mImpl->controller.DeleteSurfaceContext(static_cast<Dali::RenderSurfaceInterface*>(mCreateInfo.surface));
+    mController.DeleteSurfaceContext(static_cast<Dali::RenderSurfaceInterface*>(mCreateInfo.surface));
   }
 }
 
+void RenderTarget::DiscardResource()
+{
+  mController.DiscardResource(this);
+}
+
 GLES::Framebuffer* RenderTarget::GetFramebuffer() const
 {
   return static_cast<GLES::Framebuffer*>(mCreateInfo.framebuffer);
index 6a9fcab..2169e62 100644 (file)
@@ -48,10 +48,7 @@ public:
   /**
    * @brief Called when GL resources are destroyed
    */
-  void DestroyResource() override
-  {
-    // TODO: Implement destroying the resource
-  }
+  void DestroyResource() override;
 
   /**
    * @brief Called when initializing the resource
@@ -60,17 +57,14 @@ public:
    */
   bool InitializeResource() override
   {
-    // TODO: Implement initializing resource
-    return {};
+    // There is no graphic resource here. return true.
+    return true;
   }
 
   /**
    * @brief Called when UniquePtr<> on client-side dies
    */
-  void DiscardResource() override
-  {
-    // TODO: Implement moving to the discard queue
-  }
+  void DiscardResource() override;
 
   /**
    * @brief Returns framebuffer associated with the render target
@@ -81,10 +75,6 @@ public:
    * @brief Returns surface associated with the render target
    */
   Surface* GetSurface() const;
-
-private:
-  struct Impl;
-  std::unique_ptr<Impl> mImpl{nullptr};
 };
 
 } // namespace Dali::Graphics::GLES
index 3b2abb8..180a14b 100644 (file)
@@ -77,7 +77,7 @@ public:
 
 private:
   struct Impl;
-  std::unique_ptr<Impl> mImpl;
+  std::unique_ptr<Impl> mImpl{nullptr};
 };
 
 } // namespace Dali::Graphics::GLES
index 2ae566f..ee7b1c2 100644 (file)
@@ -160,7 +160,7 @@ private:
     uint32_t maxLevel{0};
   } mDefaultSamplerState;
 
-  std::vector<char> mStagingBuffer;
+  std::vector<char> mStagingBuffer{};
   uint32_t          mTextureId{0u};
   GLenum            mGlTarget{0u};
   uint32_t          mMaxMipMapLevel{0u};