From: Eunki, Hong Date: Mon, 13 Dec 2021 09:03:42 +0000 (+0900) Subject: [Tizen] Fix RenderTarget and RenderPass doesn't destroy issue X-Git-Tag: accepted/tizen/6.5/unified/20211217.121959~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=e18e26d65df2c3db5c5d090682286970864a557d [Tizen] Fix RenderTarget and RenderPass doesn't destroy issue 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 --- diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp index eec74af..bee69ec 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp @@ -347,6 +347,12 @@ void EglGraphicsController::ProcessDiscardQueues() // Process Framebuffers ProcessDiscardQueue(mDiscardFramebufferQueue); + // Process RenderPass + ProcessDiscardQueue(mDiscardRenderPassQueue); + + // Process RenderTarget + ProcessDiscardQueue(mDiscardRenderTargetQueue); + // Process pipelines ProcessDiscardQueue(mDiscardPipelineQueue); diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.h b/dali/internal/graphics/gles-impl/egl-graphics-controller.h index a792eea..6af7383 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.h +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.h @@ -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 mDiscardProgramQueue; ///< Discard queue for program resource std::queue mDiscardPipelineQueue; ///< Discard queue of pipelines + std::queue mDiscardRenderPassQueue; ///< Discard queue for renderpass resource + std::queue mDiscardRenderTargetQueue; ///< Discard queue for rendertarget resource std::queue mDiscardShaderQueue; ///< Discard queue of shaders std::queue mDiscardSamplerQueue; ///< Discard queue of samplers std::queue mDiscardCommandBufferQueue; ///< Discard queue of command buffers diff --git a/dali/internal/graphics/gles-impl/gles-graphics-render-pass.cpp b/dali/internal/graphics/gles-impl/gles-graphics-render-pass.cpp index bb5d680..554bfe4 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-render-pass.cpp +++ b/dali/internal/graphics/gles-impl/gles-graphics-render-pass.cpp @@ -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 attachments; + std::vector 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 diff --git a/dali/internal/graphics/gles-impl/gles-graphics-render-pass.h b/dali/internal/graphics/gles-impl/gles-graphics-render-pass.h index 1186f61..0281a66 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-render-pass.h +++ b/dali/internal/graphics/gles-impl/gles-graphics-render-pass.h @@ -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; diff --git a/dali/internal/graphics/gles-impl/gles-graphics-render-target.cpp b/dali/internal/graphics/gles-impl/gles-graphics-render-target.cpp index efdaeb2..8cfd3f1 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-render-target.cpp +++ b/dali/internal/graphics/gles-impl/gles-graphics-render-target.cpp @@ -25,35 +25,32 @@ 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(controller); - if(createInfo.surface) { controller.CreateSurfaceContext(static_cast(createInfo.surface)); } } -RenderTarget::~RenderTarget() +RenderTarget::~RenderTarget() = default; + +void RenderTarget::DestroyResource() { + // This is a proper destructor if(mCreateInfo.surface) { - mImpl->controller.DeleteSurfaceContext(static_cast(mCreateInfo.surface)); + mController.DeleteSurfaceContext(static_cast(mCreateInfo.surface)); } } +void RenderTarget::DiscardResource() +{ + mController.DiscardResource(this); +} + GLES::Framebuffer* RenderTarget::GetFramebuffer() const { return static_cast(mCreateInfo.framebuffer); diff --git a/dali/internal/graphics/gles-impl/gles-graphics-render-target.h b/dali/internal/graphics/gles-impl/gles-graphics-render-target.h index 6a9fcab..2169e62 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-render-target.h +++ b/dali/internal/graphics/gles-impl/gles-graphics-render-target.h @@ -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 mImpl{nullptr}; }; } // namespace Dali::Graphics::GLES diff --git a/dali/internal/graphics/gles-impl/gles-graphics-shader.h b/dali/internal/graphics/gles-impl/gles-graphics-shader.h index 3b2abb8..180a14b 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-shader.h +++ b/dali/internal/graphics/gles-impl/gles-graphics-shader.h @@ -77,7 +77,7 @@ public: private: struct Impl; - std::unique_ptr mImpl; + std::unique_ptr mImpl{nullptr}; }; } // namespace Dali::Graphics::GLES diff --git a/dali/internal/graphics/gles-impl/gles-graphics-texture.h b/dali/internal/graphics/gles-impl/gles-graphics-texture.h index 2ae566f..ee7b1c2 100644 --- a/dali/internal/graphics/gles-impl/gles-graphics-texture.h +++ b/dali/internal/graphics/gles-impl/gles-graphics-texture.h @@ -160,7 +160,7 @@ private: uint32_t maxLevel{0}; } mDefaultSamplerState; - std::vector mStagingBuffer; + std::vector mStagingBuffer{}; uint32_t mTextureId{0u}; GLenum mGlTarget{0u}; uint32_t mMaxMipMapLevel{0u};