Switch from allowed display configs to refresh rate range
This completes the recent work to switch from a list of allowed display
configs to a default config + min/max frame rate.
Bug: 142507213
Test: Ran on a device with refresh rate switching, confirmed expected
60/90 switching behavior when touching the screen.
Test: Launched Google Maps on a device with 60/90 switching, confirmed
the device stays at 60fps.
Test: Checked dumpsys output, confirmed new display config specs
formatting looks good.
Test: Ran on a device with refresh rate switching disallowed via the
ro.surface_flinger.refresh_rate_switching sysprop, and confirmed
we don't do refresh rate switching.
Test: Ran on a device that doesn't support refresh rate switching, and
confirmed normal behavior.
Test: Tested surface flinger's display config back door, confirmed it
still works.
Test: Inspected log output, made sure there's nothing weird.
Test: Ran unit tests for DisplayModeDirector, LocalDisplayAdapter, and
RefreshRateConfigs.
Test: atest FrameworksServicesTests
Test: atest FrameworksMockingServicesTests
Test: adb shell /data/nativetest64/libgui_test/libgui_test
Test: adb shell /data/nativetest64/libsurfaceflinger_unittest/libsurfaceflinger_unittest
Change-Id: If1417dbb5723df3386db15b2d968cfd164c2615b
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 3e8a726..8943272 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -431,7 +431,8 @@
recordTopInsetLocked(mLogicalDisplays.get(Display.DEFAULT_DISPLAY));
}
- mDisplayModeDirector.setDisplayModeListener(new AllowedDisplayModeObserver());
+ mDisplayModeDirector.setDesiredDisplayModeSpecsListener(
+ new DesiredDisplayModeSpecsObserver());
mDisplayModeDirector.start(mSensorManager);
mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
@@ -1347,19 +1348,24 @@
return SurfaceControl.getDisplayedContentSample(token, maxFrames, timestamp);
}
- private void onAllowedDisplayModesChangedInternal() {
+ private void onDesiredDisplayModeSpecsChangedInternal() {
boolean changed = false;
synchronized (mSyncRoot) {
final int count = mLogicalDisplays.size();
for (int i = 0; i < count; i++) {
LogicalDisplay display = mLogicalDisplays.valueAt(i);
int displayId = mLogicalDisplays.keyAt(i);
- int[] allowedModes = mDisplayModeDirector.getAllowedModes(displayId);
- // Note that order is important here since not all display devices are capable of
- // automatically switching, so we do actually want to check for equality and not
- // just equivalent contents (regardless of order).
- if (!Arrays.equals(allowedModes, display.getAllowedDisplayModesLocked())) {
- display.setAllowedDisplayModesLocked(allowedModes);
+ DisplayModeDirector.DesiredDisplayModeSpecs desiredDisplayModeSpecs =
+ mDisplayModeDirector.getDesiredDisplayModeSpecs(displayId);
+ DisplayModeDirector.DesiredDisplayModeSpecs existingDesiredDisplayModeSpecs =
+ display.getDesiredDisplayModeSpecsLocked();
+ if (DEBUG) {
+ Slog.i(TAG,
+ "Comparing display specs: " + desiredDisplayModeSpecs
+ + ", existing: " + existingDesiredDisplayModeSpecs);
+ }
+ if (!desiredDisplayModeSpecs.equals(existingDesiredDisplayModeSpecs)) {
+ display.setDesiredDisplayModeSpecsLocked(desiredDisplayModeSpecs);
changed = true;
}
}
@@ -2510,9 +2516,10 @@
}
- class AllowedDisplayModeObserver implements DisplayModeDirector.DisplayModeListener {
- public void onAllowedDisplayModesChanged() {
- onAllowedDisplayModesChangedInternal();
+ class DesiredDisplayModeSpecsObserver
+ implements DisplayModeDirector.DesiredDisplayModeSpecsListener {
+ public void onDesiredDisplayModeSpecsChanged() {
+ onDesiredDisplayModeSpecsChangedInternal();
}
}
}