Loading core/java/android/hardware/display/DisplayManagerInternal.java +5 −1 Original line number Diff line number Diff line Loading @@ -686,8 +686,12 @@ public abstract class DisplayManagerInternal { public RefreshRateRange range; public RefreshRateLimitation(@RefreshRateLimitType int type, float min, float max) { this(type, new RefreshRateRange(min, max)); } public RefreshRateLimitation(@RefreshRateLimitType int type, RefreshRateRange range) { this.type = type; range = new RefreshRateRange(min, max); this.range = range; } @Override Loading services/core/java/com/android/server/display/BrightnessRangeController.java +2 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.IBinder; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.brightness.clamper.HdrClamper; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.feature.DisplayManagerFlags; import java.io.PrintWriter; Loading Loading @@ -157,7 +158,7 @@ class BrightnessRangeController { private void updateHdrClamper(DisplayDeviceInfo info, IBinder token, DisplayDeviceConfig displayDeviceConfig) { if (mUseHdrClamper) { DisplayDeviceConfig.HighBrightnessModeData hbmData = HighBrightnessModeData hbmData = displayDeviceConfig.getHighBrightnessModeData(); float minimumHdrPercentOfScreen = hbmData == null ? -1f : hbmData.minimumHdrPercentOfScreen; Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +42 −164 Original line number Diff line number Diff line Loading @@ -53,9 +53,9 @@ import com.android.server.display.config.DisplayBrightnessPoint; import com.android.server.display.config.DisplayConfiguration; import com.android.server.display.config.DisplayQuirks; import com.android.server.display.config.EvenDimmerBrightnessData; import com.android.server.display.config.HbmTiming; import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.config.HysteresisLevels; import com.android.server.display.config.IdleScreenRefreshRateTimeout; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint; Loading @@ -75,8 +75,6 @@ import com.android.server.display.config.RefreshRateRange; import com.android.server.display.config.RefreshRateThrottlingMap; import com.android.server.display.config.RefreshRateThrottlingPoint; import com.android.server.display.config.RefreshRateZone; import com.android.server.display.config.SdrHdrRatioMap; import com.android.server.display.config.SdrHdrRatioPoint; import com.android.server.display.config.SensorData; import com.android.server.display.config.ThermalStatus; import com.android.server.display.config.ThermalThrottling; Loading Loading @@ -302,6 +300,19 @@ import javax.xml.datatype.DatatypeConfigurationException; * <brightnessIncreaseDurationMillis>10000</brightnessIncreaseDurationMillis> * <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis> * <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis> * <minimumHdrPercentOfScreenForNbm>0.2</minimumHdrPercentOfScreenForNbm> * <minimumHdrPercentOfScreenForHbm>0.5</minimumHdrPercentOfScreenForHbm> * <allowInLowPowerMode>true</allowInLowPowerMode> * <sdrHdrRatioMap> * <point> * <first>2.0</first> * <second>4.0</second> * </point> * <point> * <first>100</first> * <second>8.0</second> * </point> * </sdrHdrRatioMap> * </hdrBrightnessConfig> * <luxThrottling> * <brightnessLimitMap> Loading Loading @@ -659,9 +670,6 @@ public class DisplayDeviceConfig { // Invalid value of AutoBrightness brightening and darkening light debounce private static final int INVALID_AUTO_BRIGHTNESS_LIGHT_DEBOUNCE = -1; @VisibleForTesting static final float HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT = 0.5f; private final Context mContext; // The details of the ambient light sensor associated with this display. Loading Loading @@ -743,13 +751,13 @@ public class DisplayDeviceConfig { private Spline mNitsToBacklightSpline; private List<String> mQuirks; private boolean mIsHighBrightnessModeEnabled = false; @Nullable private HighBrightnessModeData mHbmData; @Nullable private PowerThrottlingConfigData mPowerThrottlingConfigData; private DensityMapping mDensityMapping; private String mLoadedFrom = null; private Spline mSdrToHdrRatioSpline; // Represents the auto-brightness brightening light debounce. private long mAutoBrightnessBrighteningLightDebounce = Loading Loading @@ -872,7 +880,7 @@ public class DisplayDeviceConfig { private final DisplayManagerFlags mFlags; @VisibleForTesting DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { public DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { mContext = context; mFlags = flags; } Loading Loading @@ -1155,7 +1163,7 @@ public class DisplayDeviceConfig { * @return true if there is sdrHdrRatioMap, false otherwise. */ public boolean hasSdrToHdrRatioSpline() { return mSdrToHdrRatioSpline != null; return mHbmData != null && mHbmData.sdrToHdrRatioSpline != null; } /** Loading @@ -1165,7 +1173,8 @@ public class DisplayDeviceConfig { * @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists. */ public float getHdrBrightnessFromSdr(float brightness, float maxDesiredHdrSdrRatio) { if (mSdrToHdrRatioSpline == null) { Spline sdrToHdrSpline = mHbmData != null ? mHbmData.sdrToHdrRatioSpline : null; if (sdrToHdrSpline == null) { return PowerManager.BRIGHTNESS_INVALID; } Loading @@ -1175,7 +1184,7 @@ public class DisplayDeviceConfig { return PowerManager.BRIGHTNESS_INVALID; } float ratio = Math.min(mSdrToHdrRatioSpline.interpolate(nits), maxDesiredHdrSdrRatio); float ratio = Math.min(sdrToHdrSpline.interpolate(nits), maxDesiredHdrSdrRatio); float hdrNits = nits * ratio; if (getNitsToBacklightSpline() == null) { return PowerManager.BRIGHTNESS_INVALID; Loading Loading @@ -1321,13 +1330,11 @@ public class DisplayDeviceConfig { * @return high brightness mode configuration data for the display. */ public HighBrightnessModeData getHighBrightnessModeData() { if (!mIsHighBrightnessModeEnabled || mHbmData == null) { if (mHbmData == null || !mHbmData.isHighBrightnessModeEnabled) { return null; } HighBrightnessModeData hbmData = new HighBrightnessModeData(); mHbmData.copyTo(hbmData); return hbmData; return mHbmData; } /** Loading Loading @@ -1604,11 +1611,10 @@ public class DisplayDeviceConfig { + ", mBacklightMaximum=" + mBacklightMaximum + ", mBrightnessDefault=" + mBrightnessDefault + ", mQuirks=" + mQuirks + ", mIsHighBrightnessModeEnabled=" + mIsHighBrightnessModeEnabled + "\n" + "mLuxThrottlingData=" + mLuxThrottlingData + ", mHbmData=" + mHbmData + ", mSdrToHdrRatioSpline=" + mSdrToHdrRatioSpline + ", mThermalBrightnessThrottlingDataMapByThrottlingId=" + mThermalBrightnessThrottlingDataMapByThrottlingId + "\n" Loading Loading @@ -1715,7 +1721,7 @@ public class DisplayDeviceConfig { } @VisibleForTesting boolean initFromFile(File configFile) { public boolean initFromFile(File configFile) { if (!configFile.exists()) { // Display configuration files aren't required to exist. return false; Loading @@ -1740,7 +1746,23 @@ public class DisplayDeviceConfig { loadBrightnessMap(config); loadThermalThrottlingConfig(config); loadPowerThrottlingConfigData(config); loadHighBrightnessModeData(config); // Backlight and evenDimmer data should be loaded for HbmData mHbmData = HighBrightnessModeData.loadHighBrightnessModeData(config, (hbm) -> { float transitionPointBacklightScale = hbm.getTransitionPoint_all().floatValue(); if (transitionPointBacklightScale >= mBacklightMaximum) { throw new IllegalArgumentException("HBM transition point invalid. " + mHbmData.transitionPoint + " is not less than " + mBacklightMaximum); } return getBrightnessFromBacklight(transitionPointBacklightScale); }); if (mHbmData.isHighBrightnessModeEnabled && mHbmData.refreshRateLimit != null) { // TODO(b/331650248): cleanup, DMD can use mHbmData.refreshRateLimit mRefreshRateLimitations.add(new RefreshRateLimitation( DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE, mHbmData.refreshRateLimit)); } loadLuxThrottling(config); loadQuirks(config); loadBrightnessRamps(config); Loading Loading @@ -1938,40 +1960,6 @@ public class DisplayDeviceConfig { constrainNitsAndBacklightArrays(); } private Spline loadSdrHdrRatioMap(HighBrightnessMode hbmConfig) { final SdrHdrRatioMap sdrHdrRatioMap = hbmConfig.getSdrHdrRatioMap_all(); if (sdrHdrRatioMap == null) { return null; } final List<SdrHdrRatioPoint> points = sdrHdrRatioMap.getPoint(); final int size = points.size(); if (size == 0) { return null; } float[] nits = new float[size]; float[] ratios = new float[size]; int i = 0; for (SdrHdrRatioPoint point : points) { nits[i] = point.getSdrNits().floatValue(); if (i > 0) { if (nits[i] < nits[i - 1]) { Slog.e(TAG, "sdrHdrRatioMap must be non-decreasing, ignoring rest " + " of configuration. nits: " + nits[i] + " < " + nits[i - 1]); return null; } } ratios[i] = point.getHdrRatio().floatValue(); ++i; } return Spline.createSpline(nits, ratios); } private void loadThermalThrottlingConfig(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Loading Loading @@ -2525,49 +2513,6 @@ public class DisplayDeviceConfig { } } private void loadHighBrightnessModeData(DisplayConfiguration config) { final HighBrightnessMode hbm = config.getHighBrightnessMode(); if (hbm != null) { mIsHighBrightnessModeEnabled = hbm.getEnabled(); mHbmData = new HighBrightnessModeData(); mHbmData.minimumLux = hbm.getMinimumLux_all().floatValue(); float transitionPointBacklightScale = hbm.getTransitionPoint_all().floatValue(); if (transitionPointBacklightScale >= mBacklightMaximum) { throw new IllegalArgumentException("HBM transition point invalid. " + mHbmData.transitionPoint + " is not less than " + mBacklightMaximum); } mHbmData.transitionPoint = getBrightnessFromBacklight(transitionPointBacklightScale); final HbmTiming hbmTiming = hbm.getTiming_all(); mHbmData.timeWindowMillis = hbmTiming.getTimeWindowSecs_all().longValue() * 1000; mHbmData.timeMaxMillis = hbmTiming.getTimeMaxSecs_all().longValue() * 1000; mHbmData.timeMinMillis = hbmTiming.getTimeMinSecs_all().longValue() * 1000; mHbmData.allowInLowPowerMode = hbm.getAllowInLowPowerMode_all(); final RefreshRateRange rr = hbm.getRefreshRate_all(); if (rr != null) { final float min = rr.getMinimum().floatValue(); final float max = rr.getMaximum().floatValue(); mRefreshRateLimitations.add(new RefreshRateLimitation( DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE, min, max)); } BigDecimal minHdrPctOfScreen = hbm.getMinimumHdrPercentOfScreen_all(); if (minHdrPctOfScreen != null) { mHbmData.minimumHdrPercentOfScreen = minHdrPctOfScreen.floatValue(); if (mHbmData.minimumHdrPercentOfScreen > 1 || mHbmData.minimumHdrPercentOfScreen < 0) { Slog.w(TAG, "Invalid minimum HDR percent of screen: " + String.valueOf(mHbmData.minimumHdrPercentOfScreen)); mHbmData.minimumHdrPercentOfScreen = HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT; } } else { mHbmData.minimumHdrPercentOfScreen = HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT; } mSdrToHdrRatioSpline = loadSdrHdrRatioMap(hbm); } } private void loadLuxThrottling(DisplayConfiguration config) { LuxThrottling cfg = config.getLuxThrottling(); if (cfg != null) { Loading Loading @@ -2920,73 +2865,6 @@ public class DisplayDeviceConfig { .config_screenBrightnessCapForWearBedtimeMode)); } /** * Container for high brightness mode configuration data. */ static class HighBrightnessModeData { /** Minimum lux needed to enter high brightness mode */ public float minimumLux; /** Brightness level at which we transition from normal to high-brightness. */ public float transitionPoint; /** Whether HBM is allowed when {@code Settings.Global.LOW_POWER_MODE} is active. */ public boolean allowInLowPowerMode; /** Time window for HBM. */ public long timeWindowMillis; /** Maximum time HBM is allowed to be during in a {@code timeWindowMillis}. */ public long timeMaxMillis; /** Minimum time that HBM can be on before being enabled. */ public long timeMinMillis; /** Minimum HDR video size to enter high brightness mode */ public float minimumHdrPercentOfScreen; HighBrightnessModeData() {} HighBrightnessModeData(float minimumLux, float transitionPoint, long timeWindowMillis, long timeMaxMillis, long timeMinMillis, boolean allowInLowPowerMode, float minimumHdrPercentOfScreen) { this.minimumLux = minimumLux; this.transitionPoint = transitionPoint; this.timeWindowMillis = timeWindowMillis; this.timeMaxMillis = timeMaxMillis; this.timeMinMillis = timeMinMillis; this.allowInLowPowerMode = allowInLowPowerMode; this.minimumHdrPercentOfScreen = minimumHdrPercentOfScreen; } /** * Copies the HBM data to the specified parameter instance. * @param other the instance to copy data to. */ public void copyTo(@NonNull HighBrightnessModeData other) { other.minimumLux = minimumLux; other.timeWindowMillis = timeWindowMillis; other.timeMaxMillis = timeMaxMillis; other.timeMinMillis = timeMinMillis; other.transitionPoint = transitionPoint; other.allowInLowPowerMode = allowInLowPowerMode; other.minimumHdrPercentOfScreen = minimumHdrPercentOfScreen; } @Override public String toString() { return "HBM{" + "minLux: " + minimumLux + ", transition: " + transitionPoint + ", timeWindow: " + timeWindowMillis + "ms" + ", timeMax: " + timeMaxMillis + "ms" + ", timeMin: " + timeMinMillis + "ms" + ", allowInLowPowerMode: " + allowInLowPowerMode + ", minimumHdrPercentOfScreen: " + minimumHdrPercentOfScreen + "} "; } } /** * Container for Power throttling configuration data. * TODO(b/302814899): extract to separate class. Loading services/core/java/com/android/server/display/DisplayPowerController.java +3 −2 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ import com.android.server.display.brightness.strategy.AutomaticBrightnessStrateg import com.android.server.display.brightness.strategy.DisplayBrightnessStrategyConstants; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; import com.android.server.display.color.ColorDisplayService.ReduceBrightColorsListener; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.config.HysteresisLevels; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.layout.Layout; Loading Loading @@ -2017,7 +2018,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final DisplayDeviceConfig ddConfig = mDisplayDevice.getDisplayDeviceConfig(); final IBinder displayToken = mDisplayDevice.getDisplayTokenLocked(); final String displayUniqueId = mDisplayDevice.getUniqueId(); final DisplayDeviceConfig.HighBrightnessModeData hbmData = final HighBrightnessModeData hbmData = ddConfig != null ? ddConfig.getHighBrightnessModeData() : null; final DisplayDeviceInfo info = mDisplayDevice.getDisplayDeviceInfoLocked(); return mInjector.getHighBrightnessModeController(mHandler, info.width, info.height, Loading Loading @@ -3251,7 +3252,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HighBrightnessModeController getHighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, DisplayDeviceConfig.HighBrightnessModeData hbmData, float brightnessMax, HighBrightnessModeData hbmData, HighBrightnessModeController.HdrBrightnessDeviceConfig hdrBrightnessCfg, Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) { Loading services/core/java/com/android/server/display/HighBrightnessModeController.java +1 −1 Original line number Diff line number Diff line Loading @@ -36,8 +36,8 @@ import android.view.SurfaceControlHdrLayerInfoListener; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.util.FrameworkStatsLog; import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData; import com.android.server.display.DisplayManagerService.Clock; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.utils.DebugUtils; import java.io.PrintWriter; Loading Loading
core/java/android/hardware/display/DisplayManagerInternal.java +5 −1 Original line number Diff line number Diff line Loading @@ -686,8 +686,12 @@ public abstract class DisplayManagerInternal { public RefreshRateRange range; public RefreshRateLimitation(@RefreshRateLimitType int type, float min, float max) { this(type, new RefreshRateRange(min, max)); } public RefreshRateLimitation(@RefreshRateLimitType int type, RefreshRateRange range) { this.type = type; range = new RefreshRateRange(min, max); this.range = range; } @Override Loading
services/core/java/com/android/server/display/BrightnessRangeController.java +2 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.IBinder; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.brightness.clamper.HdrClamper; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.feature.DisplayManagerFlags; import java.io.PrintWriter; Loading Loading @@ -157,7 +158,7 @@ class BrightnessRangeController { private void updateHdrClamper(DisplayDeviceInfo info, IBinder token, DisplayDeviceConfig displayDeviceConfig) { if (mUseHdrClamper) { DisplayDeviceConfig.HighBrightnessModeData hbmData = HighBrightnessModeData hbmData = displayDeviceConfig.getHighBrightnessModeData(); float minimumHdrPercentOfScreen = hbmData == null ? -1f : hbmData.minimumHdrPercentOfScreen; Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +42 −164 Original line number Diff line number Diff line Loading @@ -53,9 +53,9 @@ import com.android.server.display.config.DisplayBrightnessPoint; import com.android.server.display.config.DisplayConfiguration; import com.android.server.display.config.DisplayQuirks; import com.android.server.display.config.EvenDimmerBrightnessData; import com.android.server.display.config.HbmTiming; import com.android.server.display.config.HdrBrightnessData; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.config.HysteresisLevels; import com.android.server.display.config.IdleScreenRefreshRateTimeout; import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint; Loading @@ -75,8 +75,6 @@ import com.android.server.display.config.RefreshRateRange; import com.android.server.display.config.RefreshRateThrottlingMap; import com.android.server.display.config.RefreshRateThrottlingPoint; import com.android.server.display.config.RefreshRateZone; import com.android.server.display.config.SdrHdrRatioMap; import com.android.server.display.config.SdrHdrRatioPoint; import com.android.server.display.config.SensorData; import com.android.server.display.config.ThermalStatus; import com.android.server.display.config.ThermalThrottling; Loading Loading @@ -302,6 +300,19 @@ import javax.xml.datatype.DatatypeConfigurationException; * <brightnessIncreaseDurationMillis>10000</brightnessIncreaseDurationMillis> * <brightnessDecreaseDebounceMillis>13000</brightnessDecreaseDebounceMillis> * <brightnessDecreaseDurationMillis>10000</brightnessDecreaseDurationMillis> * <minimumHdrPercentOfScreenForNbm>0.2</minimumHdrPercentOfScreenForNbm> * <minimumHdrPercentOfScreenForHbm>0.5</minimumHdrPercentOfScreenForHbm> * <allowInLowPowerMode>true</allowInLowPowerMode> * <sdrHdrRatioMap> * <point> * <first>2.0</first> * <second>4.0</second> * </point> * <point> * <first>100</first> * <second>8.0</second> * </point> * </sdrHdrRatioMap> * </hdrBrightnessConfig> * <luxThrottling> * <brightnessLimitMap> Loading Loading @@ -659,9 +670,6 @@ public class DisplayDeviceConfig { // Invalid value of AutoBrightness brightening and darkening light debounce private static final int INVALID_AUTO_BRIGHTNESS_LIGHT_DEBOUNCE = -1; @VisibleForTesting static final float HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT = 0.5f; private final Context mContext; // The details of the ambient light sensor associated with this display. Loading Loading @@ -743,13 +751,13 @@ public class DisplayDeviceConfig { private Spline mNitsToBacklightSpline; private List<String> mQuirks; private boolean mIsHighBrightnessModeEnabled = false; @Nullable private HighBrightnessModeData mHbmData; @Nullable private PowerThrottlingConfigData mPowerThrottlingConfigData; private DensityMapping mDensityMapping; private String mLoadedFrom = null; private Spline mSdrToHdrRatioSpline; // Represents the auto-brightness brightening light debounce. private long mAutoBrightnessBrighteningLightDebounce = Loading Loading @@ -872,7 +880,7 @@ public class DisplayDeviceConfig { private final DisplayManagerFlags mFlags; @VisibleForTesting DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { public DisplayDeviceConfig(Context context, DisplayManagerFlags flags) { mContext = context; mFlags = flags; } Loading Loading @@ -1155,7 +1163,7 @@ public class DisplayDeviceConfig { * @return true if there is sdrHdrRatioMap, false otherwise. */ public boolean hasSdrToHdrRatioSpline() { return mSdrToHdrRatioSpline != null; return mHbmData != null && mHbmData.sdrToHdrRatioSpline != null; } /** Loading @@ -1165,7 +1173,8 @@ public class DisplayDeviceConfig { * @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists. */ public float getHdrBrightnessFromSdr(float brightness, float maxDesiredHdrSdrRatio) { if (mSdrToHdrRatioSpline == null) { Spline sdrToHdrSpline = mHbmData != null ? mHbmData.sdrToHdrRatioSpline : null; if (sdrToHdrSpline == null) { return PowerManager.BRIGHTNESS_INVALID; } Loading @@ -1175,7 +1184,7 @@ public class DisplayDeviceConfig { return PowerManager.BRIGHTNESS_INVALID; } float ratio = Math.min(mSdrToHdrRatioSpline.interpolate(nits), maxDesiredHdrSdrRatio); float ratio = Math.min(sdrToHdrSpline.interpolate(nits), maxDesiredHdrSdrRatio); float hdrNits = nits * ratio; if (getNitsToBacklightSpline() == null) { return PowerManager.BRIGHTNESS_INVALID; Loading Loading @@ -1321,13 +1330,11 @@ public class DisplayDeviceConfig { * @return high brightness mode configuration data for the display. */ public HighBrightnessModeData getHighBrightnessModeData() { if (!mIsHighBrightnessModeEnabled || mHbmData == null) { if (mHbmData == null || !mHbmData.isHighBrightnessModeEnabled) { return null; } HighBrightnessModeData hbmData = new HighBrightnessModeData(); mHbmData.copyTo(hbmData); return hbmData; return mHbmData; } /** Loading Loading @@ -1604,11 +1611,10 @@ public class DisplayDeviceConfig { + ", mBacklightMaximum=" + mBacklightMaximum + ", mBrightnessDefault=" + mBrightnessDefault + ", mQuirks=" + mQuirks + ", mIsHighBrightnessModeEnabled=" + mIsHighBrightnessModeEnabled + "\n" + "mLuxThrottlingData=" + mLuxThrottlingData + ", mHbmData=" + mHbmData + ", mSdrToHdrRatioSpline=" + mSdrToHdrRatioSpline + ", mThermalBrightnessThrottlingDataMapByThrottlingId=" + mThermalBrightnessThrottlingDataMapByThrottlingId + "\n" Loading Loading @@ -1715,7 +1721,7 @@ public class DisplayDeviceConfig { } @VisibleForTesting boolean initFromFile(File configFile) { public boolean initFromFile(File configFile) { if (!configFile.exists()) { // Display configuration files aren't required to exist. return false; Loading @@ -1740,7 +1746,23 @@ public class DisplayDeviceConfig { loadBrightnessMap(config); loadThermalThrottlingConfig(config); loadPowerThrottlingConfigData(config); loadHighBrightnessModeData(config); // Backlight and evenDimmer data should be loaded for HbmData mHbmData = HighBrightnessModeData.loadHighBrightnessModeData(config, (hbm) -> { float transitionPointBacklightScale = hbm.getTransitionPoint_all().floatValue(); if (transitionPointBacklightScale >= mBacklightMaximum) { throw new IllegalArgumentException("HBM transition point invalid. " + mHbmData.transitionPoint + " is not less than " + mBacklightMaximum); } return getBrightnessFromBacklight(transitionPointBacklightScale); }); if (mHbmData.isHighBrightnessModeEnabled && mHbmData.refreshRateLimit != null) { // TODO(b/331650248): cleanup, DMD can use mHbmData.refreshRateLimit mRefreshRateLimitations.add(new RefreshRateLimitation( DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE, mHbmData.refreshRateLimit)); } loadLuxThrottling(config); loadQuirks(config); loadBrightnessRamps(config); Loading Loading @@ -1938,40 +1960,6 @@ public class DisplayDeviceConfig { constrainNitsAndBacklightArrays(); } private Spline loadSdrHdrRatioMap(HighBrightnessMode hbmConfig) { final SdrHdrRatioMap sdrHdrRatioMap = hbmConfig.getSdrHdrRatioMap_all(); if (sdrHdrRatioMap == null) { return null; } final List<SdrHdrRatioPoint> points = sdrHdrRatioMap.getPoint(); final int size = points.size(); if (size == 0) { return null; } float[] nits = new float[size]; float[] ratios = new float[size]; int i = 0; for (SdrHdrRatioPoint point : points) { nits[i] = point.getSdrNits().floatValue(); if (i > 0) { if (nits[i] < nits[i - 1]) { Slog.e(TAG, "sdrHdrRatioMap must be non-decreasing, ignoring rest " + " of configuration. nits: " + nits[i] + " < " + nits[i - 1]); return null; } } ratios[i] = point.getHdrRatio().floatValue(); ++i; } return Spline.createSpline(nits, ratios); } private void loadThermalThrottlingConfig(DisplayConfiguration config) { final ThermalThrottling throttlingConfig = config.getThermalThrottling(); if (throttlingConfig == null) { Loading Loading @@ -2525,49 +2513,6 @@ public class DisplayDeviceConfig { } } private void loadHighBrightnessModeData(DisplayConfiguration config) { final HighBrightnessMode hbm = config.getHighBrightnessMode(); if (hbm != null) { mIsHighBrightnessModeEnabled = hbm.getEnabled(); mHbmData = new HighBrightnessModeData(); mHbmData.minimumLux = hbm.getMinimumLux_all().floatValue(); float transitionPointBacklightScale = hbm.getTransitionPoint_all().floatValue(); if (transitionPointBacklightScale >= mBacklightMaximum) { throw new IllegalArgumentException("HBM transition point invalid. " + mHbmData.transitionPoint + " is not less than " + mBacklightMaximum); } mHbmData.transitionPoint = getBrightnessFromBacklight(transitionPointBacklightScale); final HbmTiming hbmTiming = hbm.getTiming_all(); mHbmData.timeWindowMillis = hbmTiming.getTimeWindowSecs_all().longValue() * 1000; mHbmData.timeMaxMillis = hbmTiming.getTimeMaxSecs_all().longValue() * 1000; mHbmData.timeMinMillis = hbmTiming.getTimeMinSecs_all().longValue() * 1000; mHbmData.allowInLowPowerMode = hbm.getAllowInLowPowerMode_all(); final RefreshRateRange rr = hbm.getRefreshRate_all(); if (rr != null) { final float min = rr.getMinimum().floatValue(); final float max = rr.getMaximum().floatValue(); mRefreshRateLimitations.add(new RefreshRateLimitation( DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE, min, max)); } BigDecimal minHdrPctOfScreen = hbm.getMinimumHdrPercentOfScreen_all(); if (minHdrPctOfScreen != null) { mHbmData.minimumHdrPercentOfScreen = minHdrPctOfScreen.floatValue(); if (mHbmData.minimumHdrPercentOfScreen > 1 || mHbmData.minimumHdrPercentOfScreen < 0) { Slog.w(TAG, "Invalid minimum HDR percent of screen: " + String.valueOf(mHbmData.minimumHdrPercentOfScreen)); mHbmData.minimumHdrPercentOfScreen = HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT; } } else { mHbmData.minimumHdrPercentOfScreen = HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT; } mSdrToHdrRatioSpline = loadSdrHdrRatioMap(hbm); } } private void loadLuxThrottling(DisplayConfiguration config) { LuxThrottling cfg = config.getLuxThrottling(); if (cfg != null) { Loading Loading @@ -2920,73 +2865,6 @@ public class DisplayDeviceConfig { .config_screenBrightnessCapForWearBedtimeMode)); } /** * Container for high brightness mode configuration data. */ static class HighBrightnessModeData { /** Minimum lux needed to enter high brightness mode */ public float minimumLux; /** Brightness level at which we transition from normal to high-brightness. */ public float transitionPoint; /** Whether HBM is allowed when {@code Settings.Global.LOW_POWER_MODE} is active. */ public boolean allowInLowPowerMode; /** Time window for HBM. */ public long timeWindowMillis; /** Maximum time HBM is allowed to be during in a {@code timeWindowMillis}. */ public long timeMaxMillis; /** Minimum time that HBM can be on before being enabled. */ public long timeMinMillis; /** Minimum HDR video size to enter high brightness mode */ public float minimumHdrPercentOfScreen; HighBrightnessModeData() {} HighBrightnessModeData(float minimumLux, float transitionPoint, long timeWindowMillis, long timeMaxMillis, long timeMinMillis, boolean allowInLowPowerMode, float minimumHdrPercentOfScreen) { this.minimumLux = minimumLux; this.transitionPoint = transitionPoint; this.timeWindowMillis = timeWindowMillis; this.timeMaxMillis = timeMaxMillis; this.timeMinMillis = timeMinMillis; this.allowInLowPowerMode = allowInLowPowerMode; this.minimumHdrPercentOfScreen = minimumHdrPercentOfScreen; } /** * Copies the HBM data to the specified parameter instance. * @param other the instance to copy data to. */ public void copyTo(@NonNull HighBrightnessModeData other) { other.minimumLux = minimumLux; other.timeWindowMillis = timeWindowMillis; other.timeMaxMillis = timeMaxMillis; other.timeMinMillis = timeMinMillis; other.transitionPoint = transitionPoint; other.allowInLowPowerMode = allowInLowPowerMode; other.minimumHdrPercentOfScreen = minimumHdrPercentOfScreen; } @Override public String toString() { return "HBM{" + "minLux: " + minimumLux + ", transition: " + transitionPoint + ", timeWindow: " + timeWindowMillis + "ms" + ", timeMax: " + timeMaxMillis + "ms" + ", timeMin: " + timeMinMillis + "ms" + ", allowInLowPowerMode: " + allowInLowPowerMode + ", minimumHdrPercentOfScreen: " + minimumHdrPercentOfScreen + "} "; } } /** * Container for Power throttling configuration data. * TODO(b/302814899): extract to separate class. Loading
services/core/java/com/android/server/display/DisplayPowerController.java +3 −2 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ import com.android.server.display.brightness.strategy.AutomaticBrightnessStrateg import com.android.server.display.brightness.strategy.DisplayBrightnessStrategyConstants; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; import com.android.server.display.color.ColorDisplayService.ReduceBrightColorsListener; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.config.HysteresisLevels; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.layout.Layout; Loading Loading @@ -2017,7 +2018,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final DisplayDeviceConfig ddConfig = mDisplayDevice.getDisplayDeviceConfig(); final IBinder displayToken = mDisplayDevice.getDisplayTokenLocked(); final String displayUniqueId = mDisplayDevice.getUniqueId(); final DisplayDeviceConfig.HighBrightnessModeData hbmData = final HighBrightnessModeData hbmData = ddConfig != null ? ddConfig.getHighBrightnessModeData() : null; final DisplayDeviceInfo info = mDisplayDevice.getDisplayDeviceInfoLocked(); return mInjector.getHighBrightnessModeController(mHandler, info.width, info.height, Loading Loading @@ -3251,7 +3252,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HighBrightnessModeController getHighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, DisplayDeviceConfig.HighBrightnessModeData hbmData, float brightnessMax, HighBrightnessModeData hbmData, HighBrightnessModeController.HdrBrightnessDeviceConfig hdrBrightnessCfg, Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) { Loading
services/core/java/com/android/server/display/HighBrightnessModeController.java +1 −1 Original line number Diff line number Diff line Loading @@ -36,8 +36,8 @@ import android.view.SurfaceControlHdrLayerInfoListener; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.util.FrameworkStatsLog; import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData; import com.android.server.display.DisplayManagerService.Clock; import com.android.server.display.config.HighBrightnessModeData; import com.android.server.display.utils.DebugUtils; import java.io.PrintWriter; Loading