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

Commit 78d69df3 authored by Mike Stroyan's avatar Mike Stroyan Committed by android-build-merger
Browse files

Merge "egl: recover from failed eglMakeCurrent" into oc-dev am: 35c63d45

am: 9473093a

Change-Id: If0865ff627694736f2a242d96e13fe16d8ee461f
parents 42ae84dd 9473093a
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -897,6 +897,42 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
            egl_tls_t::setContext(EGL_NO_CONTEXT);
        }
    } else {
        // Force return to current context for drivers that cannot handle errors
        EGLBoolean restore_result = EGL_FALSE;

        // get a reference to the old current objects
        ContextRef _c2(dp.get(), cur_c);
        SurfaceRef _d2(dp.get(), cur_c->draw);
        SurfaceRef _r2(dp.get(), cur_c->read);

        if (cur_c == NULL) {
            restore_result = dp->makeCurrent(c, cur_c,
                    EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT,
                    EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
        } else {
            c = cur_c;
            impl_ctx = c->context;
            impl_draw = EGL_NO_SURFACE;
            if (cur_c->draw != EGL_NO_SURFACE) {
                d = get_surface(cur_c->draw);
                impl_draw = d->surface;
            }
            impl_read = EGL_NO_SURFACE;
            if (cur_c->read != EGL_NO_SURFACE) {
                r = get_surface(cur_c->read);
                impl_read = r->surface;
            }
            restore_result = dp->makeCurrent(c, cur_c,
                    cur_c->draw, cur_c->read, cur_c->context,
                    impl_draw, impl_read, impl_ctx);
        }
        if (restore_result == EGL_TRUE) {
            _c2.acquire();
            _r2.acquire();
            _d2.acquire();
        } else {
            ALOGE("Could not restore original EGL context");
        }
        // this will ALOGE the error
        egl_connection_t* const cnx = &gEGLImpl;
        result = setError(cnx->egl.eglGetError(), (EGLBoolean)EGL_FALSE);