From ee0ba57ed857974ae427810c932c06be57c39d3b Mon Sep 17 00:00:00 2001 From: Piotr WilczyƄski Date: Fri, 8 Mar 2024 15:29:56 +0000 Subject: Fix Smooth Display screen recording Only look at the peak refresh rate of the default display to determine if the back up smooth display feature flag has been turned on/off. Add missing tests for turning off Smooth Display and Force Peak Refresh Rate. Bug: 327562842 Test: adb shell dumpsys settings Test: adb shell dumpsys display Test: atest DisplayModeDirectorTest Change-Id: I24e6ab3763b9276e976a9f1e4d85d86d4a4d284c (cherry picked from commit ec350bb29c7666418f2cfe98cf4f994bfe443dbd) --- .../server/display/mode/DisplayModeDirector.java | 14 ++- .../display/mode/DisplayModeDirectorTest.java | 101 ++++++++++++++++++++- 2 files changed, 107 insertions(+), 8 deletions(-) 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 8b4e1ff4981f..64cbd5488d90 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -1015,12 +1015,15 @@ public class DisplayModeDirector { // Infinity means that we want the highest possible refresh rate minRefreshRate = highestRefreshRate; - if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled) { - // The flag had been turned off, we need to restore the original value + if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY) { + // The flag has been turned off, we need to restore the original value. We'll + // use the peak refresh rate of the default display. Settings.System.putFloatForUser(cr, Settings.System.MIN_REFRESH_RATE, highestRefreshRate, cr.getUserId()); } } else if (mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY && Math.round(minRefreshRate) == Math.round(highestRefreshRate)) { // The flag has been turned on, we need to upgrade the setting Settings.System.putFloatForUser(cr, Settings.System.MIN_REFRESH_RATE, @@ -1033,12 +1036,15 @@ public class DisplayModeDirector { // Infinity means that we want the highest possible refresh rate peakRefreshRate = highestRefreshRate; - if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled) { - // The flag had been turned off, we need to restore the original value + if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY) { + // The flag has been turned off, we need to restore the original value. We'll + // use the peak refresh rate of the default display. Settings.System.putFloatForUser(cr, Settings.System.PEAK_REFRESH_RATE, highestRefreshRate, cr.getUserId()); } } else if (mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY && Math.round(peakRefreshRate) == Math.round(highestRefreshRate)) { // The flag has been turned on, we need to upgrade the setting Settings.System.putFloatForUser(cr, Settings.System.PEAK_REFRESH_RATE, 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 64076e604414..3eced7fa025c 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 @@ -1631,12 +1631,25 @@ public class DisplayModeDirectorTest { director.start(sensorManager); director.injectSupportedModesByDisplay(supportedModesByDisplay); - setPeakRefreshRate(Float.POSITIVE_INFINITY); + // Disable Smooth Display + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); Vote vote1 = director.getVote(DISPLAY_ID, 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= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Enable Smooth Display + setPeakRefreshRate(Float.POSITIVE_INFINITY); + + vote1 = director.getVote(DISPLAY_ID, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, /* frameRateHigh= */ 130); assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, /* frameRateHigh= */ 140); } @@ -1654,9 +1667,17 @@ public class DisplayModeDirectorTest { SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); - setPeakRefreshRate(peakRefreshRate); + // Disable Smooth Display + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Enable Smooth Display + setPeakRefreshRate(peakRefreshRate); + + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */ peakRefreshRate); } @@ -1759,11 +1780,23 @@ public class DisplayModeDirectorTest { director.start(sensorManager); director.injectSupportedModesByDisplay(supportedModesByDisplay); - setMinRefreshRate(Float.POSITIVE_INFINITY); + // Disable Force Peak Refresh Rate + setMinRefreshRate(0); Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); Vote vote2 = director.getVote(DISPLAY_ID_2, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Enable Force Peak Refresh Rate + setMinRefreshRate(Float.POSITIVE_INFINITY); + + vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 130, /* frameRateHigh= */ Float.POSITIVE_INFINITY); assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 140, @@ -1783,9 +1816,17 @@ public class DisplayModeDirectorTest { SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); - setMinRefreshRate(minRefreshRate); + // Disable Force Peak Refresh Rate + setMinRefreshRate(0); Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Enable Force Peak Refresh Rate + setMinRefreshRate(minRefreshRate); + + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ minRefreshRate, /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @@ -1828,6 +1869,58 @@ public class DisplayModeDirectorTest { /* frameRateHigh= */ Float.POSITIVE_INFINITY); } + @Test + public void testPeakAndMinRefreshRate_FlagEnabled_DisplayWithOneMode() { + when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) + .thenReturn(true); + DisplayModeDirector director = + new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + Display.Mode[] modes1 = new Display.Mode[] { + new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 60), + new Display.Mode(/* modeId= */ 2, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 130), + }; + Display.Mode[] modes2 = new Display.Mode[] { + new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 60), + }; + SparseArray supportedModesByDisplay = new SparseArray<>(); + supportedModesByDisplay.put(DISPLAY_ID, modes1); + supportedModesByDisplay.put(DISPLAY_ID_2, modes2); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + director.start(sensorManager); + director.injectSupportedModesByDisplay(supportedModesByDisplay); + + // Disable Force Peak Refresh Rate and Smooth Display + setMinRefreshRate(0); + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Even though the highest refresh rate of the second display == the current min refresh + // rate == 60, Force Peak Refresh Rate should remain disabled + Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + Vote vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Even though the highest refresh rate of the second display == the current peak refresh + // rate == 60, Smooth Display should remain disabled + vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + } + @Test public void testSensorRegistration() { // First, configure brightness zones or DMD won't register for sensor data. -- cgit v1.2.3-59-g8ed1b