From 53b0b87bb75a0f590aa2cce3469fe8d78e69610d Mon Sep 17 00:00:00 2001 From: RuiwenTang Date: Wed, 13 Dec 2023 13:41:11 +0800 Subject: [PATCH] gl_engine: optimize framebuffer creation and save some runtime memory since the framebuffer will draw back to parent RenderPass, it can be reused in next compose rendering. So instead of create framebuffer every time when beginCompose is called, we trying to reuse the framebuffer created before in the same stack level --- src/renderer/gl_engine/tvgGlRenderer.cpp | 19 ++++++++++++------- src/renderer/gl_engine/tvgGlRenderer.h | 3 +-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 375a33cc..0d0115bb 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -106,7 +106,6 @@ bool GlRenderer::sync() GL_CHECK(glDisable(GL_SCISSOR_TEST)); mRenderPassStack.clear(); - mPoolIndex = 0; mClearBuffer = false; delete task; @@ -154,17 +153,19 @@ bool GlRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint8_t cmp->method = method; cmp->opacity = opacity; - if (mPoolIndex >= mComposePool.size()) { - mComposePool.emplace_back(make_unique(surface.w, surface.h)); - mComposePool.back()->init(mTargetFboId); + uint32_t index = mRenderPassStack.size() - 1; + + if (index >= mComposePool.count) { + mComposePool.push( new GlRenderTarget(surface.w, surface.h)); + mComposePool[index]->init(mTargetFboId); } - mRenderPassStack.emplace_back(GlRenderPass(mComposePool[mPoolIndex++].get())); + mRenderPassStack.emplace_back(GlRenderPass(mComposePool[index])); return true; } -bool GlRenderer::endComposite(TVG_UNUSED Compositor* cmp) +bool GlRenderer::endComposite(Compositor* cmp) { if (mComposeStack.empty()) return false; if (mComposeStack.back().get() != cmp) return false; @@ -441,12 +442,16 @@ GlRenderer* GlRenderer::gen() return new GlRenderer(); } -GlRenderer::GlRenderer() :mViewport() ,mGpuBuffer(new GlStageBuffer), mPrograms() +GlRenderer::GlRenderer() :mViewport() ,mGpuBuffer(new GlStageBuffer), mPrograms(), mComposePool() { } GlRenderer::~GlRenderer() { + for (auto i = 0; i < mComposePool.count; i++) { + if (mComposePool[i]) delete mComposePool[i]; + } + --rendererCnt; if (rendererCnt == 0 && initEngineCnt == 0) _termEngine(); diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index e974c44c..5ae0c2bc 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -98,8 +98,7 @@ private: unique_ptr mGpuBuffer; vector> mPrograms; unique_ptr mRootTarget = {}; - vector> mComposePool = {}; - size_t mPoolIndex = 0; + Array mComposePool = {}; vector mRenderPassStack = {}; vector> mComposeStack = {};