diff options
author | Kevin DuBois <kevindubois@google.com> | 2020-06-30 19:26:25 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-06-30 19:26:25 +0000 |
commit | 58bf1b3535fd88f7d8783893f2827aa6404ee02b (patch) | |
tree | 8a9897c09016f3c307574bbd251dd282a1f7a35b | |
parent | 22615145ca07a161a14f16c99cb8ffb2600e0826 (diff) | |
parent | 9b2526e50d375d60e5a6a43992649d9bb25c176a (diff) | |
download | native-58bf1b3535fd88f7d8783893f2827aa6404ee02b.tar.gz |
Merge "SF: update VSP timebase on error condition" into rvc-dev am: 9b2526e50d
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/12014614
Change-Id: Ib53447f0ed40505b743b7a107bbb1f54b0c63370
-rw-r--r-- | services/surfaceflinger/Scheduler/VSyncPredictor.cpp | 17 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/VSyncPredictorTest.cpp | 32 |
2 files changed, 47 insertions, 2 deletions
diff --git a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp index a3cb7725a7..ab5773dc09 100644 --- a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp +++ b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp @@ -77,7 +77,14 @@ bool VSyncPredictor::addVsyncTimestamp(nsecs_t timestamp) { std::lock_guard<std::mutex> lk(mMutex); if (!validate(timestamp)) { - ALOGV("timestamp was too far off the last known timestamp"); + // VSR could elect to ignore the incongruent timestamp or resetModel(). If ts is ignored, + // don't insert this ts into mTimestamps ringbuffer. + if (!mTimestamps.empty()) { + mKnownTimestamp = + std::max(timestamp, *std::max_element(mTimestamps.begin(), mTimestamps.end())); + } else { + mKnownTimestamp = timestamp; + } return false; } @@ -236,7 +243,13 @@ void VSyncPredictor::setPeriod(nsecs_t period) { void VSyncPredictor::clearTimestamps() { if (!mTimestamps.empty()) { - mKnownTimestamp = *std::max_element(mTimestamps.begin(), mTimestamps.end()); + auto const maxRb = *std::max_element(mTimestamps.begin(), mTimestamps.end()); + if (mKnownTimestamp) { + mKnownTimestamp = std::max(*mKnownTimestamp, maxRb); + } else { + mKnownTimestamp = maxRb; + } + mTimestamps.clear(); mLastTimestampIndex = 0; } diff --git a/services/surfaceflinger/tests/unittests/VSyncPredictorTest.cpp b/services/surfaceflinger/tests/unittests/VSyncPredictorTest.cpp index bf2a889c89..fc39235a93 100644 --- a/services/surfaceflinger/tests/unittests/VSyncPredictorTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncPredictorTest.cpp @@ -124,6 +124,38 @@ TEST_F(VSyncPredictorTest, uponNotifiedOfInaccuracyUsesSynthetic) { EXPECT_THAT(tracker.nextAnticipatedVSyncTimeFrom(mNow), Eq(mNow + changedPeriod)); } +// b/159882858 +TEST_F(VSyncPredictorTest, updatesTimebaseForSyntheticAfterIdleTime) { + for (auto i = 0u; i < kMinimumSamplesForPrediction; i++) { + EXPECT_TRUE(tracker.addVsyncTimestamp(mNow += mPeriod)); + } + + EXPECT_THAT(tracker.nextAnticipatedVSyncTimeFrom(mNow), Eq(mNow + mPeriod)); + + auto const halfPeriod = mPeriod >> 2; + nsecs_t relativelyLongGapWithDrift = mPeriod * 100 + halfPeriod; + + EXPECT_FALSE(tracker.addVsyncTimestamp(mNow += relativelyLongGapWithDrift)); + + tracker.resetModel(); + EXPECT_THAT(tracker.nextAnticipatedVSyncTimeFrom(mNow), Eq(mNow + mPeriod)); +} + +TEST_F(VSyncPredictorTest, uponBadVsyncWillSwitchToSyntheticWhileRecalibrating) { + auto const slightlyMorePeriod = mPeriod + 10; + for (auto i = 0u; i < kMinimumSamplesForPrediction; i++) { + EXPECT_TRUE(tracker.addVsyncTimestamp(mNow += slightlyMorePeriod)); + } + + EXPECT_THAT(tracker.nextAnticipatedVSyncTimeFrom(mNow), Eq(mNow + slightlyMorePeriod)); + + auto const halfPeriod = mPeriod >> 2; + EXPECT_FALSE(tracker.addVsyncTimestamp(mNow += halfPeriod)); + + tracker.resetModel(); + EXPECT_THAT(tracker.nextAnticipatedVSyncTimeFrom(mNow), Eq(mNow + mPeriod)); +} + TEST_F(VSyncPredictorTest, adaptsToFenceTimelines_60hzHighVariance) { // these are precomputed simulated 16.6s vsyncs with uniform distribution +/- 1.6ms error std::vector<nsecs_t> const simulatedVsyncs{ |