Merge changes I47cd25c9,I7638ffe8 into jb-mr1-dev
* changes:
don't call eglMakeCurrent() before calling HWC commit() on HWC 1.1
handle EGL errors
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::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 {
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8372691..bc7552d 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -927,10 +927,13 @@
HWComposer& hwc(getHwComposer());
if (hwc.initCheck() == NO_ERROR) {
- // FIXME: EGL spec says:
- // "surface must be bound to the calling thread's current context,
- // for the current rendering API."
- DisplayDevice::makeCurrent(mEGLDisplay, getDefaultDisplayDevice(), mEGLContext);
+ if (!hwc.supportsFramebufferTarget()) {
+ // EGL spec says:
+ // "surface must be bound to the calling thread's current context,
+ // for the current rendering API."
+ DisplayDevice::makeCurrent(mEGLDisplay,
+ getDefaultDisplayDevice(), mEGLContext);
+ }
hwc.commit();
}