diff options
| author | 2024-03-26 02:27:57 +0000 | |
|---|---|---|
| committer | 2024-03-26 02:27:57 +0000 | |
| commit | aa7ebd6ac71917d9e94f29f0b62a1f62dad5e54e (patch) | |
| tree | cfdbed139827d8fd7a058a4e9ed45350c672ab9e | |
| parent | 030337deabfb7ef7f2e3c00dbeae33ed87426994 (diff) | |
SF: call onFrameBegin before scheduling the next frame
Bug: 329036771
Test: presubmit
Change-Id: Ie8643df787aa1080c59f280b005b40841715970b
4 files changed, 11 insertions, 12 deletions
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index 7968096111..005ec05aab 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -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); diff --git a/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h b/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h index a5bb6c216f..d6a3f62ed1 100644 --- a/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h +++ b/services/surfaceflinger/Scheduler/include/scheduler/FrameTargeter.h @@ -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); @@ -98,6 +99,7 @@ protected: FenceTimePtr fenceTime = FenceTime::NO_FENCE; }; std::array<FenceWithFenceTime, 2> mPresentFences; + TimePoint mLastSignaledFrameTime; private: friend class FrameTargeterTestBase; diff --git a/services/surfaceflinger/Scheduler/src/FrameTargeter.cpp b/services/surfaceflinger/Scheduler/src/FrameTargeter.cpp index 68c277d499..83355688f3 100644 --- a/services/surfaceflinger/Scheduler/src/FrameTargeter.cpp +++ b/services/surfaceflinger/Scheduler/src/FrameTargeter.cpp @@ -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; }(); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 734058a371..cf94f942fa 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -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); } |