Merge "Add brightness throttling map for concurrent displays"

This commit is contained in:
TreeHugger Robot
2023-01-25 11:41:43 +00:00
committed by Android (Google) Code Review
6 changed files with 182 additions and 11 deletions

View File

@@ -132,6 +132,16 @@ import javax.xml.datatype.DatatypeConfigurationException;
* <brightness>0.01</brightness>
* </brightnessThrottlingPoint>
* </brightnessThrottlingMap>
* <concurrentDisplaysBrightnessThrottlingMap>
* <brightnessThrottlingPoint>
* <thermalStatus>severe</thermalStatus>
* <brightness>0.07</brightness>
* </brightnessThrottlingPoint>
* <brightnessThrottlingPoint>
* <thermalStatus>critical</thermalStatus>
* <brightness>0.005</brightness>
* </brightnessThrottlingPoint>
* </concurrentDisplaysBrightnessThrottlingMap>
* </thermalThrottling>
*
* <refreshRate>
@@ -613,6 +623,8 @@ public class DisplayDeviceConfig {
// overwritten value.
private BrightnessThrottlingData mBrightnessThrottlingData;
private BrightnessThrottlingData mOriginalBrightnessThrottlingData;
// The concurrent displays mode might need a stricter throttling policy
private BrightnessThrottlingData mConcurrentDisplaysBrightnessThrottlingData;
@VisibleForTesting
DisplayDeviceConfig(Context context) {
@@ -1258,12 +1270,20 @@ public class DisplayDeviceConfig {
}
/**
* @return brightness throttling data configuration data for the display.
* @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);
}
/**
* @return Auto brightness darkening light debounce
*/
@@ -1503,6 +1523,7 @@ public class DisplayDeviceConfig {
loadBrightnessConstraintsFromConfigXml();
loadBrightnessMap(config);
loadBrightnessThrottlingMap(config);
loadConcurrentDisplaysBrightnessThrottlingMap(config);
loadHighBrightnessModeData(config);
loadQuirks(config);
loadBrightnessRamps(config);
@@ -1714,13 +1735,13 @@ public class DisplayDeviceConfig {
private void loadBrightnessThrottlingMap(DisplayConfiguration config) {
final ThermalThrottling throttlingConfig = config.getThermalThrottling();
if (throttlingConfig == null) {
Slog.i(TAG, "no thermal throttling config found");
Slog.i(TAG, "No thermal throttling config found");
return;
}
final BrightnessThrottlingMap map = throttlingConfig.getBrightnessThrottlingMap();
if (map == null) {
Slog.i(TAG, "no brightness throttling map found");
Slog.i(TAG, "No brightness throttling map found");
return;
}
@@ -1747,6 +1768,43 @@ public class DisplayDeviceConfig {
}
}
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;
}
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;
}
throttlingLevels.add(new BrightnessThrottlingData.ThrottlingLevel(
convertThermalStatus(status), point.getBrightness().floatValue()));
}
if (!badConfig) {
mConcurrentDisplaysBrightnessThrottlingData =
BrightnessThrottlingData.create(throttlingLevels);
}
}
private void loadRefreshRateSetting(DisplayConfiguration config) {
final RefreshRateConfigs refreshRateConfigs =
(config == null) ? null : config.getRefreshRate();
@@ -2529,7 +2587,8 @@ public class DisplayDeviceConfig {
}
}
private @PowerManager.ThermalStatus int convertThermalStatus(ThermalStatus value) {
@VisibleForTesting
static @PowerManager.ThermalStatus int convertThermalStatus(ThermalStatus value) {
if (value == null) {
return PowerManager.THERMAL_STATUS_NONE;
}
@@ -2855,7 +2914,8 @@ public class DisplayDeviceConfig {
return throttlingLevels.hashCode();
}
private BrightnessThrottlingData(List<ThrottlingLevel> inLevels) {
@VisibleForTesting
BrightnessThrottlingData(List<ThrottlingLevel> inLevels) {
throttlingLevels = new ArrayList<>(inLevels.size());
for (ThrottlingLevel level : inLevels) {
throttlingLevels.add(new ThrottlingLevel(level.thermalStatus, level.brightness));

View File

@@ -885,6 +885,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
updatePowerState();
}
});
// TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent
// displays mode
}
/**
@@ -943,6 +946,8 @@ 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);
}
@@ -2048,6 +2053,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,

View File

@@ -732,6 +732,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
updatePowerState();
}
});
// TODO (b/265793751): Re-create BrightnessTracker if we're enetering/exiting concurrent
// displays mode
}
/**
@@ -783,6 +786,8 @@ 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);
}
@@ -1755,6 +1760,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,

View File

@@ -202,12 +202,15 @@
</xs:simpleType>
<xs:complexType name="thermalThrottling">
<xs:complexType>
<xs:sequence>
<xs:element type="brightnessThrottlingMap" name="brightnessThrottlingMap">
<xs:annotation name="nonnull"/>
<xs:annotation name="final"/>
</xs:element>
</xs:complexType>
<xs:element type="brightnessThrottlingMap" name="concurrentDisplaysBrightnessThrottlingMap">
<xs:annotation name="final"/>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="brightnessThrottlingMap">

View File

@@ -237,7 +237,9 @@ package com.android.server.display.config {
public class ThermalThrottling {
ctor public ThermalThrottling();
method @NonNull public final com.android.server.display.config.BrightnessThrottlingMap getBrightnessThrottlingMap();
method public final com.android.server.display.config.BrightnessThrottlingMap getConcurrentDisplaysBrightnessThrottlingMap();
method public final void setBrightnessThrottlingMap(@NonNull com.android.server.display.config.BrightnessThrottlingMap);
method public final void setConcurrentDisplaysBrightnessThrottlingMap(com.android.server.display.config.BrightnessThrottlingMap);
}
public class ThresholdPoint {

View File

@@ -32,6 +32,7 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.R;
import com.android.server.display.config.ThermalStatus;
import org.junit.Before;
import org.junit.Test;
@@ -43,6 +44,8 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -164,6 +167,51 @@ public final class DisplayDeviceConfigTest {
assertArrayEquals(new int[]{-1, 10, 20, 30, 40},
mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux());
List<DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel> throttlingLevels =
new ArrayList();
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.light), 0.4f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.moderate), 0.3f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.severe), 0.2f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.critical), 0.1f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.emergency), 0.05f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.shutdown), 0.025f
));
assertEquals(new DisplayDeviceConfig.BrightnessThrottlingData(throttlingLevels),
mDisplayDeviceConfig.getBrightnessThrottlingData());
throttlingLevels.clear();
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.light), 0.2f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.moderate), 0.15f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.severe), 0.1f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.critical), 0.05f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.emergency), 0.025f
));
throttlingLevels.add(new DisplayDeviceConfig.BrightnessThrottlingData.ThrottlingLevel(
DisplayDeviceConfig.convertThermalStatus(ThermalStatus.shutdown), 0.0125f
));
assertEquals(new DisplayDeviceConfig.BrightnessThrottlingData(throttlingLevels),
mDisplayDeviceConfig.getConcurrentDisplaysBrightnessThrottlingData());
// Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
// HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
}
@@ -428,16 +476,60 @@ public final class DisplayDeviceConfigTest {
+ "<ambientLightHorizonShort>50</ambientLightHorizonShort>\n"
+ "<screenBrightnessRampIncreaseMaxMillis>"
+ "2000"
+ "</screenBrightnessRampIncreaseMaxMillis>\n"
+ "</screenBrightnessRampIncreaseMaxMillis>\n"
+ "<thermalThrottling>\n"
+ "<brightnessThrottlingMap>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>light</thermalStatus>\n"
+ "<brightness>0.4</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>moderate</thermalStatus>\n"
+ "<brightness>0.3</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>severe</thermalStatus>\n"
+ "<brightness>0.2</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>critical</thermalStatus>\n"
+ "<brightness>0.1</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>emergency</thermalStatus>\n"
+ "<!-- Throttling to 250 nits: (250-2.0)/(500-2.0)*(0.62-0.0)+0"
+ ".0 = 0.30875502 -->\n"
+ "<brightness>0.30875502</brightness>\n"
+ "<brightness>0.05</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>shutdown</thermalStatus>\n"
+ "<brightness>0.025</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "</brightnessThrottlingMap>\n"
+ "<concurrentDisplaysBrightnessThrottlingMap>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>light</thermalStatus>\n"
+ "<brightness>0.2</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>moderate</thermalStatus>\n"
+ "<brightness>0.15</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>severe</thermalStatus>\n"
+ "<brightness>0.1</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>critical</thermalStatus>\n"
+ "<brightness>0.05</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>emergency</thermalStatus>\n"
+ "<brightness>0.025</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "<brightnessThrottlingPoint>\n"
+ "<thermalStatus>shutdown</thermalStatus>\n"
+ "<brightness>0.0125</brightness>\n"
+ "</brightnessThrottlingPoint>\n"
+ "</concurrentDisplaysBrightnessThrottlingMap>\n"
+ "</thermalThrottling>\n"
+ "<refreshRate>\n"
+ "<lowerBlockingZoneConfigs>\n"