Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +8 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { Loading services/core/java/com/android/server/display/mode/Vote.java +21 −11 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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: Loading services/tests/displayservicetests/src/com/android/server/display/mode/DisplayObserverTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading @@ -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 Loading @@ -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() { Loading Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +8 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { Loading
services/core/java/com/android/server/display/mode/Vote.java +21 −11 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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: Loading
services/tests/displayservicetests/src/com/android/server/display/mode/DisplayObserverTest.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading @@ -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 Loading @@ -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() { Loading