Loading services/core/java/com/android/server/display/DeviceStateToLayoutMap.java +2 −1 Original line number Diff line number Diff line Loading @@ -122,7 +122,8 @@ class DeviceStateToLayoutMap { DisplayAddress.fromPhysicalDisplayId(d.getAddress().longValue()), d.isDefaultDisplay(), d.isEnabled(), mIdProducer); mIdProducer, d.getBrightnessThrottlingMapId()); if (FRONT_STRING.equals(d.getPosition())) { display.setPosition(POSITION_FRONT); Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +37 −81 Original line number Diff line number Diff line Loading @@ -74,8 +74,10 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.xml.datatype.DatatypeConfigurationException; Loading Loading @@ -411,6 +413,8 @@ public class DisplayDeviceConfig { public static final String QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC = "canSetBrightnessViaHwc"; static final String DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID = "default"; private static final float BRIGHTNESS_DEFAULT = 0.5f; private static final String ETC_DIR = "etc"; private static final String DISPLAY_CONFIG_DIR = "displayconfig"; Loading Loading @@ -627,13 +631,7 @@ public class DisplayDeviceConfig { private int[] mHighDisplayBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; private int[] mHighAmbientBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; // Brightness Throttling data may be updated via the DeviceConfig. Here we store the original // data, which comes from the ddc, and the current one, which may be the DeviceConfig // overwritten value. private BrightnessThrottlingData mBrightnessThrottlingData; private BrightnessThrottlingData mOriginalBrightnessThrottlingData; // The concurrent displays mode might need a stricter throttling policy private BrightnessThrottlingData mConcurrentDisplaysBrightnessThrottlingData; private Map<String, BrightnessThrottlingData> mBrightnessThrottlingDataMap = new HashMap(); @Nullable private HostUsiVersion mHostUsiVersion; Loading Loading @@ -779,10 +777,6 @@ public class DisplayDeviceConfig { return config; } void setBrightnessThrottlingData(BrightnessThrottlingData brightnessThrottlingData) { mBrightnessThrottlingData = brightnessThrottlingData; } /** * Return the brightness mapping nits array. * Loading Loading @@ -1282,18 +1276,11 @@ public class DisplayDeviceConfig { } /** * @param id The ID of the throttling data * @return brightness throttling configuration data for the display. */ public BrightnessThrottlingData getBrightnessThrottlingData() { return BrightnessThrottlingData.create(mBrightnessThrottlingData); } /** * @return brightness throttling configuration data for the display for the concurrent * displays mode. */ public BrightnessThrottlingData getConcurrentDisplaysBrightnessThrottlingData() { return BrightnessThrottlingData.create(mConcurrentDisplaysBrightnessThrottlingData); public BrightnessThrottlingData getBrightnessThrottlingData(String id) { return BrightnessThrottlingData.create(mBrightnessThrottlingDataMap.get(id)); } /** Loading Loading @@ -1411,8 +1398,7 @@ public class DisplayDeviceConfig { + ", isHbmEnabled=" + mIsHighBrightnessModeEnabled + ", mHbmData=" + mHbmData + ", mSdrToHdrRatioSpline=" + mSdrToHdrRatioSpline + ", mBrightnessThrottlingData=" + mBrightnessThrottlingData + ", mOriginalBrightnessThrottlingData=" + mOriginalBrightnessThrottlingData + ", mBrightnessThrottlingData=" + mBrightnessThrottlingDataMap + "\n" + ", mBrightnessRampFastDecrease=" + mBrightnessRampFastDecrease + ", mBrightnessRampFastIncrease=" + mBrightnessRampFastIncrease Loading Loading @@ -1545,8 +1531,7 @@ public class DisplayDeviceConfig { loadBrightnessDefaultFromDdcXml(config); loadBrightnessConstraintsFromConfigXml(); loadBrightnessMap(config); loadBrightnessThrottlingMap(config); loadConcurrentDisplaysBrightnessThrottlingMap(config); loadBrightnessThrottlingMaps(config); loadHighBrightnessModeData(config); loadQuirks(config); loadBrightnessRamps(config); Loading Loading @@ -1756,19 +1741,20 @@ public class DisplayDeviceConfig { return Spline.createSpline(nits, ratios); } private void loadBrightnessThrottlingMap(DisplayConfiguration config) { private void loadBrightnessThrottlingMaps(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Slog.i(TAG, "No thermal throttling config found"); return; } final BrightnessThrottlingMap map = throttlingConfig.getBrightnessThrottlingMap(); if (map == null) { final List<BrightnessThrottlingMap> maps = throttlingConfig.getBrightnessThrottlingMap(); if (maps == null || maps.isEmpty()) { Slog.i(TAG, "No brightness throttling map found"); return; } for (BrightnessThrottlingMap map : maps) { final List<BrightnessThrottlingPoint> points = map.getBrightnessThrottlingPoint(); // At least 1 point is guaranteed by the display device config schema List<BrightnessThrottlingData.ThrottlingLevel> throttlingLevels = Loading @@ -1787,45 +1773,15 @@ public class DisplayDeviceConfig { } if (!badConfig) { mBrightnessThrottlingData = BrightnessThrottlingData.create(throttlingLevels); mOriginalBrightnessThrottlingData = mBrightnessThrottlingData; } } private void loadConcurrentDisplaysBrightnessThrottlingMap(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Slog.i(TAG, "No concurrent displays thermal throttling config found"); return; } final BrightnessThrottlingMap map = throttlingConfig.getConcurrentDisplaysBrightnessThrottlingMap(); if (map == null) { Slog.i(TAG, "No concurrent displays brightness throttling map found"); return; String id = map.getId() == null ? DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID : map.getId(); if (mBrightnessThrottlingDataMap.containsKey(id)) { throw new RuntimeException("Brightness throttling data with ID " + id + " already exists"); } final List<BrightnessThrottlingPoint> points = map.getBrightnessThrottlingPoint(); // At least 1 point is guaranteed by the display device config schema List<BrightnessThrottlingData.ThrottlingLevel> throttlingLevels = new ArrayList<>(points.size()); boolean badConfig = false; for (BrightnessThrottlingPoint point : points) { ThermalStatus status = point.getThermalStatus(); if (!thermalStatusIsValid(status)) { badConfig = true; break; mBrightnessThrottlingDataMap.put(id, BrightnessThrottlingData.create(throttlingLevels)); } throttlingLevels.add(new BrightnessThrottlingData.ThrottlingLevel( convertThermalStatus(status), point.getBrightness().floatValue())); } if (!badConfig) { mConcurrentDisplaysBrightnessThrottlingData = BrightnessThrottlingData.create(throttlingLevels); } } Loading services/core/java/com/android/server/display/DisplayPowerController.java +17 −12 Original line number Diff line number Diff line Loading @@ -504,6 +504,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private boolean mIsEnabled; private boolean mIsInTransition; private String mBrightnessThrottlingDataId; // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there // is one lead display, the additional displays follow the brightness value of the lead display. @GuardedBy("mLock") Loading Loading @@ -539,6 +541,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHandler = new DisplayControllerHandler(handler.getLooper()); mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked(); if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); Loading Loading @@ -862,6 +865,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean isEnabled = mLogicalDisplay.isEnabledLocked(); final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); mHandler.post(() -> { boolean changed = false; if (mDisplayDevice != device) { Loading @@ -870,12 +875,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; mBrightnessThrottlingDataId = brightnessThrottlingDataId; loadFromDisplayDeviceConfig(token, info, hbmMetadata); /// Since the underlying display-device changed, we really don't know the // last command that was sent to change it's state. Lets assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) { changed = true; mBrightnessThrottlingDataId = brightnessThrottlingDataId; mBrightnessThrottler.resetThrottlingData( config.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { changed = true; Loading @@ -887,9 +899,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call updatePowerState(); } }); // TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent // displays mode } /** Loading Loading @@ -948,10 +957,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); } }); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode mBrightnessThrottler.resetThrottlingData( mDisplayDeviceConfig.getBrightnessThrottlingData(), mUniqueDisplayId); mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } private void sendUpdatePowerState() { Loading Loading @@ -2061,11 +2069,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private BrightnessThrottler createBrightnessThrottlerLocked() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode final DisplayDeviceConfig.BrightnessThrottlingData data = ddConfig != null ? ddConfig.getBrightnessThrottlingData() : null; return new BrightnessThrottler(mHandler, data, return new BrightnessThrottler(mHandler, ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); Loading services/core/java/com/android/server/display/DisplayPowerController2.java +17 −12 Original line number Diff line number Diff line Loading @@ -411,6 +411,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private boolean mIsEnabled; private boolean mIsInTransition; private String mBrightnessThrottlingDataId; // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there // is one lead display, the additional displays follow the brightness value of the lead display. @GuardedBy("mLock") Loading Loading @@ -443,6 +445,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mHighBrightnessModeMetadata = hbmMetadata; mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked(); mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); Loading Loading @@ -705,6 +708,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean isEnabled = mLogicalDisplay.isEnabledLocked(); final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); mHandler.post(() -> { boolean changed = false; Loading @@ -714,6 +719,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; mBrightnessThrottlingDataId = brightnessThrottlingDataId; loadFromDisplayDeviceConfig(token, info, hbmMetadata); mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config); Loading @@ -721,6 +727,12 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Lets assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) { changed = true; mBrightnessThrottlingDataId = brightnessThrottlingDataId; mBrightnessThrottler.resetThrottlingData( config.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { changed = true; Loading @@ -732,9 +744,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal updatePowerState(); } }); // TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent // displays mode } /** Loading Loading @@ -786,10 +795,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); } }); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode mBrightnessThrottler.resetThrottlingData( mDisplayDeviceConfig.getBrightnessThrottlingData(), mUniqueDisplayId); mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } private void sendUpdatePowerState() { Loading Loading @@ -1768,11 +1776,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private BrightnessThrottler createBrightnessThrottlerLocked() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode final DisplayDeviceConfig.BrightnessThrottlingData data = ddConfig != null ? ddConfig.getBrightnessThrottlingData() : null; return new BrightnessThrottler(mHandler, data, return new BrightnessThrottler(mHandler, ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); Loading services/core/java/com/android/server/display/LogicalDisplay.java +26 −1 Original line number Diff line number Diff line Loading @@ -152,6 +152,13 @@ final class LogicalDisplay { // the {@link mIsEnabled} is changing, or the underlying mPrimiaryDisplayDevice is changing. private boolean mIsInTransition; /** * The ID of the brightness throttling data that should be used. This can change e.g. in * concurrent displays mode in which a stricter brightness throttling policy might need to be * used. */ private String mBrightnessThrottlingDataId; public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) { mDisplayId = displayId; mLayerStack = layerStack; Loading @@ -160,6 +167,7 @@ final class LogicalDisplay { mTempFrameRateOverride = new SparseArray<>(); mIsEnabled = true; mIsInTransition = false; mBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID; } /** Loading Loading @@ -762,7 +770,7 @@ final class LogicalDisplay { /** * Sets the display as enabled. * * @param enable True if enabled, false otherwise. * @param enabled True if enabled, false otherwise. */ public void setEnabledLocked(boolean enabled) { mIsEnabled = enabled; Loading @@ -785,6 +793,22 @@ final class LogicalDisplay { mIsInTransition = isInTransition; } /** * @return The ID of the brightness throttling data that this display should use. */ public String getBrightnessThrottlingDataIdLocked() { return mBrightnessThrottlingDataId; } /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { mBrightnessThrottlingDataId = brightnessThrottlingDataId; } public void dumpLocked(PrintWriter pw) { pw.println("mDisplayId=" + mDisplayId); pw.println("mIsEnabled=" + mIsEnabled); Loading @@ -802,6 +826,7 @@ final class LogicalDisplay { pw.println("mRequestedMinimalPostProcessing=" + mRequestedMinimalPostProcessing); pw.println("mFrameRateOverrides=" + Arrays.toString(mFrameRateOverrides)); pw.println("mPendingFrameRateOverrideUids=" + mPendingFrameRateOverrideUids); pw.println("mBrightnessThrottlingDataId=" + mBrightnessThrottlingDataId); } @Override Loading Loading
services/core/java/com/android/server/display/DeviceStateToLayoutMap.java +2 −1 Original line number Diff line number Diff line Loading @@ -122,7 +122,8 @@ class DeviceStateToLayoutMap { DisplayAddress.fromPhysicalDisplayId(d.getAddress().longValue()), d.isDefaultDisplay(), d.isEnabled(), mIdProducer); mIdProducer, d.getBrightnessThrottlingMapId()); if (FRONT_STRING.equals(d.getPosition())) { display.setPosition(POSITION_FRONT); Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +37 −81 Original line number Diff line number Diff line Loading @@ -74,8 +74,10 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.xml.datatype.DatatypeConfigurationException; Loading Loading @@ -411,6 +413,8 @@ public class DisplayDeviceConfig { public static final String QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC = "canSetBrightnessViaHwc"; static final String DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID = "default"; private static final float BRIGHTNESS_DEFAULT = 0.5f; private static final String ETC_DIR = "etc"; private static final String DISPLAY_CONFIG_DIR = "displayconfig"; Loading Loading @@ -627,13 +631,7 @@ public class DisplayDeviceConfig { private int[] mHighDisplayBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; private int[] mHighAmbientBrightnessThresholds = DEFAULT_BRIGHTNESS_THRESHOLDS; // Brightness Throttling data may be updated via the DeviceConfig. Here we store the original // data, which comes from the ddc, and the current one, which may be the DeviceConfig // overwritten value. private BrightnessThrottlingData mBrightnessThrottlingData; private BrightnessThrottlingData mOriginalBrightnessThrottlingData; // The concurrent displays mode might need a stricter throttling policy private BrightnessThrottlingData mConcurrentDisplaysBrightnessThrottlingData; private Map<String, BrightnessThrottlingData> mBrightnessThrottlingDataMap = new HashMap(); @Nullable private HostUsiVersion mHostUsiVersion; Loading Loading @@ -779,10 +777,6 @@ public class DisplayDeviceConfig { return config; } void setBrightnessThrottlingData(BrightnessThrottlingData brightnessThrottlingData) { mBrightnessThrottlingData = brightnessThrottlingData; } /** * Return the brightness mapping nits array. * Loading Loading @@ -1282,18 +1276,11 @@ public class DisplayDeviceConfig { } /** * @param id The ID of the throttling data * @return brightness throttling configuration data for the display. */ public BrightnessThrottlingData getBrightnessThrottlingData() { return BrightnessThrottlingData.create(mBrightnessThrottlingData); } /** * @return brightness throttling configuration data for the display for the concurrent * displays mode. */ public BrightnessThrottlingData getConcurrentDisplaysBrightnessThrottlingData() { return BrightnessThrottlingData.create(mConcurrentDisplaysBrightnessThrottlingData); public BrightnessThrottlingData getBrightnessThrottlingData(String id) { return BrightnessThrottlingData.create(mBrightnessThrottlingDataMap.get(id)); } /** Loading Loading @@ -1411,8 +1398,7 @@ public class DisplayDeviceConfig { + ", isHbmEnabled=" + mIsHighBrightnessModeEnabled + ", mHbmData=" + mHbmData + ", mSdrToHdrRatioSpline=" + mSdrToHdrRatioSpline + ", mBrightnessThrottlingData=" + mBrightnessThrottlingData + ", mOriginalBrightnessThrottlingData=" + mOriginalBrightnessThrottlingData + ", mBrightnessThrottlingData=" + mBrightnessThrottlingDataMap + "\n" + ", mBrightnessRampFastDecrease=" + mBrightnessRampFastDecrease + ", mBrightnessRampFastIncrease=" + mBrightnessRampFastIncrease Loading Loading @@ -1545,8 +1531,7 @@ public class DisplayDeviceConfig { loadBrightnessDefaultFromDdcXml(config); loadBrightnessConstraintsFromConfigXml(); loadBrightnessMap(config); loadBrightnessThrottlingMap(config); loadConcurrentDisplaysBrightnessThrottlingMap(config); loadBrightnessThrottlingMaps(config); loadHighBrightnessModeData(config); loadQuirks(config); loadBrightnessRamps(config); Loading Loading @@ -1756,19 +1741,20 @@ public class DisplayDeviceConfig { return Spline.createSpline(nits, ratios); } private void loadBrightnessThrottlingMap(DisplayConfiguration config) { private void loadBrightnessThrottlingMaps(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Slog.i(TAG, "No thermal throttling config found"); return; } final BrightnessThrottlingMap map = throttlingConfig.getBrightnessThrottlingMap(); if (map == null) { final List<BrightnessThrottlingMap> maps = throttlingConfig.getBrightnessThrottlingMap(); if (maps == null || maps.isEmpty()) { Slog.i(TAG, "No brightness throttling map found"); return; } for (BrightnessThrottlingMap map : maps) { final List<BrightnessThrottlingPoint> points = map.getBrightnessThrottlingPoint(); // At least 1 point is guaranteed by the display device config schema List<BrightnessThrottlingData.ThrottlingLevel> throttlingLevels = Loading @@ -1787,45 +1773,15 @@ public class DisplayDeviceConfig { } if (!badConfig) { mBrightnessThrottlingData = BrightnessThrottlingData.create(throttlingLevels); mOriginalBrightnessThrottlingData = mBrightnessThrottlingData; } } private void loadConcurrentDisplaysBrightnessThrottlingMap(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Slog.i(TAG, "No concurrent displays thermal throttling config found"); return; } final BrightnessThrottlingMap map = throttlingConfig.getConcurrentDisplaysBrightnessThrottlingMap(); if (map == null) { Slog.i(TAG, "No concurrent displays brightness throttling map found"); return; String id = map.getId() == null ? DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID : map.getId(); if (mBrightnessThrottlingDataMap.containsKey(id)) { throw new RuntimeException("Brightness throttling data with ID " + id + " already exists"); } final List<BrightnessThrottlingPoint> points = map.getBrightnessThrottlingPoint(); // At least 1 point is guaranteed by the display device config schema List<BrightnessThrottlingData.ThrottlingLevel> throttlingLevels = new ArrayList<>(points.size()); boolean badConfig = false; for (BrightnessThrottlingPoint point : points) { ThermalStatus status = point.getThermalStatus(); if (!thermalStatusIsValid(status)) { badConfig = true; break; mBrightnessThrottlingDataMap.put(id, BrightnessThrottlingData.create(throttlingLevels)); } throttlingLevels.add(new BrightnessThrottlingData.ThrottlingLevel( convertThermalStatus(status), point.getBrightness().floatValue())); } if (!badConfig) { mConcurrentDisplaysBrightnessThrottlingData = BrightnessThrottlingData.create(throttlingLevels); } } Loading
services/core/java/com/android/server/display/DisplayPowerController.java +17 −12 Original line number Diff line number Diff line Loading @@ -504,6 +504,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private boolean mIsEnabled; private boolean mIsInTransition; private String mBrightnessThrottlingDataId; // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there // is one lead display, the additional displays follow the brightness value of the lead display. @GuardedBy("mLock") Loading Loading @@ -539,6 +541,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHandler = new DisplayControllerHandler(handler.getLooper()); mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked(); if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); Loading Loading @@ -862,6 +865,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean isEnabled = mLogicalDisplay.isEnabledLocked(); final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); mHandler.post(() -> { boolean changed = false; if (mDisplayDevice != device) { Loading @@ -870,12 +875,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; mBrightnessThrottlingDataId = brightnessThrottlingDataId; loadFromDisplayDeviceConfig(token, info, hbmMetadata); /// Since the underlying display-device changed, we really don't know the // last command that was sent to change it's state. Lets assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) { changed = true; mBrightnessThrottlingDataId = brightnessThrottlingDataId; mBrightnessThrottler.resetThrottlingData( config.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { changed = true; Loading @@ -887,9 +899,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call updatePowerState(); } }); // TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent // displays mode } /** Loading Loading @@ -948,10 +957,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); } }); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode mBrightnessThrottler.resetThrottlingData( mDisplayDeviceConfig.getBrightnessThrottlingData(), mUniqueDisplayId); mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } private void sendUpdatePowerState() { Loading Loading @@ -2061,11 +2069,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private BrightnessThrottler createBrightnessThrottlerLocked() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode final DisplayDeviceConfig.BrightnessThrottlingData data = ddConfig != null ? ddConfig.getBrightnessThrottlingData() : null; return new BrightnessThrottler(mHandler, data, return new BrightnessThrottler(mHandler, ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); Loading
services/core/java/com/android/server/display/DisplayPowerController2.java +17 −12 Original line number Diff line number Diff line Loading @@ -411,6 +411,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private boolean mIsEnabled; private boolean mIsInTransition; private String mBrightnessThrottlingDataId; // DPCs following the brightness of this DPC. This is used in concurrent displays mode - there // is one lead display, the additional displays follow the brightness value of the lead display. @GuardedBy("mLock") Loading Loading @@ -443,6 +445,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mHighBrightnessModeMetadata = hbmMetadata; mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mBrightnessThrottlingDataId = logicalDisplay.getBrightnessThrottlingDataIdLocked(); mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); Loading Loading @@ -705,6 +708,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean isEnabled = mLogicalDisplay.isEnabledLocked(); final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); final String brightnessThrottlingDataId = mLogicalDisplay.getBrightnessThrottlingDataIdLocked(); mHandler.post(() -> { boolean changed = false; Loading @@ -714,6 +719,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; mBrightnessThrottlingDataId = brightnessThrottlingDataId; loadFromDisplayDeviceConfig(token, info, hbmMetadata); mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config); Loading @@ -721,6 +727,12 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Lets assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); } else if (!mBrightnessThrottlingDataId.equals(brightnessThrottlingDataId)) { changed = true; mBrightnessThrottlingDataId = brightnessThrottlingDataId; mBrightnessThrottler.resetThrottlingData( config.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { changed = true; Loading @@ -732,9 +744,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal updatePowerState(); } }); // TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent // displays mode } /** Loading Loading @@ -786,10 +795,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); } }); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode mBrightnessThrottler.resetThrottlingData( mDisplayDeviceConfig.getBrightnessThrottlingData(), mUniqueDisplayId); mDisplayDeviceConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), mUniqueDisplayId); } private void sendUpdatePowerState() { Loading Loading @@ -1768,11 +1776,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private BrightnessThrottler createBrightnessThrottlerLocked() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); // TODO (b/265793751): Use the appropriate throttling data if we're in concurrent displays // mode final DisplayDeviceConfig.BrightnessThrottlingData data = ddConfig != null ? ddConfig.getBrightnessThrottlingData() : null; return new BrightnessThrottler(mHandler, data, return new BrightnessThrottler(mHandler, ddConfig.getBrightnessThrottlingData(mBrightnessThrottlingDataId), () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); Loading
services/core/java/com/android/server/display/LogicalDisplay.java +26 −1 Original line number Diff line number Diff line Loading @@ -152,6 +152,13 @@ final class LogicalDisplay { // the {@link mIsEnabled} is changing, or the underlying mPrimiaryDisplayDevice is changing. private boolean mIsInTransition; /** * The ID of the brightness throttling data that should be used. This can change e.g. in * concurrent displays mode in which a stricter brightness throttling policy might need to be * used. */ private String mBrightnessThrottlingDataId; public LogicalDisplay(int displayId, int layerStack, DisplayDevice primaryDisplayDevice) { mDisplayId = displayId; mLayerStack = layerStack; Loading @@ -160,6 +167,7 @@ final class LogicalDisplay { mTempFrameRateOverride = new SparseArray<>(); mIsEnabled = true; mIsInTransition = false; mBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID; } /** Loading Loading @@ -762,7 +770,7 @@ final class LogicalDisplay { /** * Sets the display as enabled. * * @param enable True if enabled, false otherwise. * @param enabled True if enabled, false otherwise. */ public void setEnabledLocked(boolean enabled) { mIsEnabled = enabled; Loading @@ -785,6 +793,22 @@ final class LogicalDisplay { mIsInTransition = isInTransition; } /** * @return The ID of the brightness throttling data that this display should use. */ public String getBrightnessThrottlingDataIdLocked() { return mBrightnessThrottlingDataId; } /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { mBrightnessThrottlingDataId = brightnessThrottlingDataId; } public void dumpLocked(PrintWriter pw) { pw.println("mDisplayId=" + mDisplayId); pw.println("mIsEnabled=" + mIsEnabled); Loading @@ -802,6 +826,7 @@ final class LogicalDisplay { pw.println("mRequestedMinimalPostProcessing=" + mRequestedMinimalPostProcessing); pw.println("mFrameRateOverrides=" + Arrays.toString(mFrameRateOverrides)); pw.println("mPendingFrameRateOverrideUids=" + mPendingFrameRateOverrideUids); pw.println("mBrightnessThrottlingDataId=" + mBrightnessThrottlingDataId); } @Override Loading