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:
commit
13de369980
@ -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 {
|
||||||
|
@ -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()) {
|
||||||
|
// EGL spec says:
|
||||||
// "surface must be bound to the calling thread's current context,
|
// "surface must be bound to the calling thread's current context,
|
||||||
// for the current rendering API."
|
// for the current rendering API."
|
||||||
DisplayDevice::makeCurrent(mEGLDisplay, getDefaultDisplayDevice(), mEGLContext);
|
DisplayDevice::makeCurrent(mEGLDisplay,
|
||||||
|
getDefaultDisplayDevice(), mEGLContext);
|
||||||
|
}
|
||||||
hwc.commit();
|
hwc.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user