diff --git a/examples/Lottie.cpp b/examples/Lottie.cpp index 2ef1cc77..bc9f9d84 100644 --- a/examples/Lottie.cpp +++ b/examples/Lottie.cpp @@ -217,6 +217,8 @@ void drawGLview(Evas_Object *obj) gl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl->glClear(GL_COLOR_BUFFER_BIT); + glCanvas->update(); + if (glCanvas->draw() == tvg::Result::Success) { glCanvas->sync(); } diff --git a/examples/LottieExtension.cpp b/examples/LottieExtension.cpp index 84d44591..5daf321a 100644 --- a/examples/LottieExtension.cpp +++ b/examples/LottieExtension.cpp @@ -194,6 +194,8 @@ void drawGLview(Evas_Object *obj) gl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl->glClear(GL_COLOR_BUFFER_BIT); + glCanvas->update(); + if (glCanvas->draw() == tvg::Result::Success) { glCanvas->sync(); } diff --git a/src/renderer/gl_engine/tvgGlRenderTask.cpp b/src/renderer/gl_engine/tvgGlRenderTask.cpp index ad132fd0..4daee10e 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.cpp +++ b/src/renderer/gl_engine/tvgGlRenderTask.cpp @@ -128,7 +128,7 @@ void GlStencilCoverTask::run() if (mStencilMode == GlStencilMode::FillEvenOdd) { GL_CHECK(glStencilFunc(GL_EQUAL, 0x01, 0x01)); - GL_CHECK(glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)); + GL_CHECK(glStencilOp(GL_REPLACE, GL_KEEP, GL_REPLACE)); } else { GL_CHECK(glStencilFunc(GL_NOTEQUAL, 0x0, 0xFF)); GL_CHECK(glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)); @@ -138,17 +138,6 @@ void GlStencilCoverTask::run() mCoverTask->run(); - if (mStencilMode == GlStencilMode::FillEvenOdd) { - GL_CHECK(glStencilFunc(GL_NOTEQUAL, 0x0, 0xFF)); - GL_CHECK(glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)); - - GL_CHECK(glColorMask(0, 0, 0, 0)); - - mStencilTask->run(); - - GL_CHECK(glColorMask(1, 1, 1, 1)); - } - GL_CHECK(glDisable(GL_STENCIL_TEST)); } @@ -171,6 +160,7 @@ GlComposeTask::~GlComposeTask() void GlComposeTask::run() { GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, getSelfFbo())); + GL_CHECK(glViewport(0, 0, mFbo->getWidth(), mFbo->getHeight())); // clear this fbo if (mClearBuffer) { @@ -216,6 +206,7 @@ void GlBlitTask::run() GlComposeTask::run(); GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, getTargetFbo())); + GL_CHECK(glViewport(mTargetViewport.x, mTargetViewport.y, mTargetViewport.w, mTargetViewport.h)); if (mClearBuffer) { GL_CHECK(glClearColor(0, 0, 0, 0)); diff --git a/src/renderer/gl_engine/tvgGlRenderTask.h b/src/renderer/gl_engine/tvgGlRenderTask.h index b8f9686e..94fb7157 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.h +++ b/src/renderer/gl_engine/tvgGlRenderTask.h @@ -146,8 +146,11 @@ public: void run() override; GLuint getColorTextore() const { return mColorTex; } + + void setTargetViewport(const RenderRegion& vp) { mTargetViewport = vp; } private: GLuint mColorTex = 0; + RenderRegion mTargetViewport = {}; }; class GlDrawBlitTask : public GlComposeTask diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 3d548a5c..f6539223 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -68,11 +68,24 @@ bool GlRenderer::target(int32_t id, uint32_t w, uint32_t h) mViewport.w = surface.w; mViewport.h = surface.h; + mTargetViewport.x = 0; + mTargetViewport.y = 0; + mTargetViewport.w = surface.w; + mTargetViewport.h = surface.h; + mTargetFboId = static_cast(id); //TODO: It's not allow to draw onto the main surface. Need to confirm the policy. if (mTargetFboId == 0) { GL_CHECK(glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mTargetFboId)); + + GLint dims[4] = {0}; + + GL_CHECK(glGetIntegerv(GL_VIEWPORT, dims)); + // If targeting on the main framebuffer ,the actual size may by adjusted by the window system. + // In case the size is different from logical size, query and set the actual viewport here + mTargetViewport.w = dims[2]; + mTargetViewport.h = dims[3]; } mRootTarget = make_unique(surface.w, surface.h); @@ -101,6 +114,7 @@ bool GlRenderer::sync() prepareBlitTask(task); task->mClearBuffer = mClearBuffer; + task->setTargetViewport(mTargetViewport); mGpuBuffer->flushToGPU(); mGpuBuffer->bind(); diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index 0281c216..5a63a475 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -98,6 +98,7 @@ private: GLint mTargetFboId = 0; RenderRegion mViewport; + RenderRegion mTargetViewport; //TODO: remove all unique_ptr / replace the vector with tvg::Array unique_ptr mGpuBuffer; vector> mPrograms;