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

Commit f16b4940 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Special case EGL_BAD_SURFACE" into lmp-dev

parents 88924b62 2cdbc7d2
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -91,7 +91,9 @@ void CanvasContext::setSurface(ANativeWindow* window) {
}

void CanvasContext::swapBuffers() {
    mEglManager.swapBuffers(mEglSurface);
    if (CC_UNLIKELY(!mEglManager.swapBuffers(mEglSurface))) {
        setSurface(NULL);
    }
    mHaveNewSurface = false;
}

@@ -102,8 +104,8 @@ void CanvasContext::requireSurface() {
}

bool CanvasContext::initialize(ANativeWindow* window) {
    if (mCanvas) return false;
    setSurface(window);
    if (mCanvas) return false;
    mCanvas = new OpenGLRenderer(mRenderThread.renderState());
    mCanvas->initProperties();
    return true;
+15 −3
Original line number Diff line number Diff line
@@ -254,11 +254,23 @@ void EglManager::beginFrame(EGLSurface surface, EGLint* width, EGLint* height) {
    eglBeginFrame(mEglDisplay, surface);
}

void EglManager::swapBuffers(EGLSurface surface) {
bool EglManager::swapBuffers(EGLSurface surface) {
    eglSwapBuffers(mEglDisplay, surface);
    EGLint err = eglGetError();
    LOG_ALWAYS_FATAL_IF(err != EGL_SUCCESS,
            "Encountered EGL error %d %s during rendering", err, egl_error_str(err));
    if (CC_LIKELY(err == EGL_SUCCESS)) {
        return true;
    }
    if (err == EGL_BAD_SURFACE) {
        // For some reason our surface was destroyed out from under us
        // This really shouldn't happen, but if it does we can recover easily
        // by just not trying to use the surface anymore
        ALOGW("swapBuffers encountered EGL_BAD_SURFACE on %p, halting rendering...", surface);
        return false;
    }
    LOG_ALWAYS_FATAL("Encountered EGL error %d %s during rendering",
            err, egl_error_str(err));
    // Impossible to hit this, but the compiler doesn't know that
    return false;
}

bool EglManager::enableDirtyRegions(EGLSurface surface) {
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public:
    // Returns true if the current surface changed, false if it was already current
    bool makeCurrent(EGLSurface surface);
    void beginFrame(EGLSurface surface, EGLint* width, EGLint* height);
    void swapBuffers(EGLSurface surface);
    bool swapBuffers(EGLSurface surface);

    bool enableDirtyRegions(EGLSurface surface);