summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2014-09-17 16:06:36 -0700
committerJohn Reck <jreck@google.com>2014-09-17 16:09:57 -0700
commit2cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5ea (patch)
treea129c07e75038b92257f5c6d16eb5dc13c79f8d6
parent9077cbc30e6c71c8d103ae44b0c30b765e42f66b (diff)
downloadframeworks_base-2cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5ea.zip
frameworks_base-2cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5ea.tar.gz
frameworks_base-2cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5ea.tar.bz2
Special case EGL_BAD_SURFACE
Bug: 17516789 Change-Id: I3dcb10360c2aef6326f7dbbff6815866d4c143b6
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp6
-rw-r--r--libs/hwui/renderthread/EglManager.cpp18
-rw-r--r--libs/hwui/renderthread/EglManager.h2
3 files changed, 20 insertions, 6 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 5e6796c..832d170 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -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;
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index e030cdb..a87834e 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -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) {
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index a844cfc..71213fb 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -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);