summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/Display.java1
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java52
2 files changed, 34 insertions, 19 deletions
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index d79fc9a48116..f61217d60686 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -1514,6 +1514,7 @@ public final class Display {
public HdrCapabilities(int[] supportedHdrTypes, float maxLuminance,
float maxAverageLuminance, float minLuminance) {
mSupportedHdrTypes = supportedHdrTypes;
+ Arrays.sort(mSupportedHdrTypes);
mMaxLuminance = maxLuminance;
mMaxAverageLuminance = maxAverageLuminance;
mMinLuminance = minLuminance;
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 87a5730edc2e..704cbff44388 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -49,6 +49,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
/**
* A display adapter for the local displays managed by Surface Flinger.
@@ -118,22 +119,28 @@ final class LocalDisplayAdapter extends DisplayAdapter {
physicalDisplayId);
activeColorMode = Display.COLOR_MODE_INVALID;
}
- int[] colorModes = SurfaceControl.getDisplayColorModes(displayToken);
SurfaceControl.DesiredDisplayConfigSpecs configSpecs =
SurfaceControl.getDesiredDisplayConfigSpecs(displayToken);
+ int[] colorModes = SurfaceControl.getDisplayColorModes(displayToken);
+ Display.HdrCapabilities hdrCapabilities =
+ SurfaceControl.getHdrCapabilities(displayToken);
LocalDisplayDevice device = mDevices.get(physicalDisplayId);
if (device == null) {
// Display was added.
final boolean isInternal = mDevices.size() == 0;
device = new LocalDisplayDevice(displayToken, physicalDisplayId, info,
configs, activeConfig, configSpecs, colorModes, activeColorMode,
- isInternal);
+ hdrCapabilities, isInternal);
mDevices.put(physicalDisplayId, device);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
- } else if (device.updateDisplayConfigsLocked(configs, activeConfig, configSpecs,
- colorModes, activeColorMode)) {
- // Display properties changed.
- sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
+ } else {
+ boolean changed = device.updateDisplayConfigsLocked(configs, activeConfig,
+ configSpecs);
+ changed |= device.updateColorModesLocked(colorModes, activeColorMode);
+ changed |= device.updateHdrCapabilitiesLocked(hdrCapabilities);
+ if (changed) {
+ sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
+ }
}
} else {
// The display is no longer available. Ignore the attempt to add it.
@@ -202,16 +209,16 @@ final class LocalDisplayAdapter extends DisplayAdapter {
LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
SurfaceControl.DisplayInfo info, SurfaceControl.DisplayConfig[] configs,
int activeConfigId, SurfaceControl.DesiredDisplayConfigSpecs configSpecs,
- int[] colorModes, int activeColorMode, boolean isInternal) {
+ int[] colorModes, int activeColorMode, Display.HdrCapabilities hdrCapabilities,
+ boolean isInternal) {
super(LocalDisplayAdapter.this, displayToken, UNIQUE_ID_PREFIX + physicalDisplayId);
mPhysicalDisplayId = physicalDisplayId;
mIsInternal = isInternal;
mDisplayInfo = info;
- updateDisplayConfigsLocked(configs, activeConfigId, configSpecs, colorModes,
- activeColorMode);
+ updateDisplayConfigsLocked(configs, activeConfigId, configSpecs);
updateColorModesLocked(colorModes, activeColorMode);
-
+ updateHdrCapabilitiesLocked(hdrCapabilities);
mSidekickInternal = LocalServices.getService(SidekickInternal.class);
if (mIsInternal) {
LightsManager lights = LocalServices.getService(LightsManager.class);
@@ -219,7 +226,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
} else {
mBacklight = null;
}
- mHdrCapabilities = SurfaceControl.getHdrCapabilities(displayToken);
mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken);
mGameContentTypeSupported = SurfaceControl.getGameContentTypeSupport(displayToken);
mHalBrightnessSupport = SurfaceControl.getDisplayBrightnessSupport(displayToken);
@@ -236,11 +242,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
public boolean updateDisplayConfigsLocked(
SurfaceControl.DisplayConfig[] configs, int activeConfigId,
- SurfaceControl.DesiredDisplayConfigSpecs configSpecs, int[] colorModes,
- int activeColorMode) {
+ SurfaceControl.DesiredDisplayConfigSpecs configSpecs) {
mDisplayConfigs = Arrays.copyOf(configs, configs.length);
mActiveConfigId = activeConfigId;
-
// Build an updated list of all existing modes.
ArrayList<DisplayModeRecord> records = new ArrayList<DisplayModeRecord>();
boolean modesAdded = false;
@@ -389,14 +393,15 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mSystemBrightnessToNits = sysToNits;
}
- private boolean updateColorModesLocked(int[] colorModes,
- int activeColorMode) {
- List<Integer> pendingColorModes = new ArrayList<>();
+ private boolean updateColorModesLocked(int[] colorModes, int activeColorMode) {
+ if (colorModes == null) {
+ return false;
+ }
- if (colorModes == null) return false;
+ List<Integer> pendingColorModes = new ArrayList<>();
// Build an updated list of all existing color modes.
boolean colorModesAdded = false;
- for (int colorMode: colorModes) {
+ for (int colorMode : colorModes) {
if (!mSupportedColorModes.contains(colorMode)) {
colorModesAdded = true;
}
@@ -441,6 +446,15 @@ final class LocalDisplayAdapter extends DisplayAdapter {
return true;
}
+ private boolean updateHdrCapabilitiesLocked(Display.HdrCapabilities newHdrCapabilities) {
+ // If the HDR capabilities haven't changed, then we're done here.
+ if (Objects.equals(mHdrCapabilities, newHdrCapabilities)) {
+ return false;
+ }
+ mHdrCapabilities = newHdrCapabilities;
+ return true;
+ }
+
private DisplayModeRecord findDisplayModeRecord(SurfaceControl.DisplayConfig config) {
for (int i = 0; i < mSupportedModes.size(); i++) {
DisplayModeRecord record = mSupportedModes.valueAt(i);