diff options
| author | 2022-12-02 21:44:51 +0000 | |
|---|---|---|
| committer | 2022-12-02 21:44:51 +0000 | |
| commit | e9fadf1e5be925050184bfa2af604fce0189c3db (patch) | |
| tree | 89f6bfe5521612add93e08ad557dfceafc98c5bb | |
| parent | 7c5817e876c62f3237a2b94622c55b21340e846e (diff) | |
| parent | 287fb6dec7795915ae265e4afc8507cfb0d150a5 (diff) | |
Merge "Fix bugs with SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY"
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayModeDirector.java | 62 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java | 48 |
2 files changed, 84 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 1c510cce1bb7..405a2b958dd1 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -264,6 +264,18 @@ public class DisplayModeDirector { disableRefreshRateSwitching = false; appRequestBaseModeRefreshRate = 0f; } + + @Override + public String toString() { + return "minPhysicalRefreshRate=" + minPhysicalRefreshRate + + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate + + ", minRenderFrameRate=" + minRenderFrameRate + + ", maxRenderFrameRate=" + maxRenderFrameRate + + ", width=" + width + + ", height=" + height + + ", disableRefreshRateSwitching=" + disableRefreshRateSwitching + + ", appRequestBaseModeRefreshRate=" + appRequestBaseModeRefreshRate; + } } // VoteSummary is returned as an output param to cut down a bit on the number of temporary @@ -317,18 +329,8 @@ public class DisplayModeDirector { } if (mLoggingEnabled) { - Slog.w(TAG, "Vote summary for priority " - + Vote.priorityToString(priority) - + ": width=" + summary.width - + ", height=" + summary.height - + ", minPhysicalRefreshRate=" + summary.minPhysicalRefreshRate - + ", maxPhysicalRefreshRate=" + summary.maxPhysicalRefreshRate - + ", minRenderFrameRate=" + summary.minRenderFrameRate - + ", maxRenderFrameRate=" + summary.maxRenderFrameRate - + ", disableRefreshRateSwitching=" - + summary.disableRefreshRateSwitching - + ", appRequestBaseModeRefreshRate=" - + summary.appRequestBaseModeRefreshRate); + Slog.w(TAG, "Vote summary for priority " + Vote.priorityToString(priority) + + ": " + summary); } } } @@ -362,6 +364,23 @@ public class DisplayModeDirector { return !availableModes.isEmpty() ? availableModes.get(0) : null; } + private void disableModeSwitching(VoteSummary summary, float fps) { + summary.minPhysicalRefreshRate = summary.maxPhysicalRefreshRate = fps; + summary.maxRenderFrameRate = Math.min(summary.maxRenderFrameRate, fps); + + if (mLoggingEnabled) { + Slog.i(TAG, "Disabled mode switching on summary: " + summary); + } + } + + private void disableRenderRateSwitching(VoteSummary summary) { + summary.minRenderFrameRate = summary.maxRenderFrameRate; + + if (mLoggingEnabled) { + Slog.i(TAG, "Disabled render rate switching on summary: " + summary); + } + } + /** * Calculates the refresh rate ranges and display modes that the system is allowed to freely * switch between based on global and display-specific constraints. @@ -390,7 +409,7 @@ public class DisplayModeDirector { int highestConsideredPriority = Vote.MAX_PRIORITY; if (mAlwaysRespectAppRequest) { - lowestConsideredPriority = Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE; + lowestConsideredPriority = Vote.PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE; highestConsideredPriority = Vote.PRIORITY_APP_REQUEST_SIZE; } @@ -518,18 +537,15 @@ public class DisplayModeDirector { if (modeSwitchingDisabled || primarySummary.disableRefreshRateSwitching) { float fps = baseMode.getRefreshRate(); - primarySummary.minPhysicalRefreshRate = primarySummary.maxPhysicalRefreshRate = fps; + disableModeSwitching(primarySummary, fps); if (modeSwitchingDisabled) { - appRequestSummary.minPhysicalRefreshRate = - appRequestSummary.maxPhysicalRefreshRate = fps; - } - } + disableModeSwitching(appRequestSummary, fps); + disableRenderRateSwitching(primarySummary); - if (mModeSwitchingType == DisplayManager.SWITCHING_TYPE_NONE) { - primarySummary.minRenderFrameRate = primarySummary.minPhysicalRefreshRate; - primarySummary.maxRenderFrameRate = primarySummary.maxPhysicalRefreshRate; - appRequestSummary.minRenderFrameRate = appRequestSummary.minPhysicalRefreshRate; - appRequestSummary.maxRenderFrameRate = appRequestSummary.maxPhysicalRefreshRate; + if (mModeSwitchingType == DisplayManager.SWITCHING_TYPE_NONE) { + disableRenderRateSwitching(appRequestSummary); + } + } } boolean allowGroupSwitching = diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index d1ae9ffb18ac..865bc987cb2c 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -707,7 +707,7 @@ public class DisplayModeDirectorTest { director.injectVotesByDisplay(votesByDisplay); assertThat(director.getModeSwitchingType()) - .isNotEqualTo(DisplayManager.SWITCHING_TYPE_NONE); + .isNotEqualTo(DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID); assertThat(desiredSpecs.primary.physical.min).isWithin(FLOAT_TOLERANCE).of(30); @@ -728,16 +728,58 @@ public class DisplayModeDirectorTest { assertThat(desiredSpecs.primary.physical.min).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.primary.physical.max).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.primary.render.min).isWithin(FLOAT_TOLERANCE).of(30); - assertThat(desiredSpecs.primary.render.max).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.primary.render.max).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.appRequest.physical.min).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.appRequest.physical.max).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.appRequest.render.min).isWithin(FLOAT_TOLERANCE).of(0); - assertThat(desiredSpecs.appRequest.render.max).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.appRequest.render.max).isWithin(FLOAT_TOLERANCE).of(30); assertThat(desiredSpecs.baseModeId).isEqualTo(30); } @Test + public void testVotingWithSwitchingTypeRenderFrameRateOnlyRenderRateIsNotPhysicalRefreshRate() { + DisplayModeDirector director = createDirectorFromFpsRange(90, 120); + SparseArray<Vote> votes = new SparseArray<>(); + SparseArray<SparseArray<Vote>> votesByDisplay = new SparseArray<>(); + votesByDisplay.put(DISPLAY_ID, votes); + votes.put(Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE, + Vote.forRenderFrameRates(30, 90)); + votes.put(Vote.PRIORITY_LOW_POWER_MODE, Vote.forRenderFrameRates(0, 60)); + + director.injectVotesByDisplay(votesByDisplay); + assertThat(director.getModeSwitchingType()) + .isNotEqualTo(DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY); + DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID); + + assertThat(desiredSpecs.primary.physical.min).isWithin(FLOAT_TOLERANCE).of(30); + assertThat(desiredSpecs.primary.physical.max).isPositiveInfinity(); + assertThat(desiredSpecs.primary.render.min).isWithin(FLOAT_TOLERANCE).of(30); + assertThat(desiredSpecs.primary.render.max).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.appRequest.physical.min).isWithin(FLOAT_TOLERANCE).of(0); + assertThat(desiredSpecs.appRequest.physical.max).isPositiveInfinity(); + assertThat(desiredSpecs.appRequest.render.min).isWithin(FLOAT_TOLERANCE).of(0); + assertThat(desiredSpecs.appRequest.render.max).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.baseModeId).isEqualTo(90); + + director.setModeSwitchingType(DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY); + assertThat(director.getModeSwitchingType()) + .isEqualTo(DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY); + + desiredSpecs = director.getDesiredDisplayModeSpecs(DISPLAY_ID); + assertThat(desiredSpecs.primary.physical.min).isWithin(FLOAT_TOLERANCE).of(90); + assertThat(desiredSpecs.primary.physical.max).isWithin(FLOAT_TOLERANCE).of(90); + assertThat(desiredSpecs.primary.render.min).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.primary.render.max).isWithin(FLOAT_TOLERANCE).of(60); + assertThat(desiredSpecs.appRequest.physical.min).isWithin(FLOAT_TOLERANCE).of(90); + assertThat(desiredSpecs.appRequest.physical.max).isWithin(FLOAT_TOLERANCE).of(90); + assertThat(desiredSpecs.appRequest.render.min).isWithin(FLOAT_TOLERANCE).of(0); + assertThat(desiredSpecs.appRequest.render.max).isWithin(FLOAT_TOLERANCE).of(60); + + assertThat(desiredSpecs.baseModeId).isEqualTo(90); + } + + @Test public void testVotingWithSwitchingTypeWithinGroups() { DisplayModeDirector director = createDirectorFromFpsRange(0, 90); |