SF: ignore very close vsync timestamps
Check for very close vsync timestamps and mark those
as invalid.
Test: SF unit tests
Bug: 190331974
Change-Id: I13ccc09d6a07847fdfc60242a1a65246fa9674ac
diff --git a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
index 329e4a0..e9bd92a 100644
--- a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
@@ -69,7 +69,21 @@
auto const aValidTimestamp = mTimestamps[mLastTimestampIndex];
auto const percent = (timestamp - aValidTimestamp) % mIdealPeriod * kMaxPercent / mIdealPeriod;
- return percent < kOutlierTolerancePercent || percent > (kMaxPercent - kOutlierTolerancePercent);
+ if (percent >= kOutlierTolerancePercent &&
+ percent <= (kMaxPercent - kOutlierTolerancePercent)) {
+ return false;
+ }
+
+ const auto iter = std::min_element(mTimestamps.begin(), mTimestamps.end(),
+ [timestamp](nsecs_t a, nsecs_t b) {
+ return std::abs(timestamp - a) < std::abs(timestamp - b);
+ });
+ const auto distancePercent = std::abs(*iter - timestamp) * kMaxPercent / mIdealPeriod;
+ if (distancePercent < kOutlierTolerancePercent) {
+ // duplicate timestamp
+ return false;
+ }
+ return true;
}
nsecs_t VSyncPredictor::currentPeriod() const {