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

Commit a269e21f authored by Ady Abraham's avatar Ady Abraham Committed by android-build-team Robot
Browse files

SurfaceFlinger: add a sysprop for GL backpressure

In some devices where SF misses a frame in GL comp, HWC queue may
get stuffed. This causes application to block longer on dequeueBuffer
which leads to jank.

Test: 1. Open Camera
      2. Swipe horizontally to go back to previous app.

Bug: 138083790
Change-Id: I4c5963cb7ba7f9b10254c77dc7117ca3acac81cf
(cherry picked from commit 4658e11c)
parent eeae637e
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -353,6 +353,11 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI
    mPropagateBackpressure = !atoi(value);
    mPropagateBackpressure = !atoi(value);
    ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");
    ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");


    property_get("debug.sf.enable_gl_backpressure", value, "0");
    mPropagateBackpressureClientComposition = atoi(value);
    ALOGI_IF(mPropagateBackpressureClientComposition,
             "Enabling backpressure propagation for Client Composition");

    property_get("debug.sf.enable_hwc_vds", value, "0");
    property_get("debug.sf.enable_hwc_vds", value, "0");
    mUseHwcVirtualDisplays = atoi(value);
    mUseHwcVirtualDisplays = atoi(value);
    ALOGI_IF(mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
    ALOGI_IF(mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
@@ -1670,9 +1675,9 @@ void SurfaceFlinger::onMessageReceived(int32_t what) NO_THREAD_SAFETY_ANALYSIS {
                break;
                break;
            }
            }


            // For now, only propagate backpressure when missing a hwc frame.
            if (frameMissed && mPropagateBackpressure) {
            if (hwcFrameMissed && !gpuFrameMissed) {
                if ((hwcFrameMissed && !gpuFrameMissed) ||
                if (mPropagateBackpressure) {
                    mPropagateBackpressureClientComposition) {
                    signalLayerUpdate();
                    signalLayerUpdate();
                    break;
                    break;
                }
                }
+1 −0
Original line number Original line Diff line number Diff line
@@ -1003,6 +1003,7 @@ private:
    volatile nsecs_t mDebugInTransaction = 0;
    volatile nsecs_t mDebugInTransaction = 0;
    bool mForceFullDamage = false;
    bool mForceFullDamage = false;
    bool mPropagateBackpressure = true;
    bool mPropagateBackpressure = true;
    bool mPropagateBackpressureClientComposition = false;
    std::unique_ptr<SurfaceInterceptor> mInterceptor;
    std::unique_ptr<SurfaceInterceptor> mInterceptor;
    SurfaceTracing mTracing{*this};
    SurfaceTracing mTracing{*this};
    bool mTracingEnabled = false;
    bool mTracingEnabled = false;