Merge "Special case EGL_BAD_SURFACE" into lmp-dev
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user