summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santos Cordon <santoscordon@google.com> 2020-12-14 13:28:13 +0000
committer Santos Cordon <santoscordon@google.com> 2020-12-16 16:40:12 +0000
commit0f42b0bb305e2f15ed9af14c3066bc4f39cea55d (patch)
tree15bc2c3210646574d9a4fca73c8878d01dfc135b
parent2acc16e9373fbef4281636e3d5aed9b2edcc4d88 (diff)
Add notion of Quirks the Device Display Config files.
On some devices, the system may not operate as expected and specialized code may be necessary to work around these limitations or "quirks". Add the notion of quirks to the config files so that devices can be easily configured to operate around their unexpected behavior. As a first "quirk" to add, we specify if a display supports setting brightness via the SourceControl.setBrighntess API. Bug: 170954431 Test: manually check that brightness works Test: atest frameworks/base/services/tests/servicestests/src/com/android/server/display Change-Id: Ia3cedf9ec7a2457e27763e0c58020c1edfbae408
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceConfig.java23
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java32
-rw-r--r--services/core/xsd/display-device-config/display-device-config.xsd7
-rw-r--r--services/core/xsd/display-device-config/schema/current.txt7
4 files changed, 60 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index a8e56a1187cf..574d8c6d848a 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -21,6 +21,7 @@ import android.util.Slog;
import android.view.DisplayAddress;
import com.android.server.display.config.DisplayConfiguration;
+import com.android.server.display.config.DisplayQuirks;
import com.android.server.display.config.NitsMap;
import com.android.server.display.config.Point;
import com.android.server.display.config.XmlParser;
@@ -32,6 +33,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -45,6 +47,8 @@ public class DisplayDeviceConfig {
public static final float HIGH_BRIGHTNESS_MODE_UNSUPPORTED = Float.NaN;
+ public static final String QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC = "canSetBrightnessViaHwc";
+
private static final String ETC_DIR = "etc";
private static final String DISPLAY_CONFIG_DIR = "displayconfig";
private static final String CONFIG_FILE_FORMAT = "display_%s.xml";
@@ -55,6 +59,7 @@ public class DisplayDeviceConfig {
private float[] mNits;
private float[] mBrightness;
+ private List<String> mQuirks;
private DisplayDeviceConfig() {
}
@@ -134,11 +139,21 @@ public class DisplayDeviceConfig {
return mBrightness;
}
+ /**
+ * @param quirkValue The quirk to test.
+ * @return {@code true} if the specified quirk is present in this configuration,
+ * {@code false} otherwise.
+ */
+ public boolean hasQuirk(String quirkValue) {
+ return mQuirks != null && mQuirks.contains(quirkValue);
+ }
+
@Override
public String toString() {
String str = "DisplayDeviceConfig{"
+ "mBrightness=" + Arrays.toString(mBrightness)
+ ", mNits=" + Arrays.toString(mNits)
+ + ", mQuirks=" + mQuirks
+ "}";
return str;
}
@@ -173,6 +188,7 @@ public class DisplayDeviceConfig {
try (InputStream in = new BufferedInputStream(new FileInputStream(configFile))) {
final DisplayConfiguration config = XmlParser.read(in);
loadBrightnessMap(config);
+ loadQuirks(config);
} catch (IOException | DatatypeConfigurationException | XmlPullParserException e) {
Slog.e(TAG, "Encountered an error while reading/parsing display config file: "
+ configFile, e);
@@ -210,4 +226,11 @@ public class DisplayDeviceConfig {
mNits = nits;
mBrightness = backlight;
}
+
+ private void loadQuirks(DisplayConfiguration config) {
+ final DisplayQuirks quirks = config.getQuirks();
+ if (quirks != null) {
+ mQuirks = new ArrayList<>(quirks.getQuirk());
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 155b246a1408..9b8ed3a2dd8c 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -185,6 +185,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private DisplayDeviceInfo mInfo;
private boolean mHavePendingChanges;
private int mState = Display.STATE_UNKNOWN;
+ // This is only set in the runnable returned from requestDisplayStateLocked.
private float mBrightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
private int mDefaultModeId;
private int mDefaultConfigGroup;
@@ -227,7 +228,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mDisplayDeviceConfig = null;
// Defer configuration file loading
BackgroundThread.getHandler().sendMessage(PooledLambda.obtainMessage(
- LocalDisplayDevice::loadDisplayConfigurationBrightnessMapping, this));
+ LocalDisplayDevice::loadDisplayConfiguration, this));
}
@Override
@@ -409,7 +410,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
return mDisplayDeviceConfig;
}
- private void loadDisplayConfigurationBrightnessMapping() {
+ private void loadDisplayConfiguration() {
Spline nitsToHal = null;
Spline sysToNits = null;
@@ -419,6 +420,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
return;
}
+ mBacklightAdapter.setForceSurfaceControl(mDisplayDeviceConfig.hasQuirk(
+ DisplayDeviceConfig.QUIRK_CAN_SET_BRIGHTNESS_VIA_HWC));
+
final float[] halNits = mDisplayDeviceConfig.getNits();
final float[] halBrightness = mDisplayDeviceConfig.getBrightness();
if (halNits == null || halBrightness == null) {
@@ -648,10 +652,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
updateDeviceInfoLocked();
}
- if (brightnessChanged) {
- mBrightnessState = brightnessState;
- }
-
// Defer actually setting the display state until after we have exited
// the critical section since it can take hundreds of milliseconds
// to complete.
@@ -691,6 +691,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
// Apply brightness changes given that we are in a non-suspended state.
if (brightnessChanged || vrModeChange) {
setDisplayBrightness(brightnessState);
+ mBrightnessState = brightnessState;
}
// Enter the final desired state, possibly suspended.
@@ -1208,6 +1209,14 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private final LogicalLight mBacklight;
private final boolean mUseSurfaceControlBrightness;
+ private boolean mForceSurfaceControl = false;
+
+ /**
+ * @param displayToken Token for display associated with this backlight.
+ * @param isDefaultDisplay {@code true} if it is the default display.
+ * @param forceSurfaceControl {@code true} if brightness should always be
+ * set via SurfaceControl API.
+ */
BacklightAdapter(IBinder displayToken, boolean isDefaultDisplay) {
mDisplayToken = displayToken;
@@ -1222,23 +1231,28 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
}
- public void setBrightness(float brightness) {
- if (mUseSurfaceControlBrightness) {
+ void setBrightness(float brightness) {
+ if (mUseSurfaceControlBrightness || mForceSurfaceControl) {
SurfaceControl.setDisplayBrightness(mDisplayToken, brightness);
} else if (mBacklight != null) {
mBacklight.setBrightness(brightness);
}
}
- public void setVrMode(boolean isVrModeEnabled) {
+ void setVrMode(boolean isVrModeEnabled) {
if (mBacklight != null) {
mBacklight.setVrMode(isVrModeEnabled);
}
}
+ void setForceSurfaceControl(boolean forceSurfaceControl) {
+ mForceSurfaceControl = forceSurfaceControl;
+ }
+
@Override
public String toString() {
return "BacklightAdapter [useSurfaceControl=" + mUseSurfaceControlBrightness
+ + " (force_anyway? " + mForceSurfaceControl + ")"
+ ", backlight=" + mBacklight + "]";
}
}
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index bbd8de254aef..d6709910d133 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -29,12 +29,19 @@
<xs:annotation name="nonnull"/>
<xs:annotation name="final"/>
</xs:element>
+ <xs:element type="displayQuirks" name="quirks" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Type definitions -->
+ <xs:complexType name="displayQuirks">
+ <xs:sequence>
+ <xs:element name="quirk" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
<xs:complexType name="nitsMap">
<xs:sequence>
<xs:element name="point" type="point" maxOccurs="unbounded" minOccurs="2">
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 7a35642d2a1b..e68ca260f55f 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -3,10 +3,17 @@ package com.android.server.display.config {
public class DisplayConfiguration {
ctor public DisplayConfiguration();
+ method public com.android.server.display.config.DisplayQuirks getQuirks();
method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
+ method public void setQuirks(com.android.server.display.config.DisplayQuirks);
method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
}
+ public class DisplayQuirks {
+ ctor public DisplayQuirks();
+ method public java.util.List<java.lang.String> getQuirk();
+ }
+
public class NitsMap {
ctor public NitsMap();
method @NonNull public final java.util.List<com.android.server.display.config.Point> getPoint();