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

Commit 7f40290b authored by Chia-I Wu's avatar Chia-I Wu
Browse files

surfaceflinger: add RenderEngine::setCurrentSurface

setCurrentSurface is a wrapper to eglMakeCurrent and it uses the EGL
context implied by the RenderEngine.  This also allows us to
simplify DisplayDevice::makeCurrent.

Test: SurfaceFlinger_test
Change-Id: Idab581f0ef79af7263159a558d8fad493a198ce7
parent 8601f886
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -290,14 +290,14 @@ uint32_t DisplayDevice::getFlags() const
    return mFlags;
}

EGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
EGLBoolean DisplayDevice::makeCurrent() const {
    EGLBoolean result = EGL_TRUE;
    EGLSurface sur = eglGetCurrentSurface(EGL_DRAW);
    if (sur != mSurface) {
        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
        result = mFlinger->getRenderEngine().setCurrentSurface(mSurface);
        if (result == EGL_TRUE) {
            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
                eglSwapInterval(dpy, 0);
                eglSwapInterval(mDisplay, 0);
        }
    }
    setViewportAndProjection();
+1 −1
Original line number Diff line number Diff line
@@ -155,7 +155,7 @@ public:
    void setDisplayName(const String8& displayName);
    const String8& getDisplayName() const { return mDisplayName; }

    EGLBoolean makeCurrent(EGLDisplay dpy, EGLContext ctx) const;
    EGLBoolean makeCurrent() const;
    void setViewportAndProjection() const;

    const sp<Fence>& getClientTargetAcquireFence() const;
+8 −0
Original line number Diff line number Diff line
@@ -187,6 +187,14 @@ EGLContext RenderEngine::getEGLContext() const {
    return mEGLContext;
}

bool RenderEngine::setCurrentSurface(EGLSurface surface) {
    return eglMakeCurrent(mEGLDisplay, surface, surface, mEGLContext) == EGL_TRUE;
}

void RenderEngine::resetCurrentSurface() {
    eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
}

void RenderEngine::checkErrors() const {
    do {
        // there could be more than one error flag
+3 −0
Original line number Diff line number Diff line
@@ -99,6 +99,9 @@ public:
        int getStatus() const;
    };

    bool setCurrentSurface(EGLSurface surface);
    void resetCurrentSurface();

    // set-up
    virtual void checkErrors() const;
    virtual void setViewportAndProjection(size_t vpw, size_t vph,
+7 −7
Original line number Diff line number Diff line
@@ -1313,7 +1313,7 @@ void SurfaceFlinger::createDefaultDisplayDevice() {

    // make the GLContext current so that we can create textures when creating
    // Layers (which may happens before we render something)
    hw->makeCurrent(mEGLDisplay, mEGLContext);
    hw->makeCurrent();
}

void SurfaceFlinger::onHotplugReceived(int32_t sequenceId,
@@ -1384,7 +1384,7 @@ void SurfaceFlinger::resetDisplayState() {
    // mCurrentState and mDrawingState and re-apply all changes when we make the
    // transition.
    mDrawingState.displays.clear();
    eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    getRenderEngine().resetCurrentSurface();
    mDisplays.clear();
}

@@ -2041,7 +2041,7 @@ void SurfaceFlinger::postFramebuffer()
            mHwc->presentAndGetReleaseFences(hwcId);
        }
        displayDevice->onSwapBuffersCompleted();
        displayDevice->makeCurrent(mEGLDisplay, mEGLContext);
        displayDevice->makeCurrent();
        for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
            // The layer buffer from the previous frame (if any) is released
            // by HWC only when the release fence from this frame (if any) is
@@ -2167,7 +2167,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                        // be sure that nothing associated with this display
                        // is current.
                        const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
                        defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
                        defaultDisplay->makeCurrent();
                        sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
                        if (hw != NULL)
                            hw->disconnect(getHwComposer());
@@ -2711,13 +2711,13 @@ bool SurfaceFlinger::doComposeSurfaces(
                displayDevice->getWideColorSupport() && !mForceNativeColorMode);
        mRenderEngine->setColorMode(mForceNativeColorMode ?
                HAL_COLOR_MODE_NATIVE : displayDevice->getActiveColorMode());
        if (!displayDevice->makeCurrent(mEGLDisplay, mEGLContext)) {
        if (!displayDevice->makeCurrent()) {
            ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
                  displayDevice->getDisplayName().string());
            eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
            getRenderEngine().resetCurrentSurface();

            // |mStateLock| not needed as we are on the main thread
            if(!getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext)) {
            if(!getDefaultDisplayDeviceLocked()->makeCurrent()) {
              ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
            }
            return false;