Loading services/surfaceflinger/Scheduler/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,9 @@ cc_test { "libgmock", "libgtest", "libscheduler", "libsurfaceflingerflags_test", ], shared_libs: [ "server_configurable_flags", ], } services/surfaceflinger/Scheduler/VSyncPredictor.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,19 @@ nsecs_t VSyncPredictor::currentPeriod() const { return mRateMap.find(idealPeriod())->second.slope; } Period VSyncPredictor::minFramePeriod() const { if (!FlagManager::getInstance().vrr_config()) { return Period::fromNs(currentPeriod()); } std::lock_guard lock(mMutex); const auto idealPeakRefreshPeriod = mDisplayModePtr->getPeakFps().getPeriodNsecs(); const auto numPeriods = static_cast<int>(std::round(static_cast<float>(idealPeakRefreshPeriod) / static_cast<float>(idealPeriod()))); const auto slope = mRateMap.find(idealPeriod())->second.slope; return Period::fromNs(slope * numPeriods); } bool VSyncPredictor::addVsyncTimestamp(nsecs_t timestamp) { std::lock_guard lock(mMutex); Loading services/surfaceflinger/Scheduler/VSyncPredictor.h +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ public: bool addVsyncTimestamp(nsecs_t timestamp) final EXCLUDES(mMutex); nsecs_t nextAnticipatedVSyncTimeFrom(nsecs_t timePoint) const final EXCLUDES(mMutex); nsecs_t currentPeriod() const final EXCLUDES(mMutex); Period minFramePeriod() const final EXCLUDES(mMutex); void resetModel() final EXCLUDES(mMutex); /* Query if the model is in need of more samples to make a prediction. Loading services/surfaceflinger/Scheduler/VSyncTracker.h +5 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,11 @@ public: */ virtual nsecs_t currentPeriod() const = 0; /* * The minimal period frames can be displayed. */ virtual Period minFramePeriod() const = 0; /* Inform the tracker that the samples it has are not accurate for prediction. */ virtual void resetModel() = 0; Loading services/surfaceflinger/Scheduler/VsyncSchedule.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,13 @@ Period VsyncSchedule::period() const { return Period::fromNs(mTracker->currentPeriod()); } Period VsyncSchedule::minFramePeriod() const { if (FlagManager::getInstance().vrr_config()) { return mTracker->minFramePeriod(); } return period(); } TimePoint VsyncSchedule::vsyncDeadlineAfter(TimePoint timePoint) const { return TimePoint::fromNs(mTracker->nextAnticipatedVSyncTimeFrom(timePoint.ns())); } Loading Loading
services/surfaceflinger/Scheduler/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -62,5 +62,9 @@ cc_test { "libgmock", "libgtest", "libscheduler", "libsurfaceflingerflags_test", ], shared_libs: [ "server_configurable_flags", ], }
services/surfaceflinger/Scheduler/VSyncPredictor.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,19 @@ nsecs_t VSyncPredictor::currentPeriod() const { return mRateMap.find(idealPeriod())->second.slope; } Period VSyncPredictor::minFramePeriod() const { if (!FlagManager::getInstance().vrr_config()) { return Period::fromNs(currentPeriod()); } std::lock_guard lock(mMutex); const auto idealPeakRefreshPeriod = mDisplayModePtr->getPeakFps().getPeriodNsecs(); const auto numPeriods = static_cast<int>(std::round(static_cast<float>(idealPeakRefreshPeriod) / static_cast<float>(idealPeriod()))); const auto slope = mRateMap.find(idealPeriod())->second.slope; return Period::fromNs(slope * numPeriods); } bool VSyncPredictor::addVsyncTimestamp(nsecs_t timestamp) { std::lock_guard lock(mMutex); Loading
services/surfaceflinger/Scheduler/VSyncPredictor.h +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ public: bool addVsyncTimestamp(nsecs_t timestamp) final EXCLUDES(mMutex); nsecs_t nextAnticipatedVSyncTimeFrom(nsecs_t timePoint) const final EXCLUDES(mMutex); nsecs_t currentPeriod() const final EXCLUDES(mMutex); Period minFramePeriod() const final EXCLUDES(mMutex); void resetModel() final EXCLUDES(mMutex); /* Query if the model is in need of more samples to make a prediction. Loading
services/surfaceflinger/Scheduler/VSyncTracker.h +5 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,11 @@ public: */ virtual nsecs_t currentPeriod() const = 0; /* * The minimal period frames can be displayed. */ virtual Period minFramePeriod() const = 0; /* Inform the tracker that the samples it has are not accurate for prediction. */ virtual void resetModel() = 0; Loading
services/surfaceflinger/Scheduler/VsyncSchedule.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,13 @@ Period VsyncSchedule::period() const { return Period::fromNs(mTracker->currentPeriod()); } Period VsyncSchedule::minFramePeriod() const { if (FlagManager::getInstance().vrr_config()) { return mTracker->minFramePeriod(); } return period(); } TimePoint VsyncSchedule::vsyncDeadlineAfter(TimePoint timePoint) const { return TimePoint::fromNs(mTracker->nextAnticipatedVSyncTimeFrom(timePoint.ns())); } Loading