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
This commit is contained in:
RuiwenTang 2023-12-13 13:41:11 +08:00 committed by Hermet Park
parent 83e3cb24ff
commit c8833e970d
2 changed files with 13 additions and 9 deletions

View file

@ -106,7 +106,6 @@ bool GlRenderer::sync()
GL_CHECK(glDisable(GL_SCISSOR_TEST));
mRenderPassStack.clear();
mPoolIndex = 0;
delete task;
@ -153,17 +152,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<GlRenderTarget>(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;
@ -440,12 +441,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();

View file

@ -97,8 +97,7 @@ private:
std::unique_ptr<GlStageBuffer> mGpuBuffer;
vector<std::unique_ptr<GlProgram>> mPrograms;
unique_ptr<GlRenderTarget> mRootTarget = {};
vector<unique_ptr<GlRenderTarget>> mComposePool = {};
size_t mPoolIndex = 0;
Array<GlRenderTarget*> mComposePool = {};
vector<GlRenderPass> mRenderPassStack = {};
vector<unique_ptr<Compositor>> mComposeStack = {};
};