Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 357c63d1 authored by Stan Iliev's avatar Stan Iliev
Browse files

Make sure frame buffer 0 is bound before calling GL functor

Make sure view port and frame buffer are set to the correct values
before calling GL functor (WebView) draw.
Improve correctness for stencil clip by doing a second flush that
guarantees the stencil clear will be executed after draw commands.

Bug: 79619253
Test: XFINITY Connect app draws correctly
Change-Id: Ieb3d0d70caf0469b6393e6287f8529cd86519301
parent 6555a9fa
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -76,13 +76,20 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
    // apply a simple clip with a scissor or a complex clip with a stencil
    SkRegion clipRegion;
    canvas->temporary_internal_getRgnClip(&clipRegion);
    canvas->flush();
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, info.width, info.height);
    if (CC_UNLIKELY(clipRegion.isComplex())) {
        //TODO: move stencil clear and canvas flush to SkAndroidFrameworkUtils::clipWithStencil
        glDisable(GL_SCISSOR_TEST);
        glStencilMask(0x1);
        glClearStencil(0);
        glClear(GL_STENCIL_BUFFER_BIT);
        // GL ops get inserted here if previous flush is missing, which could dirty the stencil
        bool stencilWritten = SkAndroidFrameworkUtils::clipWithStencil(canvas);
        canvas->flush();
        canvas->flush(); //need this flush for the single op that draws into the stencil
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glViewport(0, 0, info.width, info.height);
        if (stencilWritten) {
            glStencilMask(0x1);
            glStencilFunc(GL_EQUAL, 0x1, 0x1);
@@ -93,11 +100,9 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
            glDisable(GL_STENCIL_TEST);
        }
    } else if (clipRegion.isEmpty()) {
        canvas->flush();
        glDisable(GL_STENCIL_TEST);
        glDisable(GL_SCISSOR_TEST);
    } else {
        canvas->flush();
        glDisable(GL_STENCIL_TEST);
        glEnable(GL_SCISSOR_TEST);
        setScissor(info.height, clipRegion.getBounds());