gl_engine: fix fbo and texture leak

GlRenderTarget contains framebuffer and render target objects,
these GPU resources need to be released before reusing the structure and calling init with the new size.
This commit is contained in:
RuiwenTang 2024-12-31 14:36:01 +08:00 committed by Hermet Park
parent 12b3747d08
commit 3c6d686795
3 changed files with 8 additions and 7 deletions

View file

@ -22,6 +22,8 @@
#include "tvgGlRenderTarget.h" #include "tvgGlRenderTarget.h"
GlRenderTarget::GlRenderTarget(uint32_t width, uint32_t height): mWidth(width), mHeight(height) {}
GlRenderTarget::~GlRenderTarget() GlRenderTarget::~GlRenderTarget()
{ {
if (mFbo == 0) return; if (mFbo == 0) return;
@ -122,9 +124,7 @@ GlRenderTarget* GlRenderTargetPool::getRenderTarget(const RenderRegion& vp, GLui
} }
} }
auto rt = new GlRenderTarget; auto rt = new GlRenderTarget(width, height);
rt->mWidth = width;
rt->mHeight = height;
rt->init(resolveId); rt->init(resolveId);
rt->setViewport(vp); rt->setViewport(vp);
mPool.push(rt); mPool.push(rt);

View file

@ -28,6 +28,8 @@
class GlRenderTarget class GlRenderTarget
{ {
public: public:
GlRenderTarget() = default;
GlRenderTarget(uint32_t width, uint32_t height);
~GlRenderTarget(); ~GlRenderTarget();
void init(GLint resolveId); void init(GLint resolveId);
@ -42,10 +44,10 @@ public:
void setViewport(const RenderRegion& vp) { mViewport = vp; } void setViewport(const RenderRegion& vp) { mViewport = vp; }
const RenderRegion& getViewport() const { return mViewport; } const RenderRegion& getViewport() const { return mViewport; }
uint32_t mWidth;
uint32_t mHeight;
private: private:
uint32_t mWidth = 0;
uint32_t mHeight = 0;
RenderRegion mViewport{}; RenderRegion mViewport{};
GLuint mFbo = 0; GLuint mFbo = 0;
GLuint mColorBuffer = 0; GLuint mColorBuffer = 0;

View file

@ -814,8 +814,7 @@ bool GlRenderer::target(void* context, int32_t id, uint32_t w, uint32_t h)
mContext = context; mContext = context;
mTargetFboId = static_cast<GLint>(id); mTargetFboId = static_cast<GLint>(id);
mRootTarget.mWidth = surface.w; mRootTarget = GlRenderTarget(surface.w, surface.h);
mRootTarget.mHeight = surface.h;
mRootTarget.setViewport({0, 0, static_cast<int32_t>(surface.w), static_cast<int32_t>(surface.h)}); mRootTarget.setViewport({0, 0, static_cast<int32_t>(surface.w), static_cast<int32_t>(surface.h)});
mRootTarget.init(mTargetFboId); mRootTarget.init(mTargetFboId);