Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ee05fd7 authored by Marin Shalamanov's avatar Marin Shalamanov Committed by Android (Google) Code Review
Browse files

Merge "Update HDR capabilities and color modes when display changes."

parents c40b909f 677d3a78
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -1514,6 +1514,7 @@ public final class Display {
        public HdrCapabilities(int[] supportedHdrTypes, float maxLuminance,
        public HdrCapabilities(int[] supportedHdrTypes, float maxLuminance,
                float maxAverageLuminance, float minLuminance) {
                float maxAverageLuminance, float minLuminance) {
            mSupportedHdrTypes = supportedHdrTypes;
            mSupportedHdrTypes = supportedHdrTypes;
            Arrays.sort(mSupportedHdrTypes);
            mMaxLuminance = maxLuminance;
            mMaxLuminance = maxLuminance;
            mMaxAverageLuminance = maxAverageLuminance;
            mMaxAverageLuminance = maxAverageLuminance;
            mMinLuminance = minLuminance;
            mMinLuminance = minLuminance;
+33 −19
Original line number Original line Diff line number Diff line
@@ -49,6 +49,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Objects;


/**
/**
 * A display adapter for the local displays managed by Surface Flinger.
 * A display adapter for the local displays managed by Surface Flinger.
@@ -118,23 +119,29 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                        physicalDisplayId);
                        physicalDisplayId);
                activeColorMode = Display.COLOR_MODE_INVALID;
                activeColorMode = Display.COLOR_MODE_INVALID;
            }
            }
            int[] colorModes = SurfaceControl.getDisplayColorModes(displayToken);
            SurfaceControl.DesiredDisplayConfigSpecs configSpecs =
            SurfaceControl.DesiredDisplayConfigSpecs configSpecs =
                    SurfaceControl.getDesiredDisplayConfigSpecs(displayToken);
                    SurfaceControl.getDesiredDisplayConfigSpecs(displayToken);
            int[] colorModes = SurfaceControl.getDisplayColorModes(displayToken);
            Display.HdrCapabilities hdrCapabilities =
                    SurfaceControl.getHdrCapabilities(displayToken);
            LocalDisplayDevice device = mDevices.get(physicalDisplayId);
            LocalDisplayDevice device = mDevices.get(physicalDisplayId);
            if (device == null) {
            if (device == null) {
                // Display was added.
                // Display was added.
                final boolean isInternal = mDevices.size() == 0;
                final boolean isInternal = mDevices.size() == 0;
                device = new LocalDisplayDevice(displayToken, physicalDisplayId, info,
                device = new LocalDisplayDevice(displayToken, physicalDisplayId, info,
                        configs, activeConfig, configSpecs, colorModes, activeColorMode,
                        configs, activeConfig, configSpecs, colorModes, activeColorMode,
                        isInternal);
                        hdrCapabilities, isInternal);
                mDevices.put(physicalDisplayId, device);
                mDevices.put(physicalDisplayId, device);
                sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
                sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
            } else if (device.updateDisplayConfigsLocked(configs, activeConfig, configSpecs,
            } else {
                        colorModes, activeColorMode)) {
                boolean changed = device.updateDisplayConfigsLocked(configs, activeConfig,
                // Display properties changed.
                        configSpecs);
                changed |= device.updateColorModesLocked(colorModes, activeColorMode);
                changed |= device.updateHdrCapabilitiesLocked(hdrCapabilities);
                if (changed) {
                    sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
                    sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
                }
                }
            }
        } else {
        } else {
            // The display is no longer available. Ignore the attempt to add it.
            // The display is no longer available. Ignore the attempt to add it.
            // If it was connected but has already been disconnected, we'll get a
            // If it was connected but has already been disconnected, we'll get a
@@ -202,16 +209,16 @@ final class LocalDisplayAdapter extends DisplayAdapter {
        LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
        LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
                SurfaceControl.DisplayInfo info, SurfaceControl.DisplayConfig[] configs,
                SurfaceControl.DisplayInfo info, SurfaceControl.DisplayConfig[] configs,
                int activeConfigId, SurfaceControl.DesiredDisplayConfigSpecs configSpecs,
                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);
            super(LocalDisplayAdapter.this, displayToken, UNIQUE_ID_PREFIX + physicalDisplayId);
            mPhysicalDisplayId = physicalDisplayId;
            mPhysicalDisplayId = physicalDisplayId;
            mIsInternal = isInternal;
            mIsInternal = isInternal;
            mDisplayInfo = info;
            mDisplayInfo = info;


            updateDisplayConfigsLocked(configs, activeConfigId, configSpecs, colorModes,
            updateDisplayConfigsLocked(configs, activeConfigId, configSpecs);
                    activeColorMode);
            updateColorModesLocked(colorModes, activeColorMode);
            updateColorModesLocked(colorModes, activeColorMode);

            updateHdrCapabilitiesLocked(hdrCapabilities);
            mSidekickInternal = LocalServices.getService(SidekickInternal.class);
            mSidekickInternal = LocalServices.getService(SidekickInternal.class);
            if (mIsInternal) {
            if (mIsInternal) {
                LightsManager lights = LocalServices.getService(LightsManager.class);
                LightsManager lights = LocalServices.getService(LightsManager.class);
@@ -219,7 +226,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            } else {
            } else {
                mBacklight = null;
                mBacklight = null;
            }
            }
            mHdrCapabilities = SurfaceControl.getHdrCapabilities(displayToken);
            mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken);
            mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken);
            mGameContentTypeSupported = SurfaceControl.getGameContentTypeSupport(displayToken);
            mGameContentTypeSupported = SurfaceControl.getGameContentTypeSupport(displayToken);
            mHalBrightnessSupport = SurfaceControl.getDisplayBrightnessSupport(displayToken);
            mHalBrightnessSupport = SurfaceControl.getDisplayBrightnessSupport(displayToken);
@@ -236,11 +242,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {


        public boolean updateDisplayConfigsLocked(
        public boolean updateDisplayConfigsLocked(
                SurfaceControl.DisplayConfig[] configs, int activeConfigId,
                SurfaceControl.DisplayConfig[] configs, int activeConfigId,
                SurfaceControl.DesiredDisplayConfigSpecs configSpecs, int[] colorModes,
                SurfaceControl.DesiredDisplayConfigSpecs configSpecs) {
                int activeColorMode) {
            mDisplayConfigs = Arrays.copyOf(configs, configs.length);
            mDisplayConfigs = Arrays.copyOf(configs, configs.length);
            mActiveConfigId = activeConfigId;
            mActiveConfigId = activeConfigId;

            // Build an updated list of all existing modes.
            // Build an updated list of all existing modes.
            ArrayList<DisplayModeRecord> records = new ArrayList<DisplayModeRecord>();
            ArrayList<DisplayModeRecord> records = new ArrayList<DisplayModeRecord>();
            boolean modesAdded = false;
            boolean modesAdded = false;
@@ -389,11 +393,12 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            mSystemBrightnessToNits = sysToNits;
            mSystemBrightnessToNits = sysToNits;
        }
        }


        private boolean updateColorModesLocked(int[] colorModes,
        private boolean updateColorModesLocked(int[] colorModes, int activeColorMode) {
                int activeColorMode) {
            if (colorModes == null) {
            List<Integer> pendingColorModes = new ArrayList<>();
                return false;
            }


            if (colorModes == null) return false;
            List<Integer> pendingColorModes = new ArrayList<>();
            // Build an updated list of all existing color modes.
            // Build an updated list of all existing color modes.
            boolean colorModesAdded = false;
            boolean colorModesAdded = false;
            for (int colorMode : colorModes) {
            for (int colorMode : colorModes) {
@@ -441,6 +446,15 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            return true;
            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) {
        private DisplayModeRecord findDisplayModeRecord(SurfaceControl.DisplayConfig config) {
            for (int i = 0; i < mSupportedModes.size(); i++) {
            for (int i = 0; i < mSupportedModes.size(); i++) {
                DisplayModeRecord record = mSupportedModes.valueAt(i);
                DisplayModeRecord record = mSupportedModes.valueAt(i);