mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-10 22:51:58 +00:00
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:
parent
83e3cb24ff
commit
c8833e970d
2 changed files with 13 additions and 9 deletions
|
@ -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();
|
||||
|
|
|
@ -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 = {};
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue