Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +44 −29 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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<>(); Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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 Loading @@ -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, Loading Loading @@ -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 Loading @@ -1107,7 +1122,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } } return matchingModeId; return matchingSfDisplayModeId; } // Returns a mode with id = modeId. Loading Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +44 −29 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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<>(); Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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 Loading @@ -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, Loading Loading @@ -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 Loading @@ -1107,7 +1122,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } } return matchingModeId; return matchingSfDisplayModeId; } // Returns a mode with id = modeId. Loading