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

Commit 47c8085a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "DO NOT MERGE Extend mPreviousPresentFences for high refresh rate" into aosp-24Q3-ts-dev

parents 7d410939 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;