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

Commit 76697369 authored by Ady Abraham's avatar Ady Abraham Committed by Automerger Merge Worker
Browse files

DO NOT MERGE Extend mPreviousPresentFences for high refresh rate am: 68e90f1b

parents ed00f6a0 68e90f1b
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -106,7 +106,8 @@ protected:
        FenceTimePtr fenceTime = FenceTime::NO_FENCE;
        TimePoint expectedPresentTime = TimePoint();
    };
    std::array<FenceWithFenceTime, 2> mPresentFences;
    // size should be longest sf-duration / shortest vsync period and round up
    std::array<FenceWithFenceTime, 5> mPresentFences; // currently consider 166hz.
    utils::RingBuffer<FenceWithFenceTime, 5> mFenceWithFenceTimes;

    TimePoint mLastSignaledFrameTime;
@@ -131,6 +132,18 @@ private:
        }
        return pastFenceTimePtr;
    }

    size_t getPresentFenceShift(Period minFramePeriod) const {
        const bool isTwoVsyncsAhead = targetsVsyncsAhead<2>(minFramePeriod);
        size_t shift = 0;
        if (isTwoVsyncsAhead) {
            shift = static_cast<size_t>(expectedFrameDuration().ns() / minFramePeriod.ns());
            if (shift >= mPresentFences.size()) {
                shift = mPresentFences.size() - 1;
            }
        }
        return shift;
    }
};

// Computes a display's per-frame metrics about past/upcoming targeting of present deadlines.
+8 −4
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ FrameTarget::FrameTarget(const std::string& displayLabel)

TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const {
    // TODO(b/267315508): Generalize to N VSYNCs.
    const int shift = static_cast<int>(targetsVsyncsAhead<2>(minFramePeriod));
    const size_t shift = getPresentFenceShift(minFramePeriod);
    return mExpectedPresentTime - Period::fromNs(minFramePeriod.ns() << shift);
}

@@ -38,8 +38,10 @@ FenceTimePtr FrameTarget::presentFenceForPastVsync(Period minFramePeriod) const
    if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
        return pastVsyncTimePtr();
    }
    const size_t i = static_cast<size_t>(targetsVsyncsAhead<2>(minFramePeriod));
    return mPresentFences[i].fenceTime;

    const size_t shift = getPresentFenceShift(minFramePeriod);
    ATRACE_FORMAT("mPresentFences shift=%zu", shift);
    return mPresentFences[shift].fenceTime;
}

bool FrameTarget::wouldPresentEarly(Period minFramePeriod) const {
@@ -151,7 +153,9 @@ FenceTimePtr FrameTargeter::setPresentFence(sp<Fence> presentFence, FenceTimePtr
    if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) {
        addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime);
    } else {
        mPresentFences[1] = mPresentFences[0];
        for (size_t i = mPresentFences.size()-1; i >= 1; i--) {
            mPresentFences[i] = mPresentFences[i-1];
        }
        mPresentFences[0] = {std::move(presentFence), presentFenceTime, mExpectedPresentTime};
    }
    return presentFenceTime;