diff options
| author | 2023-11-28 18:15:23 +0000 | |
|---|---|---|
| committer | 2023-11-28 18:15:23 +0000 | |
| commit | 7a473d4fb58f59bd3c1bebb54a1c3cef38ce72b9 (patch) | |
| tree | 28dec78ab918e31022ffb061c6824db437dcce45 | |
| parent | bb8ea9a61c386843556851e2cf1114396263b8f2 (diff) | |
| parent | 295c2a613a50668accfd22a1ec52be82636e7818 (diff) | |
Merge "Revert "Min and max refresh rate per display"" into main
4 files changed, 35 insertions, 159 deletions
diff --git a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java index f5fe12eb66c0..e55c64199f45 100644 --- a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java +++ b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java @@ -37,22 +37,11 @@ public class RefreshRateSettingsUtils { * @return The highest refresh rate */ public static float findHighestRefreshRateForDefaultDisplay(Context context) { - return findHighestRefreshRate(context, Display.DEFAULT_DISPLAY); - } - - /** - * Find the highest refresh rate among all the modes of the specified display. - * - * @param context The context - * @param displayId The display ID - * @return The highest refresh rate - */ - public static float findHighestRefreshRate(Context context, int displayId) { final DisplayManager dm = context.getSystemService(DisplayManager.class); - final Display display = dm.getDisplay(displayId); + final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY); if (display == null) { - Log.w(TAG, "No valid display device with ID = " + displayId); + Log.w(TAG, "No valid default display device"); return DEFAULT_REFRESH_RATE; } diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java index 8eb03ec0d3bd..8fa838de3327 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -21,8 +21,8 @@ import static android.hardware.display.DisplayManagerInternal.REFRESH_RATE_LIMIT import static android.os.PowerManager.BRIGHTNESS_INVALID_FLOAT; import static android.view.Display.Mode.INVALID_MODE_ID; -import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRate; import static com.android.server.display.DisplayDeviceConfig.DEFAULT_LOW_REFRESH_RATE; +import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay; import android.annotation.IntegerRes; import android.annotation.NonNull; @@ -925,16 +925,11 @@ public class DisplayModeDirector { } @VisibleForTesting - DisplayObserver getDisplayObserver() { - return mDisplayObserver; - } - - @VisibleForTesting DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings( float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) { synchronized (mLock) { - mSettingsObserver.updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, - defaultRefreshRate, Display.DEFAULT_DISPLAY); + mSettingsObserver.updateRefreshRateSettingLocked( + minRefreshRate, peakRefreshRate, defaultRefreshRate); return getDesiredDisplayModeSpecs(Display.DEFAULT_DISPLAY); } } @@ -1268,23 +1263,9 @@ public class DisplayModeDirector { mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode); } - /** - * Update refresh rate settings for all displays - */ private void updateRefreshRateSettingLocked() { - Display[] displays = mInjector.getDisplays(); - for (int i = 0; i < displays.length; i++) { - updateRefreshRateSettingLocked(displays[i].getDisplayId()); - } - } - - /** - * Update refresh rate settings for a specific display - * @param displayId The display ID - */ - private void updateRefreshRateSettingLocked(int displayId) { final ContentResolver cr = mContext.getContentResolver(); - float highestRefreshRate = findHighestRefreshRate(mContext, displayId); + float highestRefreshRate = findHighestRefreshRateForDefaultDisplay(mContext); float minRefreshRate = Settings.System.getFloatForUser(cr, Settings.System.MIN_REFRESH_RATE, 0f, cr.getUserId()); @@ -1312,12 +1293,11 @@ public class DisplayModeDirector { } } - updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate, - displayId); + updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate); } - private void updateRefreshRateSettingLocked(float minRefreshRate, float peakRefreshRate, - float defaultRefreshRate, int displayId) { + private void updateRefreshRateSettingLocked( + float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) { // TODO(b/156304339): The logic in here, aside from updating the refresh rate votes, is // used to predict if we're going to be doing frequent refresh rate switching, and if // so, enable the brightness observer. The logic here is more complicated and fragile @@ -1325,9 +1305,9 @@ public class DisplayModeDirector { Vote peakVote = peakRefreshRate == 0f ? null : Vote.forRenderFrameRates(0f, Math.max(minRefreshRate, peakRefreshRate)); - mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE, + mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE, peakVote); - mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE, + mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE, Vote.forRenderFrameRates(minRefreshRate, Float.POSITIVE_INFINITY)); Vote defaultVote = defaultRefreshRate == 0f @@ -1484,8 +1464,7 @@ public class DisplayModeDirector { } } - @VisibleForTesting - public final class DisplayObserver implements DisplayManager.DisplayListener { + private final class DisplayObserver implements DisplayManager.DisplayListener { // Note that we can never call into DisplayManager or any of the non-POD classes it // returns, while holding mLock since it may call into DMS, which might be simultaneously // calling into us already holding its own lock. @@ -1577,7 +1556,6 @@ public class DisplayModeDirector { updateDisplayModes(displayId, displayInfo); updateLayoutLimitedFrameRate(displayId, displayInfo); updateUserSettingDisplayPreferredSize(displayInfo); - mSettingsObserver.updateRefreshRateSettingLocked(displayId); } @Nullable diff --git a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java index b7cbac5a7f18..5c50acb13f30 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java @@ -72,27 +72,14 @@ public class RefreshRateSettingsUtilsTest { @Test public void testFindHighestRefreshRateForDefaultDisplay() { - when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock); - assertEquals(120, + when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null); + assertEquals(DEFAULT_REFRESH_RATE, RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext), /* delta= */ 0); - } - @Test - public void testFindHighestRefreshRate() { - int displayId = 13; - when(mDisplayManagerMock.getDisplay(displayId)).thenReturn(mDisplayMock); + when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock); assertEquals(120, - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, displayId), - /* delta= */ 0); - } - - @Test - public void testFindHighestRefreshRate_DisplayIsNull() { - when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null); - assertEquals(DEFAULT_REFRESH_RATE, RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext), /* delta= */ 0); - } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java index d0859232778d..60a0c039dd03 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java @@ -290,7 +290,6 @@ public class DisplayModeDirectorTest { }; private static final int DISPLAY_ID = Display.DEFAULT_DISPLAY; - private static final int DISPLAY_ID_2 = Display.DEFAULT_DISPLAY + 1; private static final int MODE_ID = 1; private static final float TRANSITION_POINT = 0.763f; @@ -1551,12 +1550,9 @@ public class DisplayModeDirectorTest { public void testPeakRefreshRate_FlagEnabled() { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); - float highestRefreshRate1 = 130; - float highestRefreshRate2 = 132; - doReturn(highestRefreshRate1).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - doReturn(highestRefreshRate2).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2)); + float highestRefreshRate = 130; + doReturn(highestRefreshRate).when(() -> + RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext)); DisplayModeDirector director = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); @@ -1567,14 +1563,10 @@ public class DisplayModeDirectorTest { setPeakRefreshRate(Float.POSITIVE_INFINITY); - Vote vote1 = director.getVote(DISPLAY_ID, + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); - Vote vote2 = director.getVote(DISPLAY_ID_2, - Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, - /* frameRateHigh= */ highestRefreshRate1); - assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, - /* frameRateHigh= */ highestRefreshRate2); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */ + highestRefreshRate); } @Test @@ -1592,54 +1584,19 @@ public class DisplayModeDirectorTest { setPeakRefreshRate(peakRefreshRate); - Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, - /* frameRateHigh= */ peakRefreshRate); - } - - @Test - public void testPeakRefreshRate_DisplayChanged() { - when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) - .thenReturn(true); - float highestRefreshRate = 130; - doReturn(highestRefreshRate).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); - - Sensor lightSensor = createLightSensor(); - SensorManager sensorManager = createMockSensorManager(lightSensor); - director.start(sensorManager); - - setPeakRefreshRate(Float.POSITIVE_INFINITY); - - Vote vote = director.getVote(DISPLAY_ID, + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, - /* frameRateHigh= */ highestRefreshRate); - - // The highest refresh rate of the display changes - highestRefreshRate = 140; - doReturn(highestRefreshRate).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - director.getDisplayObserver().onDisplayChanged(DISPLAY_ID); - - vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, - /* frameRateHigh= */ highestRefreshRate); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */ + peakRefreshRate); } @Test public void testMinRefreshRate_FlagEnabled() { when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) .thenReturn(true); - float highestRefreshRate1 = 130; - float highestRefreshRate2 = 132; - doReturn(highestRefreshRate1).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - doReturn(highestRefreshRate2).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2)); + float highestRefreshRate = 130; + doReturn(highestRefreshRate).when(() -> + RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext)); DisplayModeDirector director = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); @@ -1650,12 +1607,9 @@ public class DisplayModeDirectorTest { setMinRefreshRate(Float.POSITIVE_INFINITY); - Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); - Vote vote2 = director.getVote(DISPLAY_ID_2, + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ highestRefreshRate1, - /* frameRateHigh= */ Float.POSITIVE_INFINITY); - assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ highestRefreshRate2, + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate, /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @@ -1674,44 +1628,13 @@ public class DisplayModeDirectorTest { setMinRefreshRate(minRefreshRate); - Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, + Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ minRefreshRate, /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @Test - public void testMinRefreshRate_DisplayChanged() { - when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) - .thenReturn(true); - float highestRefreshRate = 130; - doReturn(highestRefreshRate).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); - - Sensor lightSensor = createLightSensor(); - SensorManager sensorManager = createMockSensorManager(lightSensor); - director.start(sensorManager); - - setMinRefreshRate(Float.POSITIVE_INFINITY); - - Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate, - /* frameRateHigh= */ Float.POSITIVE_INFINITY); - - // The highest refresh rate of the display changes - highestRefreshRate = 140; - doReturn(highestRefreshRate).when(() -> - RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID)); - director.getDisplayObserver().onDisplayChanged(DISPLAY_ID); - - vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); - assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate, - /* frameRateHigh= */ Float.POSITIVE_INFINITY); - } - - @Test public void testSensorRegistration() { // First, configure brightness zones or DMD won't register for sensor data. final FakeDeviceConfig config = mInjector.getDeviceConfig(); @@ -3406,7 +3329,7 @@ public class DisplayModeDirectorTest { public static class FakesInjector implements DisplayModeDirector.Injector { private final FakeDeviceConfig mDeviceConfig; private final DisplayInfo mDisplayInfo; - private final Map<Integer, Display> mDisplays; + private final Display mDisplay; private boolean mDisplayInfoValid = true; private final DisplayManagerInternal mDisplayManagerInternal; private final StatusBarManagerInternal mStatusBarManagerInternal; @@ -3427,8 +3350,7 @@ public class DisplayModeDirectorTest { mDisplayInfo.defaultModeId = MODE_ID; mDisplayInfo.supportedModes = new Display.Mode[] {new Display.Mode(MODE_ID, 800, 600, /* refreshRate= */ 60)}; - mDisplays = Map.of(DISPLAY_ID, createDisplay(DISPLAY_ID), - DISPLAY_ID_2, createDisplay(DISPLAY_ID_2)); + mDisplay = createDisplay(DISPLAY_ID); mDisplayManagerInternal = displayManagerInternal; mStatusBarManagerInternal = statusBarManagerInternal; mSensorManagerInternal = sensorManagerInternal; @@ -3459,12 +3381,12 @@ public class DisplayModeDirectorTest { @Override public Display getDisplay(int displayId) { - return mDisplays.get(displayId); + return mDisplay; } @Override public Display[] getDisplays() { - return mDisplays.values().toArray(new Display[0]); + return new Display[] { mDisplay }; } @Override |