diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 640bfb79..2ff8fba9 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -42,6 +42,15 @@ static void _termEngine() //TODO: Clean up global resources } + +void GlRenderer::clearDisposes() +{ + if (mDisposed.textures.count > 0) { + glDeleteTextures(mDisposed.textures.count, mDisposed.textures.data); + mDisposed.textures.clear(); + } +} + /************************************************************************/ /* External Class Implementation */ /************************************************************************/ @@ -50,6 +59,8 @@ static void _termEngine() bool GlRenderer::clear() { + clearDisposes(); + mClearBuffer = true; return true; } @@ -112,6 +123,8 @@ bool GlRenderer::sync() mRenderPassStack.clear(); + clearDisposes(); + delete task; return true; @@ -384,7 +397,11 @@ void GlRenderer::dispose(RenderData data) auto sdata = static_cast(data); if (!sdata) return; - if (sdata->texId) glDeleteTextures(1, &sdata->texId); + //dispose the non thread-safety resources on clearDisposes() call + if (sdata->texId) { + ScopedLock lock(mDisposed.key); + mDisposed.textures.push(sdata->texId); + } delete sdata; } diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index f3a683ad..ee6a9647 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -96,6 +96,8 @@ private: void prepareCmpTask(GlRenderTask* task, const RenderRegion& vp, uint32_t cmpWidth, uint32_t cmpHeight); void endRenderPass(Compositor* cmp); + void clearDisposes(); + Surface surface; GLint mTargetFboId = 0; RenderRegion mViewport; @@ -107,6 +109,12 @@ private: vector mRenderPassStack = {}; vector> mComposeStack = {}; + //Disposed resources. They should be released on synced call. + struct { + Array textures = {}; + Key key; + } mDisposed; + bool mClearBuffer = true; };