summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-09-24 18:07:21 -0700
committerMathias Agopian <mathias@google.com>2012-09-24 18:07:21 -0700
commit52e21483fa48baeb4a88372d75e083bca2e92923 (patch)
treeaaa2385de5c40d35cb307d3e41ff132c2df83dfd
parent500407a2c07ced40c36e7356574a47bcec9c2fd9 (diff)
downloadframeworks_native-52e21483fa48baeb4a88372d75e083bca2e92923.zip
frameworks_native-52e21483fa48baeb4a88372d75e083bca2e92923.tar.gz
frameworks_native-52e21483fa48baeb4a88372d75e083bca2e92923.tar.bz2
handle EGL errors
for now we just restart the runtime. bug: 7225248 Change-Id: I7638ffe82075a4db9e7e6f9e35cf48afcb5a387a
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index 81ce27e..56852da 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -205,27 +205,34 @@ void DisplayDevice::flip(const Region& dirty) const
}
void DisplayDevice::swapBuffers(HWComposer& hwc) const {
+ EGLBoolean success = EGL_TRUE;
if (hwc.initCheck() != NO_ERROR) {
// no HWC, we call eglSwapBuffers()
- eglSwapBuffers(mDisplay, mSurface);
+ success = eglSwapBuffers(mDisplay, mSurface);
} else {
// We have a valid HWC, but not all displays can use it, in particular
// the virtual displays are on their own.
// TODO: HWC 1.2 will allow virtual displays
if (mType >= DisplayDevice::DISPLAY_VIRTUAL) {
// always call eglSwapBuffers() for virtual displays
- eglSwapBuffers(mDisplay, mSurface);
+ success = eglSwapBuffers(mDisplay, mSurface);
} else if (hwc.supportsFramebufferTarget()) {
// as of hwc 1.1 we always call eglSwapBuffers if we have some
// GLES layers
if (hwc.hasGlesComposition(mType)) {
- eglSwapBuffers(mDisplay, mSurface);
+ success = eglSwapBuffers(mDisplay, mSurface);
}
} else {
// HWC doesn't have the framebuffer target, we don't call
// eglSwapBuffers(), since this is handled by HWComposer::commit().
}
}
+
+ // TODO: we should at least handle EGL_CONTEXT_LOST, by recreating the
+ // context and resetting our state.
+ LOG_ALWAYS_FATAL_IF(!success,
+ "eglSwapBuffers(%p, %p) failed with 0x%8x",
+ mDisplay, mSurface, eglGetError());
}
void DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {