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

Commit 3fb7a48b authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Reduce unnecessary wallpaper target searches

Because
- ActivityRecord#setVisibilityInner always calls
  requestUpdateWallpaperIfNeeded for visibility change.
- WallpaperController#mFindWallpaperTargetFunction doesn't
  check drawn state, the result of commitFinishDrawing
  won't affect wallpaper target.

Also optimize DisplayContent#mApplySurfaceChangesTransaction
a bit to reduce unnecessary method invocation.

Bug: 163976519
Flag: EXEMPT remove outdated code
Test: CtsWindowManagerDeviceActivity
Change-Id: Icee41a296ff41449b76e807634e6f7948d1cedd9
parent d6afc35a
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -5586,12 +5586,8 @@ final class ActivityRecord extends WindowToken {

    /** Updates draw state and shows drawn windows. */
    void commitFinishDrawing(SurfaceControl.Transaction t) {
        boolean committed = false;
        for (int i = mChildren.size() - 1; i >= 0; i--) {
            committed |= mChildren.get(i).commitFinishDrawing(t);
        }
        if (committed) {
            requestUpdateWallpaperIfNeeded();
            mChildren.get(i).commitFinishDrawing(t);
        }
    }

+8 −27
Original line number Diff line number Diff line
@@ -128,7 +128,6 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_KEEP_SCREE
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SCREEN_ON;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_SLEEP_TOKEN;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_TRANSACTIONS;
import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
@@ -591,8 +590,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

    WallpaperController mWallpaperController;

    boolean mWallpaperMayChange = false;

    /**
     * A perf hint session which will boost the refresh rate for the display and change sf duration
     * to handle larger workloads.
@@ -1021,25 +1018,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                    mImeLayeringTarget);

    private final Consumer<WindowState> mApplySurfaceChangesTransaction = w -> {
        final WindowSurfacePlacer surfacePlacer = mWmService.mWindowPlacerLocked;
        final RootWindowContainer root = mWmService.mRoot;

        if (w.mHasSurface) {
            // Take care of the window being ready to display.
            final boolean committed = w.mWinAnimator.commitFinishDrawingLocked();
            if (isDefaultDisplay && committed) {
                if (w.hasWallpaper()) {
                    ProtoLog.v(WM_DEBUG_WALLPAPER,
                            "First draw done in potential wallpaper target %s", w);
                    mWallpaperMayChange = true;
                    pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
                    if (DEBUG_LAYOUT_REPEATS) {
                        surfacePlacer.debugLayoutRepeats(
                                "wallpaper and commitFinishDrawingLocked true",
                                pendingLayoutChanges);
                    }
                }
            }
            w.mWinAnimator.commitFinishDrawingLocked();
        }

        // Update effect.
@@ -1055,7 +1036,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                mTmpApplySurfaceChangesTransactionState.obscured = true;
            }

            final boolean displayHasContent = root.handleNotObscuredLocked(w,
            final boolean displayHasContent = mRootWindowContainer.handleNotObscuredLocked(w,
                    mTmpApplySurfaceChangesTransactionState.obscured,
                    mTmpApplySurfaceChangesTransactionState.syswin);

@@ -1093,16 +1074,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                mTmpApplySurfaceChangesTransactionState.disableHdrConversion
                        |= !(w.mAttrs.isHdrConversionEnabled());

                final int preferredModeId = getDisplayPolicy().getRefreshRatePolicy()
                        .getPreferredModeId(w);
                final var refreshRatePolicy = getDisplayPolicy().getRefreshRatePolicy();
                final int preferredModeId = refreshRatePolicy.getPreferredModeId(w);

                if (w.getWindowingMode() != WINDOWING_MODE_PINNED
                if (preferredModeId != 0
                        && mTmpApplySurfaceChangesTransactionState.preferredModeId == 0
                        && preferredModeId != 0) {
                        && !w.inPinnedWindowingMode()) {
                    mTmpApplySurfaceChangesTransactionState.preferredModeId = preferredModeId;
                }

                final float preferredMinRefreshRate = getDisplayPolicy().getRefreshRatePolicy()
                final float preferredMinRefreshRate = refreshRatePolicy
                        .getPreferredMinRefreshRate(w);
                if (mTmpApplySurfaceChangesTransactionState.preferredMinRefreshRate == 0
                        && preferredMinRefreshRate != 0) {
@@ -1110,7 +1091,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                            preferredMinRefreshRate;
                }

                final float preferredMaxRefreshRate = getDisplayPolicy().getRefreshRatePolicy()
                final float preferredMaxRefreshRate = refreshRatePolicy
                        .getPreferredMaxRefreshRate(w);
                if (mTmpApplySurfaceChangesTransactionState.preferredMaxRefreshRate == 0
                        && preferredMaxRefreshRate != 0) {
+0 −13
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@ import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_KEEP_SCREE
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_ORIENTATION;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_STATES;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_TASKS;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
import static com.android.internal.protolog.WmProtoLogGroups.WM_SHOW_SURFACE_ALLOC;
import static com.android.server.policy.PhoneWindowManager.SYSTEM_DIALOG_REASON_ASSIST;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
@@ -796,18 +795,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        mWmService.mAtmService.mBackNavigationController
                .checkAnimationReady(defaultDisplay.mWallpaperController);

        for (int displayNdx = 0; displayNdx < mChildren.size(); ++displayNdx) {
            final DisplayContent displayContent = mChildren.get(displayNdx);
            if (displayContent.mWallpaperMayChange) {
                ProtoLog.v(WM_DEBUG_WALLPAPER, "Wallpaper may change!  Adjusting");
                displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
                if (DEBUG_LAYOUT_REPEATS) {
                    surfacePlacer.debugLayoutRepeats("WallpaperMayChange",
                            displayContent.pendingLayoutChanges);
                }
            }
        }

        if (mWmService.mFocusMayChange) {
            mWmService.mFocusMayChange = false;
            mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
+0 −27
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_WALLPAPER;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -41,7 +40,6 @@ import android.os.Debug;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.ArraySet;
import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseArray;
@@ -820,8 +818,6 @@ class WallpaperController {
    }

    void adjustWallpaperWindows() {
        mDisplayContent.mWallpaperMayChange = false;

        // First find top-most window that has asked to be on top of the wallpaper;
        // all wallpapers go behind it.
        findWallpaperTarget();
@@ -924,29 +920,6 @@ class WallpaperController {
        return transitionReady;
    }

    /**
     * Adjusts the wallpaper windows if the input display has a pending wallpaper layout or one of
     * the opening apps should be a wallpaper target.
     */
    void adjustWallpaperWindowsForAppTransitionIfNeeded(ArraySet<ActivityRecord> openingApps) {
        boolean adjust = false;
        if ((mDisplayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
            adjust = true;
        } else {
            for (int i = openingApps.size() - 1; i >= 0; --i) {
                final ActivityRecord activity = openingApps.valueAt(i);
                if (activity.windowsCanBeWallpaperTarget()) {
                    adjust = true;
                    break;
                }
            }
        }

        if (adjust) {
            adjustWallpaperWindows();
        }
    }

    void addWallpaperToken(WallpaperWindowToken token) {
        mWallpaperTokens.add(token);
    }
+3 −5
Original line number Diff line number Diff line
@@ -4277,14 +4277,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
    }

    /** Makes the surface of drawn window (COMMIT_DRAW_PENDING) to be visible. */
    boolean commitFinishDrawing(SurfaceControl.Transaction t) {
        boolean committed = mWinAnimator.commitFinishDrawingLocked();
        if (committed) {
    void commitFinishDrawing(SurfaceControl.Transaction t) {
        if (mWinAnimator.commitFinishDrawingLocked()) {
            // Ensure that the visibility of buffer layer is set.
            mWinAnimator.prepareSurfaceLocked(t);
        }
        for (int i = mChildren.size() - 1; i >= 0; i--) {
            committed |= mChildren.get(i).commitFinishDrawing(t);
            mChildren.get(i).commitFinishDrawing(t);
        }

        // When a new activity is showing, update dim in this transaction
@@ -4302,7 +4301,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        if (getAnimationLeash() != null) {
            t.merge(getSyncTransaction());
        }
        return committed;
    }

    // This must be called while inside a transaction.