diff options
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(); |