From a3a8a999b7f7c828992d76486ae38dc22a80a329 Mon Sep 17 00:00:00 2001 From: Sungun No Date: Fri, 6 Jun 2025 20:40:57 +0900 Subject: [PATCH] gl_engine: fix always-true clear flag The clear flag specified in Canvas::draw is ignored when set to false, since GlRenderer::mClearBuffer is never explicitly reset to false. This commit ensures that mClearBuffer is reset to its default (false) after being used, so that the clear operation behaves correctly per frame. - Issue: #1779 --- src/renderer/gl_engine/tvgGlRenderTask.cpp | 29 ++++++++++------------ src/renderer/gl_engine/tvgGlRenderTask.h | 4 ++- src/renderer/gl_engine/tvgGlRenderer.cpp | 5 +++- src/renderer/gl_engine/tvgGlRenderer.h | 2 +- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlRenderTask.cpp b/src/renderer/gl_engine/tvgGlRenderTask.cpp index c978febf..9cd206e2 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.cpp +++ b/src/renderer/gl_engine/tvgGlRenderTask.cpp @@ -195,23 +195,20 @@ void GlComposeTask::run() { GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, getSelfFbo())); - // clear this fbo - if (mClearBuffer) { - // we must clear all area of fbo - GL_CHECK(glViewport(0, 0, mFbo->getWidth(), mFbo->getHeight())); - GL_CHECK(glScissor(0, 0, mFbo->getWidth(), mFbo->getHeight())); - GL_CHECK(glClearColor(0, 0, 0, 0)); - GL_CHECK(glClearStencil(0)); - #ifdef THORVG_GL_TARGET_GLES - GL_CHECK(glClearDepthf(0.0)); - #else - GL_CHECK(glClearDepth(0.0)); - #endif - GL_CHECK(glDepthMask(1)); + // we must clear all area of fbo + GL_CHECK(glViewport(0, 0, mFbo->getWidth(), mFbo->getHeight())); + GL_CHECK(glScissor(0, 0, mFbo->getWidth(), mFbo->getHeight())); + GL_CHECK(glClearColor(0, 0, 0, 0)); + GL_CHECK(glClearStencil(0)); +#ifdef THORVG_GL_TARGET_GLES + GL_CHECK(glClearDepthf(0.0)); +#else + GL_CHECK(glClearDepth(0.0)); +#endif + GL_CHECK(glDepthMask(1)); - GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); - GL_CHECK(glDepthMask(0)); - } + GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + GL_CHECK(glDepthMask(0)); GL_CHECK(glViewport(0, 0, mRenderWidth, mRenderHeight)); GL_CHECK(glScissor(0, 0, mRenderWidth, mRenderHeight)); diff --git a/src/renderer/gl_engine/tvgGlRenderTask.h b/src/renderer/gl_engine/tvgGlRenderTask.h index 6254292a..4c20f9cb 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.h +++ b/src/renderer/gl_engine/tvgGlRenderTask.h @@ -125,8 +125,8 @@ public: void run() override; void setRenderSize(uint32_t width, uint32_t height) { mRenderWidth = width; mRenderHeight = height; } + void setClearBuffer(bool clearBuffer) { mClearBuffer = clearBuffer; } - bool mClearBuffer = true; protected: GLuint getTargetFbo() { return mTargetFbo; } @@ -134,6 +134,8 @@ protected: GLuint getResolveFboId(); void onResolve(); + bool mClearBuffer = false; + private: GLuint mTargetFbo; GlRenderTarget* mFbo; diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index c9148145..0cac512a 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -839,7 +839,7 @@ bool GlRenderer::sync() prepareBlitTask(task); - task->mClearBuffer = mClearBuffer; + task->setClearBuffer(mClearBuffer); task->setTargetViewport({{0, 0}, {int32_t(surface.w), int32_t(surface.h)}}); if (mGpuBuffer.flushToGPU()) { @@ -853,6 +853,9 @@ bool GlRenderer::sync() clearDisposes(); + // Reset clear buffer flag to default (false) after use. + mClearBuffer = false; + delete task; return true; diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index 7ab1e901..1f29c5fa 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -153,7 +153,7 @@ private: } mDisposed; BlendMethod mBlendMethod = BlendMethod::Normal; - bool mClearBuffer = true; //FIXME: clear buffer should be optional (default is false) + bool mClearBuffer = false; }; #endif /* _TVG_GL_RENDERER_H_ */