summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/display/mode/DisplayModeDirector.java29
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/AppRequestObserverTest.kt33
2 files changed, 53 insertions, 9 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 c37733b05fba..2c90e1919123 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -156,6 +156,8 @@ public class DisplayModeDirector {
private SparseArray<Display.Mode> mDefaultModeByDisplay;
// a map from display id to display device config
private SparseArray<DisplayDeviceConfig> mDisplayDeviceConfigByDisplay = new SparseArray<>();
+ // set containing connected external display ids
+ private final Set<Integer> mExternalDisplaysConnected = new HashSet<>();
private SparseBooleanArray mHasArrSupport;
@@ -425,7 +427,7 @@ public class DisplayModeDirector {
// Some external displays physical refresh rate modes are slightly above 60hz.
// SurfaceFlinger will not enable these display modes unless it is configured to allow
// render rate at least at this frame rate.
- if (mDisplayObserver.isExternalDisplayLocked(displayId)) {
+ if (isExternalDisplayLocked(displayId)) {
primarySummary.maxRenderFrameRate = Math.max(baseMode.getRefreshRate(),
primarySummary.maxRenderFrameRate);
appRequestSummary.maxRenderFrameRate = Math.max(baseMode.getRefreshRate(),
@@ -653,6 +655,10 @@ public class DisplayModeDirector {
}
}
+ boolean isExternalDisplayLocked(int displayId) {
+ return mExternalDisplaysConnected.contains(displayId);
+ }
+
private static String switchingTypeToString(@DisplayManager.SwitchingType int type) {
switch (type) {
case DisplayManager.SWITCHING_TYPE_NONE:
@@ -694,6 +700,11 @@ public class DisplayModeDirector {
}
@VisibleForTesting
+ void addExternalDisplayId(int externalDisplayId) {
+ mExternalDisplaysConnected.add(externalDisplayId);
+ }
+
+ @VisibleForTesting
void injectBrightnessObserver(BrightnessObserver brightnessObserver) {
mBrightnessObserver = brightnessObserver;
}
@@ -1210,7 +1221,7 @@ public class DisplayModeDirector {
@GuardedBy("mLock")
private void updateRefreshRateSettingLocked(float minRefreshRate, float peakRefreshRate,
float defaultRefreshRate, int displayId) {
- if (mDisplayObserver.isExternalDisplayLocked(displayId)) {
+ if (isExternalDisplayLocked(displayId)) {
if (mLoggingEnabled) {
Slog.d(TAG, "skip updateRefreshRateSettingLocked for external display "
+ displayId);
@@ -1309,20 +1320,25 @@ public class DisplayModeDirector {
public void setAppRequest(int displayId, int modeId, float requestedRefreshRate,
float requestedMinRefreshRateRange, float requestedMaxRefreshRateRange) {
Display.Mode requestedMode;
+ boolean isExternalDisplay;
synchronized (mLock) {
requestedMode = findModeLocked(displayId, modeId, requestedRefreshRate);
+ isExternalDisplay = isExternalDisplayLocked(displayId);
}
Vote frameRateVote = getFrameRateVote(
requestedMinRefreshRateRange, requestedMaxRefreshRateRange);
Vote baseModeRefreshRateVote = getBaseModeVote(requestedMode, requestedRefreshRate);
- Vote sizeVote = getSizeVote(requestedMode);
mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE,
frameRateVote);
mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE,
baseModeRefreshRateVote);
- mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
+
+ if (!isExternalDisplay) {
+ Vote sizeVote = getSizeVote(requestedMode);
+ mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
+ }
}
private Display.Mode findModeLocked(int displayId, int modeId, float requestedRefreshRate) {
@@ -1420,7 +1436,6 @@ public class DisplayModeDirector {
private int mExternalDisplayPeakHeight;
private int mExternalDisplayPeakRefreshRate;
private final boolean mRefreshRateSynchronizationEnabled;
- private final Set<Integer> mExternalDisplaysConnected = new HashSet<>();
DisplayObserver(Context context, Handler handler, VotesStorage votesStorage,
Injector injector) {
@@ -1541,10 +1556,6 @@ public class DisplayModeDirector {
}
}
- boolean isExternalDisplayLocked(int displayId) {
- return mExternalDisplaysConnected.contains(displayId);
- }
-
@Nullable
private DisplayInfo getDisplayInfo(int displayId) {
DisplayInfo info = new DisplayInfo();
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/AppRequestObserverTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/AppRequestObserverTest.kt
index 1f3f19fa3ea8..218728541774 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/AppRequestObserverTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/AppRequestObserverTest.kt
@@ -89,6 +89,39 @@ class AppRequestObserverTest {
assertThat(renderRateVote).isEqualTo(testCase.expectedRenderRateVote)
}
+ @Test
+ fun testAppRequestVote_externalDisplay() {
+ val displayModeDirector = DisplayModeDirector(
+ context, testHandler, mockInjector, mockFlags, mockDisplayDeviceConfigProvider)
+ val modes = arrayOf(
+ Display.Mode(1, 1000, 1000, 60f),
+ Display.Mode(2, 1000, 1000, 90f),
+ )
+
+ displayModeDirector.injectAppSupportedModesByDisplay(
+ SparseArray<Array<Display.Mode>>().apply {
+ append(Display.DEFAULT_DISPLAY, modes)
+ })
+ displayModeDirector.injectDefaultModeByDisplay(SparseArray<Display.Mode>().apply {
+ append(Display.DEFAULT_DISPLAY, modes[0])
+ })
+ displayModeDirector.addExternalDisplayId(Display.DEFAULT_DISPLAY)
+
+ displayModeDirector.appRequestObserver.setAppRequest(Display.DEFAULT_DISPLAY, 1, 0f, 0f, 0f)
+
+ val baseModeVote = displayModeDirector.getVote(Display.DEFAULT_DISPLAY,
+ Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE)
+ assertThat(baseModeVote).isEqualTo(BaseModeRefreshRateVote(60f))
+
+ val sizeVote = displayModeDirector.getVote(Display.DEFAULT_DISPLAY,
+ Vote.PRIORITY_APP_REQUEST_SIZE)
+ assertThat(sizeVote).isNull()
+
+ val renderRateVote = displayModeDirector.getVote(Display.DEFAULT_DISPLAY,
+ Vote.PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE)
+ assertThat(renderRateVote).isNull()
+ }
+
enum class AppRequestTestCase(
val ignoreRefreshRateRequest: Boolean,
val modeId: Int,