Loading services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +14 −1 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,8 @@ protected: FenceTimePtr fenceTime = FenceTime::NO_FENCE; FenceTimePtr fenceTime = FenceTime::NO_FENCE; TimePoint expectedPresentTime = TimePoint(); 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; utils::RingBuffer<FenceWithFenceTime, 5> mFenceWithFenceTimes; TimePoint mLastSignaledFrameTime; TimePoint mLastSignaledFrameTime; Loading @@ -131,6 +132,18 @@ private: } } return pastFenceTimePtr; 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. // Computes a display's per-frame metrics about past/upcoming targeting of present deadlines. Loading services/surfaceflinger/Scheduler/src/FrameTargeter.cpp +8 −4 Original line number Original line Diff line number Diff line Loading @@ -30,7 +30,7 @@ FrameTarget::FrameTarget(const std::string& displayLabel) TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const { TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const { // TODO(b/267315508): Generalize to N VSYNCs. // 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); return mExpectedPresentTime - Period::fromNs(minFramePeriod.ns() << shift); } } Loading @@ -38,8 +38,10 @@ FenceTimePtr FrameTarget::presentFenceForPastVsync(Period minFramePeriod) const if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { return pastVsyncTimePtr(); 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 { bool FrameTarget::wouldPresentEarly(Period minFramePeriod) const { Loading Loading @@ -151,7 +153,9 @@ FenceTimePtr FrameTargeter::setPresentFence(sp<Fence> presentFence, FenceTimePtr if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime); addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime); } else { } 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}; mPresentFences[0] = {std::move(presentFence), presentFenceTime, mExpectedPresentTime}; } } return presentFenceTime; return presentFenceTime; Loading Loading
services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +14 −1 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,8 @@ protected: FenceTimePtr fenceTime = FenceTime::NO_FENCE; FenceTimePtr fenceTime = FenceTime::NO_FENCE; TimePoint expectedPresentTime = TimePoint(); 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; utils::RingBuffer<FenceWithFenceTime, 5> mFenceWithFenceTimes; TimePoint mLastSignaledFrameTime; TimePoint mLastSignaledFrameTime; Loading @@ -131,6 +132,18 @@ private: } } return pastFenceTimePtr; 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. // Computes a display's per-frame metrics about past/upcoming targeting of present deadlines. Loading
services/surfaceflinger/Scheduler/src/FrameTargeter.cpp +8 −4 Original line number Original line Diff line number Diff line Loading @@ -30,7 +30,7 @@ FrameTarget::FrameTarget(const std::string& displayLabel) TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const { TimePoint FrameTarget::pastVsyncTime(Period minFramePeriod) const { // TODO(b/267315508): Generalize to N VSYNCs. // 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); return mExpectedPresentTime - Period::fromNs(minFramePeriod.ns() << shift); } } Loading @@ -38,8 +38,10 @@ FenceTimePtr FrameTarget::presentFenceForPastVsync(Period minFramePeriod) const if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { return pastVsyncTimePtr(); 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 { bool FrameTarget::wouldPresentEarly(Period minFramePeriod) const { Loading Loading @@ -151,7 +153,9 @@ FenceTimePtr FrameTargeter::setPresentFence(sp<Fence> presentFence, FenceTimePtr if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { if (FlagManager::getInstance().allow_n_vsyncs_in_targeter()) { addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime); addFence(std::move(presentFence), presentFenceTime, mExpectedPresentTime); } else { } 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}; mPresentFences[0] = {std::move(presentFence), presentFenceTime, mExpectedPresentTime}; } } return presentFenceTime; return presentFenceTime; Loading