diff options
6 files changed, 23 insertions, 13 deletions
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index fff97f7e0a..c76d4bd982 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -646,13 +646,13 @@ Fps Scheduler::getNextFrameInterval(PhysicalDisplayId id, return Fps{}; } const Display& display = *displayOpt; - const nsecs_t threshold = - display.selectorPtr->getActiveMode().modePtr->getVsyncRate().getPeriodNsecs() / 2; - const nsecs_t nextVsyncTime = - display.schedulePtr->getTracker() - .nextAnticipatedVSyncTimeFrom(currentExpectedPresentTime.ns() + threshold, - currentExpectedPresentTime.ns()); - return Fps::fromPeriodNsecs(nextVsyncTime - currentExpectedPresentTime.ns()); + const Duration threshold = + display.selectorPtr->getActiveMode().modePtr->getVsyncRate().getPeriod() / 2; + const TimePoint nextVsyncTime = + display.schedulePtr->vsyncDeadlineAfter(currentExpectedPresentTime + threshold, + currentExpectedPresentTime); + const Duration frameInterval = nextVsyncTime - currentExpectedPresentTime; + return Fps::fromPeriodNsecs(frameInterval.ns()); } void Scheduler::resync() { diff --git a/services/surfaceflinger/Scheduler/VsyncSchedule.cpp b/services/surfaceflinger/Scheduler/VsyncSchedule.cpp index db6a1871a7..3491600d8e 100644 --- a/services/surfaceflinger/Scheduler/VsyncSchedule.cpp +++ b/services/surfaceflinger/Scheduler/VsyncSchedule.cpp @@ -89,8 +89,12 @@ Period VsyncSchedule::minFramePeriod() const { return period(); } -TimePoint VsyncSchedule::vsyncDeadlineAfter(TimePoint timePoint) const { - return TimePoint::fromNs(mTracker->nextAnticipatedVSyncTimeFrom(timePoint.ns())); +TimePoint VsyncSchedule::vsyncDeadlineAfter(TimePoint timePoint, + ftl::Optional<TimePoint> lastVsyncOpt) const { + return TimePoint::fromNs( + mTracker->nextAnticipatedVSyncTimeFrom(timePoint.ns(), + lastVsyncOpt.transform( + [](TimePoint t) { return t.ns(); }))); } void VsyncSchedule::dump(std::string& out) const { diff --git a/services/surfaceflinger/Scheduler/VsyncSchedule.h b/services/surfaceflinger/Scheduler/VsyncSchedule.h index 722ea0b836..6f656d2029 100644 --- a/services/surfaceflinger/Scheduler/VsyncSchedule.h +++ b/services/surfaceflinger/Scheduler/VsyncSchedule.h @@ -63,7 +63,8 @@ public: // IVsyncSource overrides: Period period() const override; - TimePoint vsyncDeadlineAfter(TimePoint) const override; + TimePoint vsyncDeadlineAfter(TimePoint, + ftl::Optional<TimePoint> lastVsyncOpt = {}) const override; Period minFramePeriod() const override; // Inform the schedule that the display mode changed the schedule needs to recalibrate diff --git a/services/surfaceflinger/Scheduler/include/scheduler/IVsyncSource.h b/services/surfaceflinger/Scheduler/include/scheduler/IVsyncSource.h index 0154060f36..f0f7a87105 100644 --- a/services/surfaceflinger/Scheduler/include/scheduler/IVsyncSource.h +++ b/services/surfaceflinger/Scheduler/include/scheduler/IVsyncSource.h @@ -16,13 +16,14 @@ #pragma once +#include <ftl/optional.h> #include <scheduler/Time.h> namespace android::scheduler { struct IVsyncSource { virtual Period period() const = 0; - virtual TimePoint vsyncDeadlineAfter(TimePoint) const = 0; + virtual TimePoint vsyncDeadlineAfter(TimePoint, ftl::Optional<TimePoint> = {}) const = 0; virtual Period minFramePeriod() const = 0; protected: diff --git a/services/surfaceflinger/Scheduler/tests/FrameTargeterTest.cpp b/services/surfaceflinger/Scheduler/tests/FrameTargeterTest.cpp index a9abcaf14c..29711afdf9 100644 --- a/services/surfaceflinger/Scheduler/tests/FrameTargeterTest.cpp +++ b/services/surfaceflinger/Scheduler/tests/FrameTargeterTest.cpp @@ -38,7 +38,9 @@ struct VsyncSource final : IVsyncSource { const TimePoint vsyncDeadline; Period period() const override { return vsyncPeriod; } - TimePoint vsyncDeadlineAfter(TimePoint) const override { return vsyncDeadline; } + TimePoint vsyncDeadlineAfter(TimePoint, ftl::Optional<TimePoint> = {}) const override { + return vsyncDeadline; + } Period minFramePeriod() const override { return framePeriod; } }; diff --git a/services/surfaceflinger/fuzzer/surfaceflinger_scheduler_fuzzer.cpp b/services/surfaceflinger/fuzzer/surfaceflinger_scheduler_fuzzer.cpp index c098ddad24..a6b12d0a12 100644 --- a/services/surfaceflinger/fuzzer/surfaceflinger_scheduler_fuzzer.cpp +++ b/services/surfaceflinger/fuzzer/surfaceflinger_scheduler_fuzzer.cpp @@ -441,7 +441,9 @@ void SchedulerFuzzer::fuzzFrameTargeter() { FuzzedDataProvider& fuzzer; Period period() const { return getFuzzedDuration(fuzzer); } - TimePoint vsyncDeadlineAfter(TimePoint) const { return getFuzzedTimePoint(fuzzer); } + TimePoint vsyncDeadlineAfter(TimePoint, ftl::Optional<TimePoint> = {}) const { + return getFuzzedTimePoint(fuzzer); + } Period minFramePeriod() const { return period(); } } vsyncSource{mFdp}; |