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

Commit 969a9dc5 authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "Connected displays: adding render rate sync" into main

parents 5ae865ae 97b5cc01
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1592,6 +1592,12 @@ public class DisplayModeDirector {
                                - SYNCHRONIZED_REFRESH_RATE_TOLERANCE,
                            SYNCHRONIZED_REFRESH_RATE_TARGET
                                + SYNCHRONIZED_REFRESH_RATE_TOLERANCE));
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE,
                    Vote.forRenderFrameRates(
                            SYNCHRONIZED_REFRESH_RATE_TARGET
                                    - SYNCHRONIZED_REFRESH_RATE_TOLERANCE,
                            SYNCHRONIZED_REFRESH_RATE_TARGET
                                    + SYNCHRONIZED_REFRESH_RATE_TOLERANCE));
        }

        private void removeDisplaysSynchronizedPeakRefreshRate(final int displayId) {
@@ -1603,11 +1609,12 @@ public class DisplayModeDirector {
                    return;
                }
                mExternalDisplaysConnected.remove(displayId);
                if (mExternalDisplaysConnected.size() != 0) {
                if (!mExternalDisplaysConnected.isEmpty()) {
                    return;
                }
            }
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_SYNCHRONIZED_REFRESH_RATE, null);
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE, null);
        }

        private void updateDisplayDeviceConfig(int displayId) {
+21 −11
Original line number Diff line number Diff line
@@ -92,48 +92,55 @@ interface Vote {
    // render rate vote can still apply
    int PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE = 9;

    // Restrict all displays to 60Hz when external display is connected. It votes [59Hz, 61Hz].
    // Restrict all displays physical refresh rate to 60Hz when external display is connected.
    // It votes [59Hz, 61Hz].
    int PRIORITY_SYNCHRONIZED_REFRESH_RATE = 10;

    // PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE has a higher priority than
    // PRIORITY_SYNCHRONIZED_REFRESH_RATE and will limit render rate to [59Hz, 61Hz].
    // In case physical refresh rate vote discarded (due to physical refresh rate not supported),
    // render rate vote can still apply.
    int PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE = 11;

    // Restrict displays max available resolution and refresh rates. It votes [0, LIMIT]
    int PRIORITY_LIMIT_MODE = 11;
    int PRIORITY_LIMIT_MODE = 12;

    // To avoid delay in switching between 60HZ -> 90HZ when activating LHBM, set refresh
    // rate to max value (same as for PRIORITY_UDFPS) on lock screen
    int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 12;
    int PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE = 13;

    // For concurrent displays we want to limit refresh rate on all displays
    int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 13;
    int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 14;

    // For internal application to limit display modes to specific ids
    int PRIORITY_SYSTEM_REQUESTED_MODES = 14;
    int PRIORITY_SYSTEM_REQUESTED_MODES = 15;

    // PRIORITY_LOW_POWER_MODE_MODES limits display modes to specific refreshRate-vsync pairs if
    // Settings.Global.LOW_POWER_MODE is on.
    // Lower priority that PRIORITY_LOW_POWER_MODE_RENDER_RATE and if discarded (due to other
    // higher priority votes), render rate limit can still apply
    int PRIORITY_LOW_POWER_MODE_MODES = 15;
    int PRIORITY_LOW_POWER_MODE_MODES = 16;

    // PRIORITY_LOW_POWER_MODE_RENDER_RATE force the render frame rate to [0, 60HZ] if
    // Settings.Global.LOW_POWER_MODE is on.
    int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 16;
    int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 17;

    // PRIORITY_FLICKER_REFRESH_RATE_SWITCH votes for disabling refresh rate switching. If the
    // higher priority voters' result is a range, it will fix the rate to a single choice.
    // It's used to avoid refresh rate switches in certain conditions which may result in the
    // user seeing the display flickering when the switches occur.
    int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 17;
    int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 18;

    // Force display to [0, 60HZ] if skin temperature is at or above CRITICAL.
    int PRIORITY_SKIN_TEMPERATURE = 18;
    int PRIORITY_SKIN_TEMPERATURE = 19;

    // The proximity sensor needs the refresh rate to be locked in order to function, so this is
    // set to a high priority.
    int PRIORITY_PROXIMITY = 19;
    int PRIORITY_PROXIMITY = 20;

    // The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order
    // to function, so this needs to be the highest priority of all votes.
    int PRIORITY_UDFPS = 20;
    int PRIORITY_UDFPS = 21;

    @IntDef(prefix = { "PRIORITY_" }, value = {
            PRIORITY_DEFAULT_RENDER_FRAME_RATE,
@@ -147,6 +154,7 @@ interface Vote {
            PRIORITY_USER_SETTING_PEAK_REFRESH_RATE,
            PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
            PRIORITY_SYNCHRONIZED_REFRESH_RATE,
            PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE,
            PRIORITY_LIMIT_MODE,
            PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE,
            PRIORITY_LAYOUT_LIMITED_FRAME_RATE,
@@ -267,6 +275,8 @@ interface Vote {
                return "PRIORITY_LIMIT_MODE";
            case PRIORITY_SYNCHRONIZED_REFRESH_RATE:
                return "PRIORITY_SYNCHRONIZED_REFRESH_RATE";
            case PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE:
                return "PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE";
            case PRIORITY_USER_SETTING_PEAK_REFRESH_RATE:
                return "PRIORITY_USER_SETTING_PEAK_REFRESH_RATE";
            case PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE:
+11 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.view.Display.Mode.INVALID_MODE_ID;
import static com.android.server.display.mode.DisplayModeDirector.SYNCHRONIZED_REFRESH_RATE_TOLERANCE;
import static com.android.server.display.mode.Vote.PRIORITY_LIMIT_MODE;
import static com.android.server.display.mode.Vote.PRIORITY_SYNCHRONIZED_REFRESH_RATE;
import static com.android.server.display.mode.Vote.PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE;
import static com.android.server.display.mode.Vote.PRIORITY_USER_SETTING_DISPLAY_PREFERRED_SIZE;
import static com.android.server.display.mode.VotesStorage.GLOBAL_ID;

@@ -360,16 +361,22 @@ public class DisplayObserverTest {
                .thenReturn(true);
        init();
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
        mObserver.onDisplayAdded(EXTERNAL_DISPLAY);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(
                Vote.forPhysicalRefreshRates(
                        MAX_REFRESH_RATE - SYNCHRONIZED_REFRESH_RATE_TOLERANCE,
                        MAX_REFRESH_RATE + SYNCHRONIZED_REFRESH_RATE_TOLERANCE));
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(
                Vote.forRenderFrameRates(
                        MAX_REFRESH_RATE - SYNCHRONIZED_REFRESH_RATE_TOLERANCE,
                        MAX_REFRESH_RATE + SYNCHRONIZED_REFRESH_RATE_TOLERANCE));

        // Remove external display and check that sync vote is no longer present.
        mObserver.onDisplayRemoved(EXTERNAL_DISPLAY);

        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
    }

    /** External display added, disabled feature refresh rates synchronization */
@@ -383,8 +390,10 @@ public class DisplayObserverTest {
                .thenReturn(true);
        init();
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
        mObserver.onDisplayAdded(EXTERNAL_DISPLAY);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
    }

    /** External display not applied refresh rates synchronization, because
@@ -397,8 +406,10 @@ public class DisplayObserverTest {
        when(mDisplayManagerFlags.isDisplaysRefreshRatesSynchronizationEnabled()).thenReturn(true);
        init();
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
        mObserver.onDisplayAdded(EXTERNAL_DISPLAY);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_REFRESH_RATE)).isEqualTo(null);
        assertThat(getVote(GLOBAL_ID, PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE)).isEqualTo(null);
    }

    private void init() {