Merge changes I47cd25c9,I7638ffe8 into jb-mr1-dev

* changes:
  don't call eglMakeCurrent() before calling HWC commit() on HWC 1.1
  handle EGL errors
This commit is contained in:
Mathias Agopian 2012-09-24 18:31:48 -07:00 committed by Android (Google) Code Review
commit 13de369980
2 changed files with 17 additions and 7 deletions

View File

@ -205,27 +205,34 @@ void DisplayDevice::flip(const Region& dirty) const
} }
void DisplayDevice::swapBuffers(HWComposer& hwc) const { void DisplayDevice::swapBuffers(HWComposer& hwc) const {
EGLBoolean success = EGL_TRUE;
if (hwc.initCheck() != NO_ERROR) { if (hwc.initCheck() != NO_ERROR) {
// no HWC, we call eglSwapBuffers() // no HWC, we call eglSwapBuffers()
eglSwapBuffers(mDisplay, mSurface); success = eglSwapBuffers(mDisplay, mSurface);
} else { } else {
// We have a valid HWC, but not all displays can use it, in particular // We have a valid HWC, but not all displays can use it, in particular
// the virtual displays are on their own. // the virtual displays are on their own.
// TODO: HWC 1.2 will allow virtual displays // TODO: HWC 1.2 will allow virtual displays
if (mType >= DisplayDevice::DISPLAY_VIRTUAL) { if (mType >= DisplayDevice::DISPLAY_VIRTUAL) {
// always call eglSwapBuffers() for virtual displays // always call eglSwapBuffers() for virtual displays
eglSwapBuffers(mDisplay, mSurface); success = eglSwapBuffers(mDisplay, mSurface);
} else if (hwc.supportsFramebufferTarget()) { } else if (hwc.supportsFramebufferTarget()) {
// as of hwc 1.1 we always call eglSwapBuffers if we have some // as of hwc 1.1 we always call eglSwapBuffers if we have some
// GLES layers // GLES layers
if (hwc.hasGlesComposition(mType)) { if (hwc.hasGlesComposition(mType)) {
eglSwapBuffers(mDisplay, mSurface); success = eglSwapBuffers(mDisplay, mSurface);
} }
} else { } else {
// HWC doesn't have the framebuffer target, we don't call // HWC doesn't have the framebuffer target, we don't call
// eglSwapBuffers(), since this is handled by HWComposer::commit(). // 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 { void DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {

View File

@ -927,10 +927,13 @@ void SurfaceFlinger::postFramebuffer()
HWComposer& hwc(getHwComposer()); HWComposer& hwc(getHwComposer());
if (hwc.initCheck() == NO_ERROR) { if (hwc.initCheck() == NO_ERROR) {
// FIXME: EGL spec says: if (!hwc.supportsFramebufferTarget()) {
// "surface must be bound to the calling thread's current context, // EGL spec says:
// for the current rendering API." // "surface must be bound to the calling thread's current context,
DisplayDevice::makeCurrent(mEGLDisplay, getDefaultDisplayDevice(), mEGLContext); // for the current rendering API."
DisplayDevice::makeCurrent(mEGLDisplay,
getDefaultDisplayDevice(), mEGLContext);
}
hwc.commit(); hwc.commit();
} }