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

Commit 3f121fc6 authored by Michael Lentine's avatar Michael Lentine
Browse files

When eglMakeCurrent fails we need to fix the egl state.

Bug: 16676660

Change-Id: Ie7bee9c78378b9e9206060444319e6ee35e1ab74
parent 4b20d402
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -1743,7 +1743,7 @@ void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
    }

    if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
        doComposeSurfaces(hw, dirtyRegion);
        if (!doComposeSurfaces(hw, dirtyRegion)) return;
    } else {
        RenderEngine& engine(getRenderEngine());
        mat4 colorMatrix = mColorMatrix;
@@ -1762,7 +1762,7 @@ void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
    hw->swapBuffers(getHwComposer());
}

void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
{
    RenderEngine& engine(getRenderEngine());
    const int32_t id = hw->getHwcDisplayId();
@@ -1775,7 +1775,11 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const
        if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
            ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
                  hw->getDisplayName().string());
            return;
            eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
            if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
              ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
            }
            return false;
        }

        // Never touch the framebuffer if we don't have any framebuffer layers
@@ -1883,6 +1887,7 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const

    // disable scissor at the end of the frame
    engine.disableScissor();
    return true;
}

void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
+4 −1
Original line number Diff line number Diff line
@@ -377,7 +377,10 @@ private:
    void doComposition();
    void doDebugFlashRegions();
    void doDisplayComposition(const sp<const DisplayDevice>& hw, const Region& dirtyRegion);
    void doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty);

    // compose surfaces for display hw. this fails if using GL and the surface
    // has been destroyed and is no longer valid.
    bool doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty);

    void postFramebuffer();
    void drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const;