diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 391131d16..8143227d7 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -64,7 +64,6 @@ DisplayDevice::DisplayDevice( mDisplaySurface(displaySurface), mDisplay(EGL_NO_DISPLAY), mSurface(EGL_NO_SURFACE), - mContext(EGL_NO_CONTEXT), mDisplayWidth(), mDisplayHeight(), mFormat(), mFlags(), mPageFlipCount(), @@ -80,6 +79,16 @@ DisplayDevice::DisplayDevice( int format; window->query(window, NATIVE_WINDOW_FORMAT, &format); + // Make sure that composition can never be stalled by a virtual display + // consumer that isn't processing buffers fast enough. We have to do this + // in two places: + // * Here, in case the display is composed entirely by HWC. + // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the + // window's swap interval in eglMakeCurrent, so they'll override the + // interval we set here. + if (mType >= DisplayDevice::DISPLAY_VIRTUAL) + window->setSwapInterval(window, 0); + /* * Create our display's surface */ @@ -254,6 +263,8 @@ EGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const { if (sur != mSurface) { result = eglMakeCurrent(dpy, mSurface, mSurface, ctx); if (result == EGL_TRUE) { + if (mType >= DisplayDevice::DISPLAY_VIRTUAL) + eglSwapInterval(dpy, 0); setViewportAndProjection(); } } diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index ecf855a79..6f0ce88a1 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -171,7 +171,6 @@ private: EGLDisplay mDisplay; EGLSurface mSurface; - EGLContext mContext; int mDisplayWidth; int mDisplayHeight; PixelFormat mFormat;