Concurrent displays: adding render rate sync
If one of displays does not support required refresh rate,
limit render rate
Bug: b/359728670, b/359729509
Test: atest DisplayModeDirectorTest
Flag: EXEMPT bugfix
Change-Id: I5b77e433147e05629eec075a6f503dc444654112
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 c31d1d8..d909004 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -1500,10 +1500,18 @@
}
private void updateLayoutLimitedFrameRate(int displayId, @Nullable DisplayInfo info) {
- Vote vote = info != null && info.layoutLimitedRefreshRate != null
- ? Vote.forPhysicalRefreshRates(info.layoutLimitedRefreshRate.min,
- info.layoutLimitedRefreshRate.max) : null;
- mVotesStorage.updateVote(displayId, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE, vote);
+ Vote refreshRateVote = null;
+ Vote frameRateVote = null;
+ if (info != null && info.layoutLimitedRefreshRate != null) {
+ refreshRateVote = Vote.forPhysicalRefreshRates(info.layoutLimitedRefreshRate.min,
+ info.layoutLimitedRefreshRate.max);
+ frameRateVote = Vote.forRenderFrameRates(info.layoutLimitedRefreshRate.min,
+ info.layoutLimitedRefreshRate.max);
+ }
+ mVotesStorage.updateVote(
+ displayId, Vote.PRIORITY_LAYOUT_LIMITED_REFRESH_RATE, refreshRateVote);
+ mVotesStorage.updateVote(
+ displayId, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE, frameRateVote);
}
private void removeUserSettingDisplayPreferredSize(int displayId) {
diff --git a/services/core/java/com/android/server/display/mode/Vote.java b/services/core/java/com/android/server/display/mode/Vote.java
index 88ee04481..459f9a6 100644
--- a/services/core/java/com/android/server/display/mode/Vote.java
+++ b/services/core/java/com/android/server/display/mode/Vote.java
@@ -110,37 +110,40 @@
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 = 14;
+ int PRIORITY_LAYOUT_LIMITED_REFRESH_RATE = 14;
+
+ // For concurrent displays we want to limit refresh rate on all displays
+ int PRIORITY_LAYOUT_LIMITED_FRAME_RATE = 15;
// For internal application to limit display modes to specific ids
- int PRIORITY_SYSTEM_REQUESTED_MODES = 15;
+ int PRIORITY_SYSTEM_REQUESTED_MODES = 16;
// 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 = 16;
+ int PRIORITY_LOW_POWER_MODE_MODES = 17;
// 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 = 17;
+ int PRIORITY_LOW_POWER_MODE_RENDER_RATE = 18;
// 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 = 18;
+ int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 19;
// Force display to [0, 60HZ] if skin temperature is at or above CRITICAL.
- int PRIORITY_SKIN_TEMPERATURE = 19;
+ int PRIORITY_SKIN_TEMPERATURE = 20;
// 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 = 20;
+ int PRIORITY_PROXIMITY = 21;
// 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 = 21;
+ int PRIORITY_UDFPS = 22;
@IntDef(prefix = { "PRIORITY_" }, value = {
PRIORITY_DEFAULT_RENDER_FRAME_RATE,
@@ -157,6 +160,7 @@
PRIORITY_SYNCHRONIZED_RENDER_FRAME_RATE,
PRIORITY_LIMIT_MODE,
PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE,
+ PRIORITY_LAYOUT_LIMITED_REFRESH_RATE,
PRIORITY_LAYOUT_LIMITED_FRAME_RATE,
PRIORITY_SYSTEM_REQUESTED_MODES,
PRIORITY_LOW_POWER_MODE_MODES,
@@ -283,6 +287,8 @@
return "PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE";
case PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE:
return "PRIORITY_AUTH_OPTIMIZER_RENDER_FRAME_RATE";
+ case PRIORITY_LAYOUT_LIMITED_REFRESH_RATE:
+ return "PRIORITY_LAYOUT_LIMITED_REFRESH_RATE";
case PRIORITY_LAYOUT_LIMITED_FRAME_RATE:
return "PRIORITY_LAYOUT_LIMITED_FRAME_RATE";
case PRIORITY_SYSTEM_REQUESTED_MODES:
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 ab0f0c1..d91f154 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
@@ -3556,12 +3556,16 @@
new RefreshRateRange(refreshRate, refreshRate);
displayListener.onDisplayChanged(DISPLAY_ID);
- Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE);
+ Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_REFRESH_RATE);
assertVoteForPhysicalRefreshRate(vote, /* refreshRate= */ refreshRate);
+ vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE);
+ assertVoteForRenderFrameRateRange(vote, refreshRate, refreshRate);
mInjector.mDisplayInfo.layoutLimitedRefreshRate = null;
displayListener.onDisplayChanged(DISPLAY_ID);
+ vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_REFRESH_RATE);
+ assertNull(vote);
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE);
assertNull(vote);
}
@@ -3585,6 +3589,8 @@
Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_FRAME_RATE);
assertNull(vote);
+ vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_LAYOUT_LIMITED_REFRESH_RATE);
+ assertNull(vote);
}
private Temperature getSkinTemp(@Temperature.ThrottlingStatus int status) {