diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/VSyncReactor.cpp | 19 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/VSyncReactor.h | 6 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp | 21 |
3 files changed, 45 insertions, 1 deletions
diff --git a/services/surfaceflinger/Scheduler/VSyncReactor.cpp b/services/surfaceflinger/Scheduler/VSyncReactor.cpp index 6588d1b9ad..f2a7791ada 100644 --- a/services/surfaceflinger/Scheduler/VSyncReactor.cpp +++ b/services/surfaceflinger/Scheduler/VSyncReactor.cpp @@ -89,10 +89,29 @@ nsecs_t VSyncReactor::expectedPresentTime() { void VSyncReactor::setPeriod(nsecs_t period) { mTracker->setPeriod(period); + { + std::lock_guard<std::mutex> lk(mMutex); + mPeriodChangeInProgress = true; + } } nsecs_t VSyncReactor::getPeriod() { return mTracker->currentPeriod(); } +void VSyncReactor::beginResync() {} + +void VSyncReactor::endResync() {} + +bool VSyncReactor::addResyncSample(nsecs_t timestamp, bool* periodFlushed) { + assert(periodFlushed); + mTracker->addVsyncTimestamp(timestamp); + { + std::lock_guard<std::mutex> lk(mMutex); + *periodFlushed = mPeriodChangeInProgress; + mPeriodChangeInProgress = false; + } + return false; +} + } // namespace android::scheduler diff --git a/services/surfaceflinger/Scheduler/VSyncReactor.h b/services/surfaceflinger/Scheduler/VSyncReactor.h index 73a09f1cb7..786ee98cca 100644 --- a/services/surfaceflinger/Scheduler/VSyncReactor.h +++ b/services/surfaceflinger/Scheduler/VSyncReactor.h @@ -43,6 +43,11 @@ public: void setPeriod(nsecs_t period); nsecs_t getPeriod(); + // TODO: (b/145626181) remove begin,endResync functions from DispSync i/f when possible. + void beginResync(); + bool addResyncSample(nsecs_t timestamp, bool* periodFlushed); + void endResync(); + private: std::unique_ptr<Clock> const mClock; std::unique_ptr<VSyncDispatch> const mDispatch; @@ -52,6 +57,7 @@ private: std::mutex mMutex; bool mIgnorePresentFences GUARDED_BY(mMutex) = false; std::vector<std::shared_ptr<FenceTime>> mUnfiredFences GUARDED_BY(mMutex); + bool mPeriodChangeInProgress GUARDED_BY(mMutex) = false; }; } // namespace android::scheduler diff --git a/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp b/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp index 2e01d5c598..84df019d53 100644 --- a/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp @@ -126,7 +126,7 @@ class VSyncReactorTest : public testing::Test { protected: VSyncReactorTest() : mMockDispatch(std::make_shared<MockVSyncDispatch>()), - mMockTracker(std::make_shared<MockVSyncTracker>()), + mMockTracker(std::make_shared<NiceMock<MockVSyncTracker>>()), mMockClock(std::make_shared<NiceMock<MockClock>>()), mReactor(std::make_unique<ClockWrapper>(mMockClock), std::make_unique<VSyncDispatchWrapper>(mMockDispatch), @@ -248,4 +248,23 @@ TEST_F(VSyncReactorTest, setPeriod) { mReactor.setPeriod(fakePeriod); } +TEST_F(VSyncReactorTest, addResyncSampleTypical) { + nsecs_t const fakeTimestamp = 3032; + bool periodFlushed = false; + + EXPECT_CALL(*mMockTracker, addVsyncTimestamp(fakeTimestamp)); + EXPECT_FALSE(mReactor.addResyncSample(fakeTimestamp, &periodFlushed)); + EXPECT_FALSE(periodFlushed); +} + +TEST_F(VSyncReactorTest, addResyncSamplePeriodChanges) { + bool periodFlushed = false; + nsecs_t const fakeTimestamp = 4398; + nsecs_t const newPeriod = 3490; + EXPECT_CALL(*mMockTracker, addVsyncTimestamp(fakeTimestamp)); + mReactor.setPeriod(newPeriod); + EXPECT_FALSE(mReactor.addResyncSample(fakeTimestamp, &periodFlushed)); + EXPECT_TRUE(periodFlushed); +} + } // namespace android::scheduler |