Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +20 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,16 @@ import javax.xml.datatype.DatatypeConfigurationException; * <nits>55.2</nits> * </displayBrightnessPoint> * </blockingZoneThreshold> * <supportedModes> * <point> * <first>60</first> // refresh rate * <second>60</second> // vsync * </point> * <point> * <first>120</first> // refresh rate * <second>120</second> // vsync * </point> * </supportedModes> * </lowerBlockingZoneConfigs> * <higherBlockingZoneConfigs> * <defaultRefreshRate>90</defaultRefreshRate> Loading @@ -244,6 +254,16 @@ import javax.xml.datatype.DatatypeConfigurationException; * </displayBrightnessPoint> * </blockingZoneThreshold> * </higherBlockingZoneConfigs> * <lowPowerSupportedModes> * <point> * <first>60</first> // refresh rate * <second>60</second> // vsync * </point> * <point> * <first>60</first> // refresh rate * <second>240</second> // vsync * </point> * </lowPowerSupportedModes> * </refreshRate> * * <highBrightnessMode enabled="true"> Loading services/core/java/com/android/server/display/config/RefreshRateData.java +16 −5 Original line number Diff line number Diff line Loading @@ -64,18 +64,22 @@ public class RefreshRateData { public final List<SupportedModeData> lowPowerSupportedModes; public final List<SupportedModeData> lowLightBlockingZoneSupportedModes; @VisibleForTesting public RefreshRateData(int defaultRefreshRate, int defaultPeakRefreshRate, int defaultRefreshRateInHbmHdr, int defaultRefreshRateInHbmSunlight, List<SupportedModeData> lowPowerSupportedModes) { List<SupportedModeData> lowPowerSupportedModes, List<SupportedModeData> lowLightBlockingZoneSupportedModes) { this.defaultRefreshRate = defaultRefreshRate; this.defaultPeakRefreshRate = defaultPeakRefreshRate; this.defaultRefreshRateInHbmHdr = defaultRefreshRateInHbmHdr; this.defaultRefreshRateInHbmSunlight = defaultRefreshRateInHbmSunlight; this.lowPowerSupportedModes = Collections.unmodifiableList(lowPowerSupportedModes); this.lowLightBlockingZoneSupportedModes = Collections.unmodifiableList(lowLightBlockingZoneSupportedModes); } @Override public String toString() { return "RefreshRateData {" Loading @@ -84,6 +88,7 @@ public class RefreshRateData { + ", defaultRefreshRateInHbmHdr: " + defaultRefreshRateInHbmHdr + ", defaultRefreshRateInHbmSunlight: " + defaultRefreshRateInHbmSunlight + ", lowPowerSupportedModes=" + lowPowerSupportedModes + ", lowLightBlockingZoneSupportedModes=" + lowLightBlockingZoneSupportedModes + "} "; } Loading @@ -100,13 +105,19 @@ public class RefreshRateData { int defaultRefreshRateInHbmSunlight = loadDefaultRefreshRateInHbmSunlight( refreshRateConfigs, resources); NonNegativeFloatToFloatMap modes = NonNegativeFloatToFloatMap lowPowerModes = refreshRateConfigs == null ? null : refreshRateConfigs.getLowPowerSupportedModes(); List<SupportedModeData> lowPowerSupportedModes = SupportedModeData.load(modes); List<SupportedModeData> lowPowerSupportedModes = SupportedModeData.load(lowPowerModes); BlockingZoneConfig lowerZoneConfig = refreshRateConfigs == null ? null : refreshRateConfigs.getLowerBlockingZoneConfigs(); NonNegativeFloatToFloatMap lowerZoneModes = lowerZoneConfig == null ? null : lowerZoneConfig.getSupportedModes(); List<SupportedModeData> lowLightSupportedModes = SupportedModeData.load(lowerZoneModes); return new RefreshRateData(defaultRefreshRate, defaultPeakRefreshRate, defaultRefreshRateInHbmHdr, defaultRefreshRateInHbmSunlight, lowPowerSupportedModes); lowPowerSupportedModes, lowLightSupportedModes); } private static int loadDefaultRefreshRate( Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +22 −16 Original line number Diff line number Diff line Loading @@ -2157,8 +2157,19 @@ public class DisplayModeDirector { } } private boolean hasLowLightVrrConfig() { DisplayDeviceConfig config; synchronized (mLock) { config = mDefaultDisplayDeviceConfig; } return mVsyncLowLightBlockingVoteEnabled && config != null && config.isVrrSupportEnabled() && !config.getRefreshRateData().lowLightBlockingZoneSupportedModes.isEmpty(); } private void restartObserver() { if (mRefreshRateInLowZone > 0) { if (mRefreshRateInLowZone > 0 || hasLowLightVrrConfig()) { mShouldObserveDisplayLowChange = hasValidThreshold( mLowDisplayBrightnessThresholds); mShouldObserveAmbientLowChange = hasValidThreshold( Loading Loading @@ -2300,6 +2311,7 @@ public class DisplayModeDirector { return false; } @GuardedBy("mLock") private void onBrightnessChangedLocked() { if (!mRefreshRateChangeable || mLowPowerModeEnabled) { return; Loading @@ -2315,8 +2327,14 @@ public class DisplayModeDirector { boolean insideLowZone = hasValidLowZone() && isInsideLowZone(mBrightness, mAmbientLux); if (insideLowZone) { refreshRateVote = Vote.forPhysicalRefreshRates(mRefreshRateInLowZone, mRefreshRateInLowZone); if (hasLowLightVrrConfig()) { refreshRateVote = Vote.forSupportedRefreshRates(mDefaultDisplayDeviceConfig .getRefreshRateData().lowLightBlockingZoneSupportedModes); } else { refreshRateVote = Vote.forPhysicalRefreshRates( mRefreshRateInLowZone, mRefreshRateInLowZone); refreshRateSwitchingVote = Vote.forDisableRefreshRateSwitching(); } if (mLowZoneRefreshRateForThermals != null) { RefreshRateRange range = SkinThermalStatusObserver .findBestMatchingRefreshRateRange(mThermalStatus, Loading @@ -2326,18 +2344,6 @@ public class DisplayModeDirector { Vote.forPhysicalRefreshRates(range.min, range.max); } } if (mVsyncLowLightBlockingVoteEnabled && isVrrSupportedLocked(Display.DEFAULT_DISPLAY)) { refreshRateSwitchingVote = Vote.forSupportedRefreshRatesAndDisableSwitching( List.of( new SupportedRefreshRatesVote.RefreshRates( /* peakRefreshRate= */ 60f, /* vsyncRate= */ 60f), new SupportedRefreshRatesVote.RefreshRates( /* peakRefreshRate= */120f, /* vsyncRate= */ 120f))); } else { refreshRateSwitchingVote = Vote.forDisableRefreshRateSwitching(); } } boolean insideHighZone = hasValidHighZone() Loading Loading @@ -2368,7 +2374,7 @@ public class DisplayModeDirector { } private boolean hasValidLowZone() { return mRefreshRateInLowZone > 0 return (mRefreshRateInLowZone > 0 || hasLowLightVrrConfig()) && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange); } Loading services/core/java/com/android/server/display/mode/Vote.java +0 −7 Original line number Diff line number Diff line Loading @@ -233,13 +233,6 @@ interface Vote { return new SupportedModesVote(modeIds); } static Vote forSupportedRefreshRatesAndDisableSwitching( List<SupportedRefreshRatesVote.RefreshRates> supportedRefreshRates) { return new CombinedVote( List.of(forDisableRefreshRateSwitching(), new SupportedRefreshRatesVote(supportedRefreshRates))); } static String priorityToString(int priority) { switch (priority) { case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE: Loading services/core/xsd/display-device-config/display-device-config.xsd +15 −0 Original line number Diff line number Diff line Loading @@ -779,6 +779,21 @@ </xs:complexType> <xs:complexType name="blockingZoneConfig"> <!-- list of supported modes for blocking zone . Each point corresponds to one mode. Supported only for lowerBlockingZoneConfigs Mode format is : first = refreshRate, second = vsyncRate. E.g. : <supportedModes> <point> <first>60</first> // refreshRate <second>60</second> //vsyncRate </point> .... </supportedModes> --> <xs:element type="nonNegativeFloatToFloatMap" name="supportedModes" minOccurs="0"> <xs:annotation name="nullable"/> <xs:annotation name="final"/> </xs:element> <xs:element name="defaultRefreshRate" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"> <xs:annotation name="final"/> Loading Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +20 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,16 @@ import javax.xml.datatype.DatatypeConfigurationException; * <nits>55.2</nits> * </displayBrightnessPoint> * </blockingZoneThreshold> * <supportedModes> * <point> * <first>60</first> // refresh rate * <second>60</second> // vsync * </point> * <point> * <first>120</first> // refresh rate * <second>120</second> // vsync * </point> * </supportedModes> * </lowerBlockingZoneConfigs> * <higherBlockingZoneConfigs> * <defaultRefreshRate>90</defaultRefreshRate> Loading @@ -244,6 +254,16 @@ import javax.xml.datatype.DatatypeConfigurationException; * </displayBrightnessPoint> * </blockingZoneThreshold> * </higherBlockingZoneConfigs> * <lowPowerSupportedModes> * <point> * <first>60</first> // refresh rate * <second>60</second> // vsync * </point> * <point> * <first>60</first> // refresh rate * <second>240</second> // vsync * </point> * </lowPowerSupportedModes> * </refreshRate> * * <highBrightnessMode enabled="true"> Loading
services/core/java/com/android/server/display/config/RefreshRateData.java +16 −5 Original line number Diff line number Diff line Loading @@ -64,18 +64,22 @@ public class RefreshRateData { public final List<SupportedModeData> lowPowerSupportedModes; public final List<SupportedModeData> lowLightBlockingZoneSupportedModes; @VisibleForTesting public RefreshRateData(int defaultRefreshRate, int defaultPeakRefreshRate, int defaultRefreshRateInHbmHdr, int defaultRefreshRateInHbmSunlight, List<SupportedModeData> lowPowerSupportedModes) { List<SupportedModeData> lowPowerSupportedModes, List<SupportedModeData> lowLightBlockingZoneSupportedModes) { this.defaultRefreshRate = defaultRefreshRate; this.defaultPeakRefreshRate = defaultPeakRefreshRate; this.defaultRefreshRateInHbmHdr = defaultRefreshRateInHbmHdr; this.defaultRefreshRateInHbmSunlight = defaultRefreshRateInHbmSunlight; this.lowPowerSupportedModes = Collections.unmodifiableList(lowPowerSupportedModes); this.lowLightBlockingZoneSupportedModes = Collections.unmodifiableList(lowLightBlockingZoneSupportedModes); } @Override public String toString() { return "RefreshRateData {" Loading @@ -84,6 +88,7 @@ public class RefreshRateData { + ", defaultRefreshRateInHbmHdr: " + defaultRefreshRateInHbmHdr + ", defaultRefreshRateInHbmSunlight: " + defaultRefreshRateInHbmSunlight + ", lowPowerSupportedModes=" + lowPowerSupportedModes + ", lowLightBlockingZoneSupportedModes=" + lowLightBlockingZoneSupportedModes + "} "; } Loading @@ -100,13 +105,19 @@ public class RefreshRateData { int defaultRefreshRateInHbmSunlight = loadDefaultRefreshRateInHbmSunlight( refreshRateConfigs, resources); NonNegativeFloatToFloatMap modes = NonNegativeFloatToFloatMap lowPowerModes = refreshRateConfigs == null ? null : refreshRateConfigs.getLowPowerSupportedModes(); List<SupportedModeData> lowPowerSupportedModes = SupportedModeData.load(modes); List<SupportedModeData> lowPowerSupportedModes = SupportedModeData.load(lowPowerModes); BlockingZoneConfig lowerZoneConfig = refreshRateConfigs == null ? null : refreshRateConfigs.getLowerBlockingZoneConfigs(); NonNegativeFloatToFloatMap lowerZoneModes = lowerZoneConfig == null ? null : lowerZoneConfig.getSupportedModes(); List<SupportedModeData> lowLightSupportedModes = SupportedModeData.load(lowerZoneModes); return new RefreshRateData(defaultRefreshRate, defaultPeakRefreshRate, defaultRefreshRateInHbmHdr, defaultRefreshRateInHbmSunlight, lowPowerSupportedModes); lowPowerSupportedModes, lowLightSupportedModes); } private static int loadDefaultRefreshRate( Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +22 −16 Original line number Diff line number Diff line Loading @@ -2157,8 +2157,19 @@ public class DisplayModeDirector { } } private boolean hasLowLightVrrConfig() { DisplayDeviceConfig config; synchronized (mLock) { config = mDefaultDisplayDeviceConfig; } return mVsyncLowLightBlockingVoteEnabled && config != null && config.isVrrSupportEnabled() && !config.getRefreshRateData().lowLightBlockingZoneSupportedModes.isEmpty(); } private void restartObserver() { if (mRefreshRateInLowZone > 0) { if (mRefreshRateInLowZone > 0 || hasLowLightVrrConfig()) { mShouldObserveDisplayLowChange = hasValidThreshold( mLowDisplayBrightnessThresholds); mShouldObserveAmbientLowChange = hasValidThreshold( Loading Loading @@ -2300,6 +2311,7 @@ public class DisplayModeDirector { return false; } @GuardedBy("mLock") private void onBrightnessChangedLocked() { if (!mRefreshRateChangeable || mLowPowerModeEnabled) { return; Loading @@ -2315,8 +2327,14 @@ public class DisplayModeDirector { boolean insideLowZone = hasValidLowZone() && isInsideLowZone(mBrightness, mAmbientLux); if (insideLowZone) { refreshRateVote = Vote.forPhysicalRefreshRates(mRefreshRateInLowZone, mRefreshRateInLowZone); if (hasLowLightVrrConfig()) { refreshRateVote = Vote.forSupportedRefreshRates(mDefaultDisplayDeviceConfig .getRefreshRateData().lowLightBlockingZoneSupportedModes); } else { refreshRateVote = Vote.forPhysicalRefreshRates( mRefreshRateInLowZone, mRefreshRateInLowZone); refreshRateSwitchingVote = Vote.forDisableRefreshRateSwitching(); } if (mLowZoneRefreshRateForThermals != null) { RefreshRateRange range = SkinThermalStatusObserver .findBestMatchingRefreshRateRange(mThermalStatus, Loading @@ -2326,18 +2344,6 @@ public class DisplayModeDirector { Vote.forPhysicalRefreshRates(range.min, range.max); } } if (mVsyncLowLightBlockingVoteEnabled && isVrrSupportedLocked(Display.DEFAULT_DISPLAY)) { refreshRateSwitchingVote = Vote.forSupportedRefreshRatesAndDisableSwitching( List.of( new SupportedRefreshRatesVote.RefreshRates( /* peakRefreshRate= */ 60f, /* vsyncRate= */ 60f), new SupportedRefreshRatesVote.RefreshRates( /* peakRefreshRate= */120f, /* vsyncRate= */ 120f))); } else { refreshRateSwitchingVote = Vote.forDisableRefreshRateSwitching(); } } boolean insideHighZone = hasValidHighZone() Loading Loading @@ -2368,7 +2374,7 @@ public class DisplayModeDirector { } private boolean hasValidLowZone() { return mRefreshRateInLowZone > 0 return (mRefreshRateInLowZone > 0 || hasLowLightVrrConfig()) && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange); } Loading
services/core/java/com/android/server/display/mode/Vote.java +0 −7 Original line number Diff line number Diff line Loading @@ -233,13 +233,6 @@ interface Vote { return new SupportedModesVote(modeIds); } static Vote forSupportedRefreshRatesAndDisableSwitching( List<SupportedRefreshRatesVote.RefreshRates> supportedRefreshRates) { return new CombinedVote( List.of(forDisableRefreshRateSwitching(), new SupportedRefreshRatesVote(supportedRefreshRates))); } static String priorityToString(int priority) { switch (priority) { case PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE: Loading
services/core/xsd/display-device-config/display-device-config.xsd +15 −0 Original line number Diff line number Diff line Loading @@ -779,6 +779,21 @@ </xs:complexType> <xs:complexType name="blockingZoneConfig"> <!-- list of supported modes for blocking zone . Each point corresponds to one mode. Supported only for lowerBlockingZoneConfigs Mode format is : first = refreshRate, second = vsyncRate. E.g. : <supportedModes> <point> <first>60</first> // refreshRate <second>60</second> //vsyncRate </point> .... </supportedModes> --> <xs:element type="nonNegativeFloatToFloatMap" name="supportedModes" minOccurs="0"> <xs:annotation name="nullable"/> <xs:annotation name="final"/> </xs:element> <xs:element name="defaultRefreshRate" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"> <xs:annotation name="final"/> Loading