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

Commit 3a949955 authored by Ana Krulec's avatar Ana Krulec Committed by android-build-merger
Browse files

Merge "SF: Don't bump to PERFORMANCE refresh rate with infrequent updates"...

Merge "SF: Don't bump to PERFORMANCE refresh rate with infrequent updates" into qt-r1-dev am: c775e762
am: ed9eae2f

Change-Id: I85b685b7d57ddb1aa6225a784bb19cac00e505ca
parents ac834dba ed9eae2f
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -46,11 +46,13 @@ LayerHistory::LayerHistory() {
LayerHistory::~LayerHistory() = default;

std::unique_ptr<LayerHistory::LayerHandle> LayerHistory::createLayer(const std::string name,
                                                                     float minRefreshRate,
                                                                     float maxRefreshRate) {
    const int64_t id = sNextId++;

    std::lock_guard lock(mLock);
    mInactiveLayerInfos.emplace(id, std::make_shared<LayerInfo>(name, maxRefreshRate));
    mInactiveLayerInfos.emplace(id,
                                std::make_shared<LayerInfo>(name, minRefreshRate, maxRefreshRate));
    return std::make_unique<LayerHistory::LayerHandle>(*this, id);
}

+2 −1
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ public:
    ~LayerHistory();

    // When the layer is first created, register it.
    std::unique_ptr<LayerHandle> createLayer(const std::string name, float maxRefreshRate);
    std::unique_ptr<LayerHandle> createLayer(const std::string name, float minRefreshRate,
                                             float maxRefreshRate);

    // Method for inserting layers and their requested present time into the unordered map.
    void insert(const std::unique_ptr<LayerHandle>& layerHandle, nsecs_t presentTime, bool isHdr);
+3 −2
Original line number Diff line number Diff line
@@ -24,9 +24,10 @@
namespace android {
namespace scheduler {

LayerInfo::LayerInfo(const std::string name, float maxRefreshRate)
LayerInfo::LayerInfo(const std::string name, float minRefreshRate, float maxRefreshRate)
      : mName(name),
        mMinRefreshDuration(1e9f / maxRefreshRate),
        mLowActivityRefreshDuration(1e9f / minRefreshRate),
        mRefreshRateHistory(mMinRefreshDuration) {}

LayerInfo::~LayerInfo() = default;
@@ -47,7 +48,7 @@ void LayerInfo::setLastPresentTime(nsecs_t lastPresentTime) {
    const nsecs_t timeDiff = lastPresentTime - mLastPresentTime;
    mLastPresentTime = lastPresentTime;
    // Ignore time diff that are too high - those are stale values
    if (timeDiff > TIME_EPSILON_NS.count()) return;
    if (timeDiff > OBSOLETE_TIME_EPSILON_NS.count()) return;
    const nsecs_t refreshDuration = (timeDiff > 0) ? timeDiff : mMinRefreshDuration;
    mRefreshRateHistory.insertRefreshRate(refreshDuration);
}
+28 −3
Original line number Diff line number Diff line
@@ -96,8 +96,9 @@ class LayerInfo {
                return false;
            }

            // The last update should not be older than TIME_EPSILON_NS nanoseconds.
            const int64_t obsoleteEpsilon = systemTime() - scheduler::TIME_EPSILON_NS.count();
            // The last update should not be older than OBSOLETE_TIME_EPSILON_NS nanoseconds.
            const int64_t obsoleteEpsilon =
                    systemTime() - scheduler::OBSOLETE_TIME_EPSILON_NS.count();
            if (mElements.at(mElements.size() - 1) < obsoleteEpsilon) {
                return false;
            }
@@ -105,6 +106,25 @@ class LayerInfo {
            return true;
        }

        bool isLowActivityLayer() const {
            // We want to make sure that we received more than two frames from the layer
            // in order to check low activity.
            if (mElements.size() < 2) {
                return false;
            }

            const int64_t obsoleteEpsilon =
                    systemTime() - scheduler::LOW_ACTIVITY_EPSILON_NS.count();
            // Check the frame before last to determine whether there is low activity.
            // If that frame is older than LOW_ACTIVITY_EPSILON_NS, the layer is sending
            // infrequent updates.
            if (mElements.at(mElements.size() - 2) < obsoleteEpsilon) {
                return true;
            }

            return false;
        }

        void clearHistory() { mElements.clear(); }

    private:
@@ -114,7 +134,7 @@ class LayerInfo {
    };

public:
    LayerInfo(const std::string name, float maxRefreshRate);
    LayerInfo(const std::string name, float minRefreshRate, float maxRefreshRate);
    ~LayerInfo();

    LayerInfo(const LayerInfo&) = delete;
@@ -144,6 +164,10 @@ public:
    // Calculate the average refresh rate.
    float getDesiredRefreshRate() const {
        std::lock_guard lock(mLock);

        if (mPresentTimeHistory.isLowActivityLayer()) {
            return 1e9f / mLowActivityRefreshDuration;
        }
        return mRefreshRateHistory.getRefreshRateAvg();
    }

@@ -175,6 +199,7 @@ public:
private:
    const std::string mName;
    const nsecs_t mMinRefreshDuration;
    const nsecs_t mLowActivityRefreshDuration;
    mutable std::mutex mLock;
    nsecs_t mLastUpdatedTime GUARDED_BY(mLock) = 0;
    nsecs_t mLastPresentTime GUARDED_BY(mLock) = 0;
+5 −2
Original line number Diff line number Diff line
@@ -325,8 +325,11 @@ std::unique_ptr<scheduler::LayerHistory::LayerHandle> Scheduler::registerLayer(
            : RefreshRateType::PERFORMANCE;

    const auto refreshRate = mRefreshRateConfigs.getRefreshRate(refreshRateType);
    const uint32_t fps = (refreshRate) ? refreshRate->fps : 0;
    return mLayerHistory.createLayer(name, fps);
    const uint32_t performanceFps = (refreshRate) ? refreshRate->fps : 0;

    const auto defaultRefreshRate = mRefreshRateConfigs.getRefreshRate(RefreshRateType::DEFAULT);
    const uint32_t defaultFps = (defaultRefreshRate) ? defaultRefreshRate->fps : 0;
    return mLayerHistory.createLayer(name, defaultFps, performanceFps);
}

void Scheduler::addLayerPresentTimeAndHDR(
Loading