Merge "Map SurfaceFlinger display mode ids to Display.Mode ids" into tm-dev

This commit is contained in:
TreeHugger Robot
2022-02-23 22:36:11 +00:00
committed by Android (Google) Code Review

View File

@@ -255,10 +255,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
public boolean updateDisplayPropertiesLocked(SurfaceControl.StaticDisplayInfo staticInfo,
SurfaceControl.DynamicDisplayInfo dynamicInfo,
SurfaceControl.DesiredDisplayModeSpecs modeSpecs) {
boolean changed =
updateSystemPreferredDisplayMode(dynamicInfo.preferredBootDisplayMode);
changed |= updateDisplayModesLocked(
dynamicInfo.supportedDisplayModes, dynamicInfo.activeDisplayModeId, modeSpecs);
boolean changed = updateDisplayModesLocked(
dynamicInfo.supportedDisplayModes, dynamicInfo.preferredBootDisplayMode,
dynamicInfo.activeDisplayModeId, modeSpecs);
changed |= updateStaticInfo(staticInfo);
changed |= updateColorModesLocked(dynamicInfo.supportedColorModes,
dynamicInfo.activeColorMode);
@@ -273,10 +272,12 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
public boolean updateDisplayModesLocked(
SurfaceControl.DisplayMode[] displayModes, int activeDisplayModeId,
SurfaceControl.DesiredDisplayModeSpecs modeSpecs) {
SurfaceControl.DisplayMode[] displayModes, int preferredSfDisplayModeId,
int activeSfDisplayModeId, SurfaceControl.DesiredDisplayModeSpecs modeSpecs) {
mSfDisplayModes = Arrays.copyOf(displayModes, displayModes.length);
mActiveSfDisplayMode = getModeById(displayModes, activeDisplayModeId);
mActiveSfDisplayMode = getModeById(displayModes, activeSfDisplayModeId);
SurfaceControl.DisplayMode preferredSfDisplayMode =
getModeById(displayModes, preferredSfDisplayModeId);
// Build an updated list of all existing modes.
ArrayList<DisplayModeRecord> records = new ArrayList<>();
@@ -335,6 +336,27 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
boolean preferredModeChanged = false;
if (preferredSfDisplayModeId != INVALID_MODE_ID && preferredSfDisplayMode != null) {
DisplayModeRecord preferredRecord = null;
for (DisplayModeRecord record : records) {
if (record.hasMatchingMode(preferredSfDisplayMode)) {
preferredRecord = record;
break;
}
}
if (preferredRecord != null) {
int preferredModeId = preferredRecord.mMode.getModeId();
if (mSurfaceControlProxy.getBootDisplayModeSupport()
&& mSystemPreferredModeId != preferredModeId) {
mSystemPreferredModeId = preferredModeId;
preferredModeChanged = true;
}
}
}
boolean activeModeChanged = false;
// Check whether SurfaceFlinger or the display device changed the active mode out from
@@ -373,7 +395,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
boolean recordsChanged = records.size() != mSupportedModes.size() || modesAdded;
// If the records haven't changed then we're done here.
if (!recordsChanged) {
return activeModeChanged;
return activeModeChanged || preferredModeChanged;
}
mSupportedModes.clear();
@@ -386,14 +408,14 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mDefaultModeId = mSystemPreferredModeId != INVALID_MODE_ID
? mSystemPreferredModeId : activeRecord.mMode.getModeId();
mDefaultModeGroup = mSystemPreferredModeId != INVALID_MODE_ID
? getModeById(mSfDisplayModes, mSystemPreferredModeId).group
? preferredSfDisplayMode.group
: mActiveSfDisplayMode.group;
} else if (modesAdded && activeModeChanged) {
Slog.d(TAG, "New display modes are added and the active mode has changed, "
+ "use active mode as default mode.");
mDefaultModeId = activeRecord.mMode.getModeId();
mDefaultModeGroup = mActiveSfDisplayMode.group;
} else if (findDisplayModeIdLocked(mDefaultModeId, mDefaultModeGroup) < 0) {
} else if (findSfDisplayModeIdLocked(mDefaultModeId, mDefaultModeGroup) < 0) {
Slog.w(TAG, "Default display mode no longer available, using currently"
+ " active mode as default.");
mDefaultModeId = activeRecord.mMode.getModeId();
@@ -545,15 +567,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
return true;
}
private boolean updateSystemPreferredDisplayMode(int modeId) {
if (!mSurfaceControlProxy.getBootDisplayModeSupport()
|| mSystemPreferredModeId == modeId) {
return false;
}
mSystemPreferredModeId = modeId;
return true;
}
private SurfaceControl.DisplayMode getModeById(SurfaceControl.DisplayMode[] supportedModes,
int modeId) {
for (SurfaceControl.DisplayMode mode : supportedModes) {
@@ -887,8 +900,10 @@ final class LocalDisplayAdapter extends DisplayAdapter {
if (mUserPreferredMode == null) {
mSurfaceControlProxy.clearBootDisplayMode(getDisplayTokenLocked());
} else {
int preferredSfDisplayModeId = findSfDisplayModeIdLocked(
mUserPreferredMode.getModeId(), mDefaultModeGroup);
mSurfaceControlProxy.setBootDisplayMode(getDisplayTokenLocked(),
mUserPreferredMode.getModeId());
preferredSfDisplayModeId);
}
}
@@ -923,9 +938,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
// mode based on vendor requirements.
// Note: We prefer the default mode group over the current one as this is the mode
// group the vendor prefers.
int baseModeId = findDisplayModeIdLocked(displayModeSpecs.baseModeId,
int baseSfModeId = findSfDisplayModeIdLocked(displayModeSpecs.baseModeId,
mDefaultModeGroup);
if (baseModeId < 0) {
if (baseSfModeId < 0) {
// When a display is hotplugged, it's possible for a mode to be removed that was
// previously valid. Because of the way display changes are propagated through the
// framework, and the caching of the display mode specs in LogicalDisplay, it's
@@ -943,7 +958,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
getHandler().sendMessage(PooledLambda.obtainMessage(
LocalDisplayDevice::setDesiredDisplayModeSpecsAsync, this,
getDisplayTokenLocked(),
new SurfaceControl.DesiredDisplayModeSpecs(baseModeId,
new SurfaceControl.DesiredDisplayModeSpecs(baseSfModeId,
mDisplayModeSpecs.allowGroupSwitching,
mDisplayModeSpecs.primaryRefreshRateRange.min,
mDisplayModeSpecs.primaryRefreshRateRange.max,
@@ -1090,14 +1105,14 @@ final class LocalDisplayAdapter extends DisplayAdapter {
pw.println("mDisplayDeviceConfig=" + mDisplayDeviceConfig);
}
private int findDisplayModeIdLocked(int modeId, int modeGroup) {
int matchingModeId = INVALID_MODE_ID;
DisplayModeRecord record = mSupportedModes.get(modeId);
private int findSfDisplayModeIdLocked(int displayModeId, int modeGroup) {
int matchingSfDisplayModeId = INVALID_MODE_ID;
DisplayModeRecord record = mSupportedModes.get(displayModeId);
if (record != null) {
for (SurfaceControl.DisplayMode mode : mSfDisplayModes) {
if (record.hasMatchingMode(mode)) {
if (matchingModeId == INVALID_MODE_ID) {
matchingModeId = mode.id;
if (matchingSfDisplayModeId == INVALID_MODE_ID) {
matchingSfDisplayModeId = mode.id;
}
// Prefer to return a mode that matches the modeGroup
@@ -1107,7 +1122,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
}
return matchingModeId;
return matchingSfDisplayModeId;
}
// Returns a mode with id = modeId.