Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f460f55c authored by Jesse Hall's avatar Jesse Hall
Browse files

Set the swap interval of virtual display surfaces to 0

This prevents slow/malicious virtual display consumers from
backpressuring SurfaceFlinger and preventing it from updating other
displays.

Bug: 10193714
Change-Id: I3e877d97202628d2d9abea24b66576f38299c14d
parent 687821c0
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -63,7 +63,6 @@ DisplayDevice::DisplayDevice(
      mDisplaySurface(displaySurface),
      mDisplaySurface(displaySurface),
      mDisplay(EGL_NO_DISPLAY),
      mDisplay(EGL_NO_DISPLAY),
      mSurface(EGL_NO_SURFACE),
      mSurface(EGL_NO_SURFACE),
      mContext(EGL_NO_CONTEXT),
      mDisplayWidth(), mDisplayHeight(), mFormat(),
      mDisplayWidth(), mDisplayHeight(), mFormat(),
      mFlags(),
      mFlags(),
      mPageFlipCount(),
      mPageFlipCount(),
@@ -79,6 +78,16 @@ DisplayDevice::DisplayDevice(
    int format;
    int format;
    window->query(window, NATIVE_WINDOW_FORMAT, &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
     * Create our display's surface
     */
     */
@@ -253,6 +262,8 @@ EGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
    if (sur != mSurface) {
    if (sur != mSurface) {
        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
        result = eglMakeCurrent(dpy, mSurface, mSurface, ctx);
        if (result == EGL_TRUE) {
        if (result == EGL_TRUE) {
            if (mType >= DisplayDevice::DISPLAY_VIRTUAL)
                eglSwapInterval(dpy, 0);
            setViewportAndProjection();
            setViewportAndProjection();
        }
        }
    }
    }
+0 −1
Original line number Original line Diff line number Diff line
@@ -170,7 +170,6 @@ private:


    EGLDisplay      mDisplay;
    EGLDisplay      mDisplay;
    EGLSurface      mSurface;
    EGLSurface      mSurface;
    EGLContext      mContext;
    int             mDisplayWidth;
    int             mDisplayWidth;
    int             mDisplayHeight;
    int             mDisplayHeight;
    PixelFormat     mFormat;
    PixelFormat     mFormat;