From 4f5cc3723e009dee8723497b04a927750c2b03ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Thu, 6 Apr 2023 14:49:50 +0000 Subject: [PATCH] Store brightnessThrottlingDataId in DisplayInfo Bug: 269465157 Test: atest com.android.server.display Test: adb shell dumpsys display | grep LogicalDisplay Test: adb shell dumpsys display | grep BrightnessThrottler Change-Id: Iefa826af6c205c2a3baa800244eaeaa9fee2ea94 --- core/java/android/view/DisplayInfo.java | 17 +++++++++++++- .../display/DisplayPowerController.java | 12 ++++++---- .../display/DisplayPowerController2.java | 12 ++++++---- .../server/display/LogicalDisplay.java | 15 +++++------- .../display/DisplayPowerController2Test.java | 23 +++++++++++++++---- .../display/DisplayPowerControllerTest.java | 17 ++++++++++++-- .../display/LogicalDisplayMapperTest.java | 12 +++++----- .../server/display/LogicalDisplayTest.java | 15 ++++++++++++ 8 files changed, 90 insertions(+), 33 deletions(-) diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index f2373fbfa858a..d8fa533dbef75 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -360,6 +360,14 @@ public final class DisplayInfo implements Parcelable { public SparseArray thermalRefreshRateThrottling = new SparseArray<>(); + /** + * The ID of the brightness throttling data that should be used. This can change e.g. in + * concurrent displays mode in which a stricter brightness throttling policy might need to be + * used. + */ + @Nullable + public String thermalBrightnessThrottlingDataId; + public static final @android.annotation.NonNull Creator CREATOR = new Creator() { @Override public DisplayInfo createFromParcel(Parcel source) { @@ -437,7 +445,9 @@ public final class DisplayInfo implements Parcelable { && Objects.equals(displayShape, other.displayShape) && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate) && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio) - && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling); + && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling) + && Objects.equals( + thermalBrightnessThrottlingDataId, other.thermalBrightnessThrottlingDataId); } @Override @@ -495,6 +505,7 @@ public final class DisplayInfo implements Parcelable { layoutLimitedRefreshRate = other.layoutLimitedRefreshRate; hdrSdrRatio = other.hdrSdrRatio; thermalRefreshRateThrottling = other.thermalRefreshRateThrottling; + thermalBrightnessThrottlingDataId = other.thermalBrightnessThrottlingDataId; } public void readFromParcel(Parcel source) { @@ -559,6 +570,7 @@ public final class DisplayInfo implements Parcelable { hdrSdrRatio = source.readFloat(); thermalRefreshRateThrottling = source.readSparseArray(null, SurfaceControl.RefreshRateRange.class); + thermalBrightnessThrottlingDataId = source.readString8(); } @Override @@ -620,6 +632,7 @@ public final class DisplayInfo implements Parcelable { dest.writeTypedObject(layoutLimitedRefreshRate, flags); dest.writeFloat(hdrSdrRatio); dest.writeSparseArray(thermalRefreshRateThrottling); + dest.writeString8(thermalBrightnessThrottlingDataId); } @Override @@ -889,6 +902,8 @@ public final class DisplayInfo implements Parcelable { } sb.append(", thermalRefreshRateThrottling "); sb.append(thermalRefreshRateThrottling); + sb.append(", thermalBrightnessThrottlingDataId "); + sb.append(thermalBrightnessThrottlingDataId); sb.append("}"); return sb.toString(); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 78c5f0eee492b..80666490056c4 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -83,6 +83,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -560,7 +561,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); @@ -910,7 +911,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { @@ -927,8 +928,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -2143,7 +2144,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index a76f907a41f5a..66d534390216d 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -85,6 +85,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -443,7 +444,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); @@ -715,7 +716,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; @@ -733,8 +734,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -1774,7 +1775,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 0b6d1c851dc45..e5c50e61bf259 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -203,6 +203,7 @@ final class LogicalDisplay { mIsEnabled = true; mIsInTransition = false; mThermalBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; } public void setDevicePositionLocked(int position) { @@ -514,6 +515,7 @@ final class LogicalDisplay { mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate; mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; mPrimaryDisplayDeviceInfo = deviceInfo; mInfo.set(null); @@ -885,20 +887,15 @@ final class LogicalDisplay { mIsInTransition = isInTransition; } - /** - * @return The ID of the brightness throttling data that this display should use. - */ - public String getThermalBrightnessThrottlingDataIdLocked() { - return mThermalBrightnessThrottlingDataId; - } - /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setThermalBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { - mThermalBrightnessThrottlingDataId = - brightnessThrottlingDataId; + if (!Objects.equals(brightnessThrottlingDataId, mThermalBrightnessThrottlingDataId)) { + mThermalBrightnessThrottlingDataId = brightnessThrottlingDataId; + mDirty = true; + } } /** diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index c4aa0bbc24b5a..4f5dc832dd521 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -596,17 +596,17 @@ public final class DisplayPowerController2Test { // We should still set screen state for the default display DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, times(2)).setScreenState(anyInt()); mHolder = createDisplayPowerController(42, UNIQUE_ID); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, never()).setScreenState(anyInt()); mHolder.dpc.onBootCompleted(); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState).setScreenState(anyInt()); } @@ -822,6 +822,21 @@ public final class DisplayPowerController2Test { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -862,8 +877,6 @@ public final class DisplayPowerController2Test { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 415adbbac91e0..5c0810fdca441 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -829,6 +829,21 @@ public final class DisplayPowerControllerTest { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -869,8 +884,6 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java index 7536c7949bcba..1eec70da3d203 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java @@ -649,9 +649,9 @@ public class LogicalDisplayMapperTest { assertEquals(0, mLogicalDisplayMapper.getDisplayLocked(device2) .getLeadDisplayIdLocked()); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(1, false); advanceTime(1000); @@ -661,10 +661,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(2, false); advanceTime(1000); @@ -674,10 +674,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); } @Test diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java index 5ea30298890fa..f6cf57161f594 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java @@ -205,4 +205,19 @@ public class LogicalDisplayTest { assertNotEquals(info3, info2); assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling)); } + + @Test + public void testSetThermalBrightnessThrottlingDataId() { + String brightnessThrottlingDataId = "throttling_data_id"; + DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked(); + mLogicalDisplay.setThermalBrightnessThrottlingDataIdLocked(brightnessThrottlingDataId); + DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked(); + // Display info should only be updated when updateLocked is called + assertEquals(info2, info1); + + mLogicalDisplay.updateLocked(mDeviceRepo); + DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked(); + assertNotEquals(info3, info2); + assertEquals(brightnessThrottlingDataId, info3.thermalBrightnessThrottlingDataId); + } }