From a2c206deb13c58cf510c08bd9f9e9358fc1db839 Mon Sep 17 00:00:00 2001 From: Fiona Campbell Date: Fri, 21 Jan 2022 16:47:17 +0000 Subject: [PATCH] Compensate for DWB changes in brightness Pass DWBController to brightness mapping strategy in order to adjust the brightness before we pass it to ABC. Bug: 215349117 Test: atest com.android.server.display Change-Id: I053c323b310021505d330127648fc110e7b18f77 --- .../display/BrightnessMappingStrategy.java | 25 ++++++++++++++----- .../display/DisplayPowerController.java | 2 +- .../BrightnessMappingStrategyTest.java | 3 ++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java index 240168b1878ce..a1d722b6df9df 100644 --- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java +++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java @@ -32,6 +32,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.util.Preconditions; import com.android.server.display.utils.Plog; +import com.android.server.display.whitebalance.DisplayWhiteBalanceController; import java.io.PrintWriter; import java.util.Arrays; @@ -69,7 +70,7 @@ public abstract class BrightnessMappingStrategy { @Nullable public static BrightnessMappingStrategy create(Resources resources, DisplayDeviceConfig displayDeviceConfig) { - return create(resources, displayDeviceConfig, /* isForIdleMode= */ false); + return create(resources, displayDeviceConfig, /* isForIdleMode= */ false, null); } /** @@ -80,8 +81,10 @@ public abstract class BrightnessMappingStrategy { */ @Nullable public static BrightnessMappingStrategy createForIdleMode(Resources resources, - DisplayDeviceConfig displayDeviceConfig) { - return create(resources, displayDeviceConfig, /* isForIdleMode= */ true); + DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController + displayWhiteBalanceController) { + return create(resources, displayDeviceConfig, /* isForIdleMode= */ true, + displayWhiteBalanceController); } /** @@ -96,7 +99,8 @@ public abstract class BrightnessMappingStrategy { */ @Nullable private static BrightnessMappingStrategy create(Resources resources, - DisplayDeviceConfig displayDeviceConfig, boolean isForIdleMode) { + DisplayDeviceConfig displayDeviceConfig, boolean isForIdleMode, + DisplayWhiteBalanceController displayWhiteBalanceController) { // Display independent, mode dependent values float[] brightnessLevelsNits; @@ -135,7 +139,7 @@ public abstract class BrightnessMappingStrategy { builder.setShortTermModelLowerLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); builder.setShortTermModelUpperLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); return new PhysicalMappingStrategy(builder.build(), nitsRange, brightnessRange, - autoBrightnessAdjustmentMaxGamma, isForIdleMode); + autoBrightnessAdjustmentMaxGamma, isForIdleMode, displayWhiteBalanceController); } else if (isValidMapping(luxLevels, brightnessLevelsBacklight) && !isForIdleMode) { return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight, autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout); @@ -770,9 +774,11 @@ public abstract class BrightnessMappingStrategy { private float mUserLux; private float mUserBrightness; private final boolean mIsForIdleMode; + private final DisplayWhiteBalanceController mDisplayWhiteBalanceController; public PhysicalMappingStrategy(BrightnessConfiguration config, float[] nits, - float[] brightness, float maxGamma, boolean isForIdleMode) { + float[] brightness, float maxGamma, boolean isForIdleMode, + DisplayWhiteBalanceController displayWhiteBalanceController) { Preconditions.checkArgument(nits.length != 0 && brightness.length != 0, "Nits and brightness arrays must not be empty!"); @@ -789,6 +795,7 @@ public abstract class BrightnessMappingStrategy { mAutoBrightnessAdjustment = 0; mUserLux = -1; mUserBrightness = -1; + mDisplayWhiteBalanceController = displayWhiteBalanceController; mNits = nits; mBrightness = brightness; @@ -836,6 +843,12 @@ public abstract class BrightnessMappingStrategy { public float getBrightness(float lux, String packageName, @ApplicationInfo.Category int category) { float nits = mBrightnessSpline.interpolate(lux); + + // Adjust nits to compensate for display white balance colour strength. + if (mDisplayWhiteBalanceController != null && isForIdleMode()) { + nits = mDisplayWhiteBalanceController.calculateAdjustedBrightnessNits(nits); + } + float brightness = mNitsToBrightnessSpline.interpolate(nits); // Correct the brightness according to the current application and its category, but // only if no user data point is set (as this will override the user setting). diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index ead773fc283a1..ec4b91a79ae62 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -897,7 +897,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayDeviceConfig); if (isIdleScreenBrightnessEnabled) { mIdleModeBrightnessMapper = BrightnessMappingStrategy.createForIdleMode(resources, - mDisplayDeviceConfig); + mDisplayDeviceConfig, mDisplayWhiteBalanceController); } if (mInteractiveModeBrightnessMapper != null) { diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java index c6757261ce420..24a47516a3669 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java @@ -393,7 +393,8 @@ public class BrightnessMappingStrategyTest { // Create an idle mode bms // This will fail if it tries to fetch the wrong configuration. - BrightnessMappingStrategy bms = BrightnessMappingStrategy.createForIdleMode(res, ddc); + BrightnessMappingStrategy bms = BrightnessMappingStrategy.createForIdleMode(res, ddc, + null); assertNotNull("BrightnessMappingStrategy should not be null", bms); // Ensure that the config is the one we set