diff options
author | Mathias Agopian <mathias@google.com> | 2012-09-24 18:07:21 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2012-09-24 18:07:21 -0700 |
commit | 52e21483fa48baeb4a88372d75e083bca2e92923 (patch) | |
tree | aaa2385de5c40d35cb307d3e41ff132c2df83dfd /services | |
parent | 500407a2c07ced40c36e7356574a47bcec9c2fd9 (diff) | |
download | frameworks_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
Diffstat (limited to 'services')
-rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 13 |
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 { |