Loading services/surfaceflinger/Scheduler/Scheduler.cpp +0 −12 Original line number Diff line number Diff line Loading @@ -250,18 +250,6 @@ void Scheduler::onFrameSignal(ICompositor& compositor, VsyncId vsyncId, mPacesetterFrameDurationFractionToSkip = 0.f; } if (FlagManager::getInstance().vrr_config()) { const auto minFramePeriod = pacesetterPtr->schedulePtr->minFramePeriod(); const auto presentFenceForPastVsync = pacesetterPtr->targeterPtr->target().presentFenceForPastVsync(minFramePeriod); const auto lastConfirmedPresentTime = presentFenceForPastVsync->getSignalTime(); if (lastConfirmedPresentTime != Fence::SIGNAL_TIME_PENDING && lastConfirmedPresentTime != Fence::SIGNAL_TIME_INVALID) { pacesetterPtr->schedulePtr->getTracker() .onFrameBegin(expectedVsyncTime, TimePoint::fromNs(lastConfirmedPresentTime)); } } const auto resultsPerDisplay = compositor.composite(pacesetterPtr->displayId, targeters); if (FlagManager::getInstance().vrr_config()) { compositor.sendNotifyExpectedPresentHint(pacesetterPtr->displayId); Loading services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +2 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ public: bool isFramePending() const { return mFramePending; } bool didMissFrame() const { return mFrameMissed; } bool didMissHwcFrame() const { return mHwcFrameMissed && !mGpuFrameMissed; } TimePoint lastSignaledFrameTime() const { return mLastSignaledFrameTime; }; protected: explicit FrameTarget(const std::string& displayLabel); Loading Loading @@ -98,6 +99,7 @@ protected: FenceTimePtr fenceTime = FenceTime::NO_FENCE; }; std::array<FenceWithFenceTime, 2> mPresentFences; TimePoint mLastSignaledFrameTime; private: friend class FrameTargeterTestBase; Loading services/surfaceflinger/Scheduler/src/FrameTargeter.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ void FrameTargeter::beginFrame(const BeginFrameArgs& args, const IVsyncSource& v mFrameMissed = mFramePending || [&] { const nsecs_t pastPresentTime = pastPresentFence->getSignalTime(); if (pastPresentTime < 0) return false; mLastSignaledFrameTime = TimePoint::fromNs(pastPresentTime); const nsecs_t frameMissedSlop = vsyncPeriod.ns() / 2; return lastScheduledPresentTime.ns() < pastPresentTime - frameMissedSlop; }(); Loading services/surfaceflinger/SurfaceFlinger.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -2606,6 +2606,14 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, flushTransactions, transactionsAreEmpty); } // Tell VsyncTracker that we are going to present this frame before scheduling // setTransactionFlags which will schedule another SF frame. This was if the tracker // needs to adjust the vsync timeline, it will be done before the next frame. if (FlagManager::getInstance().vrr_config() && mustComposite) { mScheduler->getVsyncSchedule()->getTracker().onFrameBegin( pacesetterFrameTarget.expectedPresentTime(), pacesetterFrameTarget.lastSignaledFrameTime()); } if (transactionFlushNeeded()) { setTransactionFlags(eTransactionFlushNeeded); } Loading Loading
services/surfaceflinger/Scheduler/Scheduler.cpp +0 −12 Original line number Diff line number Diff line Loading @@ -250,18 +250,6 @@ void Scheduler::onFrameSignal(ICompositor& compositor, VsyncId vsyncId, mPacesetterFrameDurationFractionToSkip = 0.f; } if (FlagManager::getInstance().vrr_config()) { const auto minFramePeriod = pacesetterPtr->schedulePtr->minFramePeriod(); const auto presentFenceForPastVsync = pacesetterPtr->targeterPtr->target().presentFenceForPastVsync(minFramePeriod); const auto lastConfirmedPresentTime = presentFenceForPastVsync->getSignalTime(); if (lastConfirmedPresentTime != Fence::SIGNAL_TIME_PENDING && lastConfirmedPresentTime != Fence::SIGNAL_TIME_INVALID) { pacesetterPtr->schedulePtr->getTracker() .onFrameBegin(expectedVsyncTime, TimePoint::fromNs(lastConfirmedPresentTime)); } } const auto resultsPerDisplay = compositor.composite(pacesetterPtr->displayId, targeters); if (FlagManager::getInstance().vrr_config()) { compositor.sendNotifyExpectedPresentHint(pacesetterPtr->displayId); Loading
services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +2 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ public: bool isFramePending() const { return mFramePending; } bool didMissFrame() const { return mFrameMissed; } bool didMissHwcFrame() const { return mHwcFrameMissed && !mGpuFrameMissed; } TimePoint lastSignaledFrameTime() const { return mLastSignaledFrameTime; }; protected: explicit FrameTarget(const std::string& displayLabel); Loading Loading @@ -98,6 +99,7 @@ protected: FenceTimePtr fenceTime = FenceTime::NO_FENCE; }; std::array<FenceWithFenceTime, 2> mPresentFences; TimePoint mLastSignaledFrameTime; private: friend class FrameTargeterTestBase; Loading
services/surfaceflinger/Scheduler/src/FrameTargeter.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,7 @@ void FrameTargeter::beginFrame(const BeginFrameArgs& args, const IVsyncSource& v mFrameMissed = mFramePending || [&] { const nsecs_t pastPresentTime = pastPresentFence->getSignalTime(); if (pastPresentTime < 0) return false; mLastSignaledFrameTime = TimePoint::fromNs(pastPresentTime); const nsecs_t frameMissedSlop = vsyncPeriod.ns() / 2; return lastScheduledPresentTime.ns() < pastPresentTime - frameMissedSlop; }(); Loading
services/surfaceflinger/SurfaceFlinger.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -2606,6 +2606,14 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, flushTransactions, transactionsAreEmpty); } // Tell VsyncTracker that we are going to present this frame before scheduling // setTransactionFlags which will schedule another SF frame. This was if the tracker // needs to adjust the vsync timeline, it will be done before the next frame. if (FlagManager::getInstance().vrr_config() && mustComposite) { mScheduler->getVsyncSchedule()->getTracker().onFrameBegin( pacesetterFrameTarget.expectedPresentTime(), pacesetterFrameTarget.lastSignaledFrameTime()); } if (transactionFlushNeeded()) { setTransactionFlags(eTransactionFlushNeeded); } Loading