diff options
Diffstat (limited to 'services')
4 files changed, 158 insertions, 160 deletions
diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index 5e1df27167c2..198ea3d3f66a 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -165,7 +165,7 @@ final class ColorFade { "Failed to take screenshot because internal display is disconnected"); return false; } - boolean isWideColor = SurfaceControl.getActiveColorMode(token) + boolean isWideColor = SurfaceControl.getDynamicDisplayInfo(token).activeColorMode == Display.COLOR_MODE_DISPLAY_P3; // Set mPrepared here so if initialization fails, resources can be cleaned up. diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java index 501533d535d3..40cee66a6791 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java +++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java @@ -466,7 +466,7 @@ final class DisplayDeviceInfo { sb.append(", supportedModes ").append(Arrays.toString(supportedModes)); sb.append(", colorMode ").append(colorMode); sb.append(", supportedColorModes ").append(Arrays.toString(supportedColorModes)); - sb.append(", HdrCapabilities ").append(hdrCapabilities); + sb.append(", hdrCapabilities ").append(hdrCapabilities); sb.append(", allmSupported ").append(allmSupported); sb.append(", gameContentTypeSupported ").append(gameContentTypeSupported); sb.append(", density ").append(densityDpi); diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 3b66236c9f0f..7ce4f066b058 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -100,50 +100,48 @@ final class LocalDisplayAdapter extends DisplayAdapter { private void tryConnectDisplayLocked(long physicalDisplayId) { final IBinder displayToken = SurfaceControl.getPhysicalDisplayToken(physicalDisplayId); if (displayToken != null) { - SurfaceControl.DisplayInfo info = SurfaceControl.getDisplayInfo(displayToken); - if (info == null) { - Slog.w(TAG, "No valid info found for display device " + physicalDisplayId); + SurfaceControl.StaticDisplayInfo staticInfo = + SurfaceControl.getStaticDisplayInfo(displayToken); + if (staticInfo == null) { + Slog.w(TAG, "No valid static info found for display device " + physicalDisplayId); return; } - SurfaceControl.DisplayMode[] displayModes = - SurfaceControl.getDisplayModes(displayToken); - if (displayModes == null) { + SurfaceControl.DynamicDisplayInfo dynamicInfo = + SurfaceControl.getDynamicDisplayInfo(displayToken); + if (dynamicInfo == null) { + Slog.w(TAG, "No valid dynamic info found for display device " + physicalDisplayId); + return; + } + if (dynamicInfo.supportedDisplayModes == null) { // There are no valid modes for this device, so we can't use it Slog.w(TAG, "No valid modes found for display device " + physicalDisplayId); return; } - int activeDisplayMode = SurfaceControl.getActiveDisplayMode(displayToken); - if (activeDisplayMode < 0) { + if (dynamicInfo.activeDisplayModeId < 0) { // There is no active mode, and for now we don't have the // policy to set one. - Slog.w(TAG, "No active mode found for display device " + physicalDisplayId); + Slog.w(TAG, "No valid active mode found for display device " + physicalDisplayId); return; } - int activeColorMode = SurfaceControl.getActiveColorMode(displayToken); - if (activeColorMode < 0) { + if (dynamicInfo.activeColorMode < 0) { // We failed to get the active color mode. We don't bail out here since on the next // configuration pass we'll go ahead and set it to whatever it was set to last (or // COLOR_MODE_NATIVE if this is the first configuration). - Slog.w(TAG, "Unable to get active color mode for display device " + - physicalDisplayId); - activeColorMode = Display.COLOR_MODE_INVALID; + Slog.w(TAG, "No valid active color mode for display device " + physicalDisplayId); + dynamicInfo.activeColorMode = Display.COLOR_MODE_INVALID; } - SurfaceControl.DesiredDisplayModeSpecs modeSpecsSpecs = + SurfaceControl.DesiredDisplayModeSpecs modeSpecs = SurfaceControl.getDesiredDisplayModeSpecs(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 isDefaultDisplay = mDevices.size() == 0; - device = new LocalDisplayDevice(displayToken, physicalDisplayId, info, displayModes, - activeDisplayMode, modeSpecsSpecs, colorModes, activeColorMode, - hdrCapabilities, isDefaultDisplay); + device = new LocalDisplayDevice(displayToken, physicalDisplayId, staticInfo, + dynamicInfo, modeSpecs, isDefaultDisplay); mDevices.put(physicalDisplayId, device); sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED); - } else if (device.updateDisplayPropertiesLocked(info, displayModes, activeDisplayMode, - modeSpecsSpecs, colorModes, activeColorMode, hdrCapabilities)) { + } else if (device.updateDisplayPropertiesLocked(staticInfo, dynamicInfo, + modeSpecs)) { sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED); } } else { @@ -195,7 +193,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { private DisplayModeDirector.DesiredDisplayModeSpecs mDisplayModeSpecs = new DisplayModeDirector.DesiredDisplayModeSpecs(); private boolean mDisplayModeSpecsInvalid; - private int mActiveDisplayModeId; private int mActiveColorMode; private Display.HdrCapabilities mHdrCapabilities; private boolean mAllmSupported; @@ -204,8 +201,11 @@ final class LocalDisplayAdapter extends DisplayAdapter { private boolean mGameContentTypeRequested; private boolean mSidekickActive; private SidekickInternal mSidekickInternal; - private SurfaceControl.DisplayInfo mDisplayInfo; - private SurfaceControl.DisplayMode[] mDisplayModes; + private SurfaceControl.StaticDisplayInfo mStaticDisplayInfo; + // The supported display modes according in SurfaceFlinger + private SurfaceControl.DisplayMode[] mSfDisplayModes; + // The active display mode in SurfaceFlinger + private SurfaceControl.DisplayMode mActiveSfDisplayMode; private Spline mSystemBrightnessToNits; private Spline mNitsToHalBrightness; private DisplayDeviceConfig mDisplayDeviceConfig; @@ -214,15 +214,13 @@ final class LocalDisplayAdapter extends DisplayAdapter { new DisplayEventReceiver.FrameRateOverride[0]; LocalDisplayDevice(IBinder displayToken, long physicalDisplayId, - SurfaceControl.DisplayInfo info, SurfaceControl.DisplayMode[] displayModes, - int activeDisplayModeId, SurfaceControl.DesiredDisplayModeSpecs modeSpecs, - int[] colorModes, int activeColorMode, Display.HdrCapabilities hdrCapabilities, - boolean isDefaultDisplay) { + SurfaceControl.StaticDisplayInfo staticDisplayInfo, + SurfaceControl.DynamicDisplayInfo dynamicInfo, + SurfaceControl.DesiredDisplayModeSpecs modeSpecs, boolean isDefaultDisplay) { super(LocalDisplayAdapter.this, displayToken, UNIQUE_ID_PREFIX + physicalDisplayId); mPhysicalDisplayId = physicalDisplayId; mIsDefaultDisplay = isDefaultDisplay; - updateDisplayPropertiesLocked(info, displayModes, activeDisplayModeId, modeSpecs, - colorModes, activeColorMode, hdrCapabilities); + updateDisplayPropertiesLocked(staticDisplayInfo, dynamicInfo, modeSpecs); mSidekickInternal = LocalServices.getService(SidekickInternal.class); mBacklightAdapter = new BacklightAdapter(displayToken, isDefaultDisplay); mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken); @@ -241,15 +239,15 @@ final class LocalDisplayAdapter extends DisplayAdapter { /** * Returns true if there is a change. **/ - public boolean updateDisplayPropertiesLocked(SurfaceControl.DisplayInfo info, - SurfaceControl.DisplayMode[] displayModes, - int activeDisplayModeId, SurfaceControl.DesiredDisplayModeSpecs modeSpecs, - int[] colorModes, int activeColorMode, Display.HdrCapabilities hdrCapabilities) { + public boolean updateDisplayPropertiesLocked(SurfaceControl.StaticDisplayInfo staticInfo, + SurfaceControl.DynamicDisplayInfo dynamicInfo, + SurfaceControl.DesiredDisplayModeSpecs modeSpecs) { boolean changed = updateDisplayModesLocked( - displayModes, activeDisplayModeId, modeSpecs); - changed |= updateDisplayInfo(info); - changed |= updateColorModesLocked(colorModes, activeColorMode); - changed |= updateHdrCapabilitiesLocked(hdrCapabilities); + dynamicInfo.supportedDisplayModes, dynamicInfo.activeDisplayModeId, modeSpecs); + changed |= updateStaticInfo(staticInfo); + changed |= updateColorModesLocked(dynamicInfo.supportedColorModes, + dynamicInfo.activeColorMode); + changed |= updateHdrCapabilitiesLocked(dynamicInfo.hdrCapabilities); if (changed) { mHavePendingChanges = true; @@ -260,8 +258,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { public boolean updateDisplayModesLocked( SurfaceControl.DisplayMode[] displayModes, int activeDisplayModeId, SurfaceControl.DesiredDisplayModeSpecs modeSpecs) { - mDisplayModes = Arrays.copyOf(displayModes, displayModes.length); - mActiveDisplayModeId = activeDisplayModeId; + mSfDisplayModes = Arrays.copyOf(displayModes, displayModes.length); + mActiveSfDisplayMode = getModeById(displayModes, activeDisplayModeId); + // Build an updated list of all existing modes. ArrayList<DisplayModeRecord> records = new ArrayList<>(); boolean modesAdded = false; @@ -282,7 +281,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { // First, check to see if we've already added a matching mode. Since not all // configuration options are exposed via Display.Mode, it's possible that we have - // multiple DisplayModess that would generate the same Display.Mode. + // multiple DisplayModes that would generate the same Display.Mode. boolean existingMode = false; for (DisplayModeRecord record : records) { if (record.hasMatchingMode(mode) @@ -312,9 +311,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { // Get the currently active mode DisplayModeRecord activeRecord = null; - for (int i = 0; i < records.size(); i++) { - DisplayModeRecord record = records.get(i); - if (record.hasMatchingMode(displayModes[activeDisplayModeId])) { + for (DisplayModeRecord record : records) { + if (record.hasMatchingMode(mActiveSfDisplayMode)) { activeRecord = record; break; } @@ -370,17 +368,17 @@ final class LocalDisplayAdapter extends DisplayAdapter { // For a new display, we need to initialize the default mode ID. if (mDefaultModeId == NO_DISPLAY_MODE_ID) { mDefaultModeId = activeRecord.mMode.getModeId(); - mDefaultModeGroup = displayModes[activeDisplayModeId].group; + mDefaultModeGroup = mActiveSfDisplayMode.group; } else if (modesAdded && activeModeChanged) { Slog.d(TAG, "New display modes are added and the active mode has changed, " + "use active mode as default mode."); mDefaultModeId = activeRecord.mMode.getModeId(); - mDefaultModeGroup = displayModes[activeDisplayModeId].group; + mDefaultModeGroup = mActiveSfDisplayMode.group; } else if (findDisplayModeIdLocked(mDefaultModeId, mDefaultModeGroup) < 0) { Slog.w(TAG, "Default display mode no longer available, using currently" + " active mode as default."); mDefaultModeId = activeRecord.mMode.getModeId(); - mDefaultModeGroup = displayModes[activeDisplayModeId].group; + mDefaultModeGroup = mActiveSfDisplayMode.group; } // Determine whether the display mode specs' base mode is still there. @@ -454,11 +452,11 @@ final class LocalDisplayAdapter extends DisplayAdapter { mSystemBrightnessToNits = sysToNits; } - private boolean updateDisplayInfo(SurfaceControl.DisplayInfo info) { - if (Objects.equals(mDisplayInfo, info)) { + private boolean updateStaticInfo(SurfaceControl.StaticDisplayInfo info) { + if (Objects.equals(mStaticDisplayInfo, info)) { return false; } - mDisplayInfo = info; + mStaticDisplayInfo = info; return true; } @@ -520,6 +518,17 @@ final class LocalDisplayAdapter extends DisplayAdapter { return true; } + private SurfaceControl.DisplayMode getModeById(SurfaceControl.DisplayMode[] supportedModes, + int modeId) { + for (SurfaceControl.DisplayMode mode : supportedModes) { + if (mode.id == modeId) { + return mode; + } + } + Slog.e(TAG, "Can't find display mode with id " + modeId); + return null; + } + private DisplayModeRecord findDisplayModeRecord(SurfaceControl.DisplayMode mode, List<Float> alternativeRefreshRates) { for (int i = 0; i < mSupportedModes.size(); i++) { @@ -556,10 +565,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { @Override public DisplayDeviceInfo getDisplayDeviceInfoLocked() { if (mInfo == null) { - SurfaceControl.DisplayMode mode = mDisplayModes[mActiveDisplayModeId]; mInfo = new DisplayDeviceInfo(); - mInfo.width = mode.width; - mInfo.height = mode.height; + mInfo.width = mActiveSfDisplayMode.width; + mInfo.height = mActiveSfDisplayMode.height; mInfo.modeId = mActiveModeId; mInfo.defaultModeId = mDefaultModeId; mInfo.supportedModes = getDisplayModes(mSupportedModes); @@ -572,21 +580,21 @@ final class LocalDisplayAdapter extends DisplayAdapter { mInfo.supportedColorModes[i] = mSupportedColorModes.get(i); } mInfo.hdrCapabilities = mHdrCapabilities; - mInfo.appVsyncOffsetNanos = mode.appVsyncOffsetNanos; - mInfo.presentationDeadlineNanos = mode.presentationDeadlineNanos; + mInfo.appVsyncOffsetNanos = mActiveSfDisplayMode.appVsyncOffsetNanos; + mInfo.presentationDeadlineNanos = mActiveSfDisplayMode.presentationDeadlineNanos; mInfo.state = mState; mInfo.uniqueId = getUniqueId(); final DisplayAddress.Physical physicalAddress = DisplayAddress.fromPhysicalDisplayId(mPhysicalDisplayId); mInfo.address = physicalAddress; - mInfo.densityDpi = (int) (mDisplayInfo.density * 160 + 0.5f); - mInfo.xDpi = mode.xDpi; - mInfo.yDpi = mode.yDpi; - mInfo.deviceProductInfo = mDisplayInfo.deviceProductInfo; + mInfo.densityDpi = (int) (mStaticDisplayInfo.density * 160 + 0.5f); + mInfo.xDpi = mActiveSfDisplayMode.xDpi; + mInfo.yDpi = mActiveSfDisplayMode.yDpi; + mInfo.deviceProductInfo = mStaticDisplayInfo.deviceProductInfo; // Assume that all built-in displays that have secure output (eg. HDCP) also // support compositing from gralloc protected buffers. - if (mDisplayInfo.secure) { + if (mStaticDisplayInfo.secure) { mInfo.flags = DisplayDeviceInfo.FLAG_SECURE | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS; } @@ -620,7 +628,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } - if (mDisplayInfo.isInternal) { + if (mStaticDisplayInfo.isInternal) { mInfo.type = Display.TYPE_INTERNAL; mInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL; mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT; @@ -878,9 +886,10 @@ final class LocalDisplayAdapter extends DisplayAdapter { // Do not lock when calling these SurfaceControl methods because they are sync // operations that may block for a while when setting display power mode. SurfaceControl.setDesiredDisplayModeSpecs(displayToken, modeSpecs); - final int activeMode = SurfaceControl.getActiveDisplayMode(displayToken); + final int sfActiveModeId = + SurfaceControl.getDynamicDisplayInfo(displayToken).activeDisplayModeId; synchronized (getSyncRoot()) { - if (updateActiveModeLocked(activeMode)) { + if (updateActiveModeLocked(sfActiveModeId)) { updateDeviceInfoLocked(); } } @@ -891,8 +900,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { updateDeviceInfoLocked(); } - public void onActiveDisplayModeChangedLocked(int modeId) { - if (updateActiveModeLocked(modeId)) { + public void onActiveDisplayModeChangedLocked(int sfModeId) { + if (updateActiveModeLocked(sfModeId)) { updateDeviceInfoLocked(); } } @@ -904,15 +913,15 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } - public boolean updateActiveModeLocked(int activeModeId) { - if (mActiveDisplayModeId == activeModeId) { + public boolean updateActiveModeLocked(int activeSfModeId) { + if (mActiveSfDisplayMode.id == activeSfModeId) { return false; } - mActiveDisplayModeId = activeModeId; - mActiveModeId = findMatchingModeIdLocked(activeModeId); + mActiveSfDisplayMode = getModeById(mSfDisplayModes, activeSfModeId); + mActiveModeId = findMatchingModeIdLocked(activeSfModeId); if (mActiveModeId == NO_DISPLAY_MODE_ID) { Slog.w(TAG, "In unknown mode after setting allowed modes" - + ", activeModeId=" + mActiveDisplayModeId); + + ", activeModeId=" + activeSfModeId); } return true; } @@ -992,7 +1001,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { pw.println("mPhysicalDisplayId=" + mPhysicalDisplayId); pw.println("mDisplayModeSpecs={" + mDisplayModeSpecs + "}"); pw.println("mDisplayModeSpecsInvalid=" + mDisplayModeSpecsInvalid); - pw.println("mActiveDisplayModeId=" + mActiveDisplayModeId); pw.println("mActiveModeId=" + mActiveModeId); pw.println("mActiveColorMode=" + mActiveColorMode); pw.println("mDefaultModeId=" + mDefaultModeId); @@ -1003,11 +1011,12 @@ final class LocalDisplayAdapter extends DisplayAdapter { pw.println("mAllmRequested=" + mAllmRequested); pw.println("mGameContentTypeSupported=" + mGameContentTypeSupported); pw.println("mGameContentTypeRequested=" + mGameContentTypeRequested); - pw.println("mDisplayInfo=" + mDisplayInfo); - pw.println("mDisplayModes="); - for (int i = 0; i < mDisplayModes.length; i++) { - pw.println(" " + mDisplayModes[i]); + pw.println("mStaticDisplayInfo=" + mStaticDisplayInfo); + pw.println("mSfDisplayModes="); + for (int i = 0; i < mSfDisplayModes.length; i++) { + pw.println(" " + mSfDisplayModes[i]); } + pw.println("mActiveSfDisplayMode=" + mActiveSfDisplayMode); pw.println("mSupportedModes="); for (int i = 0; i < mSupportedModes.size(); i++) { pw.println(" " + mSupportedModes.valueAt(i)); @@ -1020,17 +1029,16 @@ final class LocalDisplayAdapter extends DisplayAdapter { int matchingModeId = SurfaceControl.DisplayMode.INVALID_DISPLAY_MODE_ID; DisplayModeRecord record = mSupportedModes.get(modeId); if (record != null) { - for (int i = 0; i < mDisplayModes.length; i++) { - SurfaceControl.DisplayMode mode = mDisplayModes[i]; + for (SurfaceControl.DisplayMode mode : mSfDisplayModes) { if (record.hasMatchingMode(mode)) { if (matchingModeId == SurfaceControl.DisplayMode.INVALID_DISPLAY_MODE_ID) { - matchingModeId = i; + matchingModeId = mode.id; } // Prefer to return a mode that matches the modeGroup if (mode.group == modeGroup) { - return i; + return mode.id; } } } @@ -1038,12 +1046,12 @@ final class LocalDisplayAdapter extends DisplayAdapter { return matchingModeId; } - private int findMatchingModeIdLocked(int modeId) { - if (modeId < 0 || modeId >= mDisplayModes.length) { - Slog.e(TAG, "Invalid display config index " + modeId); + private int findMatchingModeIdLocked(int sfModeId) { + SurfaceControl.DisplayMode mode = getModeById(mSfDisplayModes, sfModeId); + if (mode == null) { + Slog.e(TAG, "Invalid display mode ID " + sfModeId); return NO_DISPLAY_MODE_ID; } - SurfaceControl.DisplayMode mode = mDisplayModes[modeId]; for (int i = 0; i < mSupportedModes.size(); i++) { DisplayModeRecord record = mSupportedModes.valueAt(i); if (record.hasMatchingMode(mode)) { @@ -1229,8 +1237,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { /** * @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; diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index ca534927bd66..7f8784dc2599 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -223,7 +223,7 @@ public class LocalDisplayAdapterTest { for (int i = 0; i < wrappedModes.length; i++) { modes[i] = wrappedModes[i].mode; } - display.modes = modes; + display.dynamicInfo.supportedDisplayModes = modes; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); @@ -252,53 +252,53 @@ public class LocalDisplayAdapterTest { testAlternativeRefreshRatesCommon(display, new DisplayModeWrapper[] { new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 60f, 0), new float[]{24f, 50f}), + createFakeDisplayMode(0, 1920, 1080, 60f, 0), new float[]{24f, 50f}), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 50f, 0), new float[]{24f, 60f}), + createFakeDisplayMode(1, 1920, 1080, 50f, 0), new float[]{24f, 60f}), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 24f, 0), new float[]{50f, 60f}), + createFakeDisplayMode(2, 1920, 1080, 24f, 0), new float[]{50f, 60f}), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 60f, 0), new float[]{24f, 50f}), + createFakeDisplayMode(3, 3840, 2160, 60f, 0), new float[]{24f, 50f}), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 50f, 0), new float[]{24f, 60f}), + createFakeDisplayMode(4, 3840, 2160, 50f, 0), new float[]{24f, 60f}), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 24f, 0), new float[]{50f, 60f}), + createFakeDisplayMode(5, 3840, 2160, 24f, 0), new float[]{50f, 60f}), }); testAlternativeRefreshRatesCommon(display, new DisplayModeWrapper[] { new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 60f, 0), new float[]{50f}), + createFakeDisplayMode(0, 1920, 1080, 60f, 0), new float[]{50f}), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 50f, 0), new float[]{60f}), + createFakeDisplayMode(1, 1920, 1080, 50f, 0), new float[]{60f}), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 24f, 1), new float[0]), + createFakeDisplayMode(2, 1920, 1080, 24f, 1), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 60f, 2), new float[0]), + createFakeDisplayMode(3, 3840, 2160, 60f, 2), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 50f, 3), new float[]{24f}), + createFakeDisplayMode(4, 3840, 2160, 50f, 3), new float[]{24f}), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 24f, 3), new float[]{50f}), + createFakeDisplayMode(5, 3840, 2160, 24f, 3), new float[]{50f}), }); testAlternativeRefreshRatesCommon(display, new DisplayModeWrapper[] { new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 60f, 0), new float[0]), + createFakeDisplayMode(0, 1920, 1080, 60f, 0), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 50f, 1), new float[0]), + createFakeDisplayMode(1, 1920, 1080, 50f, 1), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(1920, 1080, 24f, 2), new float[0]), + createFakeDisplayMode(2, 1920, 1080, 24f, 2), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 60f, 3), new float[0]), + createFakeDisplayMode(3, 3840, 2160, 60f, 3), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 50f, 4), new float[0]), + createFakeDisplayMode(4, 3840, 2160, 50f, 4), new float[0]), new DisplayModeWrapper( - createFakeDisplayMode(3840, 2160, 24f, 5), new float[0]), + createFakeDisplayMode(5, 3840, 2160, 24f, 5), new float[0]), }); } @Test public void testAfterDisplayChange_DisplayModesAreUpdated() throws Exception { - SurfaceControl.DisplayMode displayMode = createFakeDisplayMode(1920, 1080, 60f); + SurfaceControl.DisplayMode displayMode = createFakeDisplayMode(0, 1920, 1080, 60f); SurfaceControl.DisplayMode[] modes = new SurfaceControl.DisplayMode[]{displayMode}; FakeDisplay display = new FakeDisplay(PORT_A, modes, 0); @@ -325,18 +325,14 @@ public class LocalDisplayAdapterTest { displayMode.refreshRate)).isTrue(); // Change the display - SurfaceControl.DisplayMode addedDisplayInfo = createFakeDisplayMode(3840, 2160, - 60f); + SurfaceControl.DisplayMode addedDisplayInfo = createFakeDisplayMode(1, 3840, 2160, 60f); modes = new SurfaceControl.DisplayMode[]{displayMode, addedDisplayInfo}; - display.modes = modes; - display.activeMode = 1; + display.dynamicInfo.supportedDisplayModes = modes; + display.dynamicInfo.activeDisplayModeId = 1; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); - assertThat(SurfaceControl.getActiveDisplayMode(display.token)).isEqualTo(1); - assertThat(SurfaceControl.getDisplayModes(display.token).length).isEqualTo(2); - assertThat(mListener.addedDisplays.size()).isEqualTo(1); assertThat(mListener.changedDisplays.size()).isEqualTo(1); @@ -360,8 +356,8 @@ public class LocalDisplayAdapterTest { @Test public void testAfterDisplayChange_ActiveModeIsUpdated() throws Exception { SurfaceControl.DisplayMode[] modes = new SurfaceControl.DisplayMode[]{ - createFakeDisplayMode(1920, 1080, 60f), - createFakeDisplayMode(1920, 1080, 50f) + createFakeDisplayMode(0, 1920, 1080, 60f), + createFakeDisplayMode(1, 1920, 1080, 50f) }; FakeDisplay display = new FakeDisplay(PORT_A, modes, /* activeMode */ 0); setUpDisplay(display); @@ -379,13 +375,11 @@ public class LocalDisplayAdapterTest { assertThat(activeMode.matches(1920, 1080, 60f)).isTrue(); // Change the display - display.activeMode = 1; + display.dynamicInfo.activeDisplayModeId = 1; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); - assertThat(SurfaceControl.getActiveDisplayMode(display.token)).isEqualTo(1); - assertThat(mListener.addedDisplays.size()).isEqualTo(1); assertThat(mListener.changedDisplays.size()).isEqualTo(1); @@ -402,7 +396,7 @@ public class LocalDisplayAdapterTest { FakeDisplay display = new FakeDisplay(PORT_A); Display.HdrCapabilities initialHdrCapabilities = new Display.HdrCapabilities(new int[0], 1000, 1000, 0); - display.hdrCapabilities = initialHdrCapabilities; + display.dynamicInfo.hdrCapabilities = initialHdrCapabilities; setUpDisplay(display); updateAvailableDisplays(); mAdapter.registerLocked(); @@ -419,7 +413,7 @@ public class LocalDisplayAdapterTest { // Change the display Display.HdrCapabilities changedHdrCapabilities = new Display.HdrCapabilities( new int[Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS], 1000, 1000, 0); - display.hdrCapabilities = changedHdrCapabilities; + display.dynamicInfo.hdrCapabilities = changedHdrCapabilities; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); @@ -438,7 +432,7 @@ public class LocalDisplayAdapterTest { public void testAfterDisplayChange_ColorModesAreUpdated() throws Exception { FakeDisplay display = new FakeDisplay(PORT_A); final int[] initialColorModes = new int[]{Display.COLOR_MODE_BT709}; - display.colorModes = initialColorModes; + display.dynamicInfo.supportedColorModes = initialColorModes; setUpDisplay(display); updateAvailableDisplays(); mAdapter.registerLocked(); @@ -455,7 +449,7 @@ public class LocalDisplayAdapterTest { // Change the display final int[] changedColorModes = new int[]{Display.COLOR_MODE_DEFAULT}; - display.colorModes = changedColorModes; + display.dynamicInfo.supportedColorModes = changedColorModes; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); @@ -474,8 +468,8 @@ public class LocalDisplayAdapterTest { @Test public void testDisplayChange_withStaleDesiredDisplayModeSpecs() throws Exception { SurfaceControl.DisplayMode[] modes = new SurfaceControl.DisplayMode[]{ - createFakeDisplayMode(1920, 1080, 60f), - createFakeDisplayMode(1920, 1080, 50f) + createFakeDisplayMode(0, 1920, 1080, 60f), + createFakeDisplayMode(1, 1920, 1080, 50f) }; final int activeMode = 0; FakeDisplay display = new FakeDisplay(PORT_A, modes, activeMode); @@ -487,11 +481,11 @@ public class LocalDisplayAdapterTest { waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); // Change the display - display.modes = new SurfaceControl.DisplayMode[]{ - createFakeDisplayMode(1920, 1080, 60f) + display.dynamicInfo.supportedDisplayModes = new SurfaceControl.DisplayMode[]{ + createFakeDisplayMode(2, 1920, 1080, 60f) }; - // SurfaceFlinger can return a stale defaultMode. Make sure this doesn't - // trigger ArrayOutOfBoundsException. + display.dynamicInfo.activeDisplayModeId = 2; + // SurfaceFlinger can return a stale defaultMode. Make sure this doesn't crash. display.desiredDisplayModeSpecs.defaultMode = 1; setUpDisplay(display); @@ -588,12 +582,15 @@ public class LocalDisplayAdapterTest { private static class FakeDisplay { public final DisplayAddress.Physical address; public final IBinder token = new Binder(); - public final SurfaceControl.DisplayInfo info; - public SurfaceControl.DisplayMode[] modes; - public int activeMode; - public int[] colorModes = new int[]{ Display.COLOR_MODE_DEFAULT }; - public Display.HdrCapabilities hdrCapabilities = new Display.HdrCapabilities(new int[0], - 1000, 1000, 0); + public final SurfaceControl.StaticDisplayInfo info; + public SurfaceControl.DynamicDisplayInfo dynamicInfo = + new SurfaceControl.DynamicDisplayInfo(); + { + dynamicInfo.supportedColorModes = new int[]{ Display.COLOR_MODE_DEFAULT }; + dynamicInfo.hdrCapabilities = new Display.HdrCapabilities(new int[0], + 1000, 1000, 0); + } + public SurfaceControl.DesiredDisplayModeSpecs desiredDisplayModeSpecs = new SurfaceControl.DesiredDisplayModeSpecs(/* defaultMode */ 0, /* allowGroupSwitching */ false, @@ -603,19 +600,19 @@ public class LocalDisplayAdapterTest { /* appRefreshRateMax */60.f); private FakeDisplay(int port) { - this.address = createDisplayAddress(port); - this.info = createFakeDisplayInfo(); - this.modes = new SurfaceControl.DisplayMode[]{ - createFakeDisplayMode(800, 600, 60f) + address = createDisplayAddress(port); + info = createFakeDisplayInfo(); + dynamicInfo.supportedDisplayModes = new SurfaceControl.DisplayMode[]{ + createFakeDisplayMode(0, 800, 600, 60f) }; - this.activeMode = 0; + dynamicInfo.activeDisplayModeId = 0; } private FakeDisplay(int port, SurfaceControl.DisplayMode[] modes, int activeMode) { - this.address = createDisplayAddress(port); - this.info = createFakeDisplayInfo(); - this.modes = modes; - this.activeMode = activeMode; + address = createDisplayAddress(port); + info = createFakeDisplayInfo(); + dynamicInfo.supportedDisplayModes = modes; + dynamicInfo.activeDisplayModeId = activeMode; } } @@ -623,15 +620,9 @@ public class LocalDisplayAdapterTest { mAddresses.add(display.address); doReturn(display.token).when(() -> SurfaceControl.getPhysicalDisplayToken(display.address.getPhysicalDisplayId())); - doReturn(display.info).when(() -> SurfaceControl.getDisplayInfo(display.token)); - doReturn(display.modes).when( - () -> SurfaceControl.getDisplayModes(display.token)); - doReturn(display.activeMode).when(() -> SurfaceControl.getActiveDisplayMode(display.token)); - doReturn(0).when(() -> SurfaceControl.getActiveColorMode(display.token)); - doReturn(display.colorModes).when( - () -> SurfaceControl.getDisplayColorModes(display.token)); - doReturn(display.hdrCapabilities).when( - () -> SurfaceControl.getHdrCapabilities(display.token)); + doReturn(display.info).when(() -> SurfaceControl.getStaticDisplayInfo(display.token)); + doReturn(display.dynamicInfo).when( + () -> SurfaceControl.getDynamicDisplayInfo(display.token)); doReturn(display.desiredDisplayModeSpecs) .when(() -> SurfaceControl.getDesiredDisplayModeSpecs(display.token)); } @@ -650,20 +641,21 @@ public class LocalDisplayAdapterTest { return DisplayAddress.fromPortAndModel(port, DISPLAY_MODEL); } - private static SurfaceControl.DisplayInfo createFakeDisplayInfo() { - final SurfaceControl.DisplayInfo info = new SurfaceControl.DisplayInfo(); + private static SurfaceControl.StaticDisplayInfo createFakeDisplayInfo() { + final SurfaceControl.StaticDisplayInfo info = new SurfaceControl.StaticDisplayInfo(); info.density = 100; return info; } - private static SurfaceControl.DisplayMode createFakeDisplayMode(int width, int height, + private static SurfaceControl.DisplayMode createFakeDisplayMode(int id, int width, int height, float refreshRate) { - return createFakeDisplayMode(width, height, refreshRate, 0); + return createFakeDisplayMode(id, width, height, refreshRate, 0); } - private static SurfaceControl.DisplayMode createFakeDisplayMode(int width, int height, + private static SurfaceControl.DisplayMode createFakeDisplayMode(int id, int width, int height, float refreshRate, int group) { final SurfaceControl.DisplayMode mode = new SurfaceControl.DisplayMode(); + mode.id = id; mode.width = width; mode.height = height; mode.refreshRate = refreshRate; |