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

Commit b17bbfcc authored by petsjonkin's avatar petsjonkin Committed by Oleg Petšjonkin
Browse files

LowLight blocking zone modes config for vrr displays

Bug: b/345164799
Test: atest BrightnessObserverTest
Change-Id: I1b33ab3f3f1acb8351dbebad391e2e4e4e820b65
parent 74f9c104
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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">
+16 −5
Original line number Diff line number Diff line
@@ -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 {"
@@ -84,6 +88,7 @@ public class RefreshRateData {
                + ", defaultRefreshRateInHbmHdr: " + defaultRefreshRateInHbmHdr
                + ", defaultRefreshRateInHbmSunlight: " + defaultRefreshRateInHbmSunlight
                + ", lowPowerSupportedModes=" + lowPowerSupportedModes
                + ", lowLightBlockingZoneSupportedModes=" + lowLightBlockingZoneSupportedModes
                + "} ";
    }

@@ -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(
+22 −16
Original line number Diff line number Diff line
@@ -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(
@@ -2300,6 +2311,7 @@ public class DisplayModeDirector {
            return false;
        }

        @GuardedBy("mLock")
        private void onBrightnessChangedLocked() {
            if (!mRefreshRateChangeable || mLowPowerModeEnabled) {
                return;
@@ -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,
@@ -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()
@@ -2368,7 +2374,7 @@ public class DisplayModeDirector {
        }

        private boolean hasValidLowZone() {
            return mRefreshRateInLowZone > 0
            return (mRefreshRateInLowZone > 0 || hasLowLightVrrConfig())
                    && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange);
        }

+0 −7
Original line number Diff line number Diff line
@@ -205,13 +205,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:
+15 −0
Original line number Diff line number Diff line
@@ -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