summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();