diff options
| -rw-r--r-- | services/surfaceflinger/Scheduler/EventThread.cpp | 6 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/EventThreadTest.cpp | 4 |
2 files changed, 10 insertions, 0 deletions
diff --git a/services/surfaceflinger/Scheduler/EventThread.cpp b/services/surfaceflinger/Scheduler/EventThread.cpp index 5ba8a1b449..cbea77e8fb 100644 --- a/services/surfaceflinger/Scheduler/EventThread.cpp +++ b/services/surfaceflinger/Scheduler/EventThread.cpp @@ -346,6 +346,12 @@ void EventThread::requestNextVsync(const sp<EventThreadConnection>& connection) VsyncEventData EventThread::getLatestVsyncEventData( const sp<EventThreadConnection>& connection) const { + // Resync so that the vsync is accurate with hardware. getLatestVsyncEventData is an alternate + // way to get vsync data (instead of posting callbacks to Choreographer). + if (connection->resyncCallback) { + connection->resyncCallback(); + } + VsyncEventData vsyncEventData; nsecs_t frameInterval = mGetVsyncPeriodFunction(connection->mOwnerUid); vsyncEventData.frameInterval = frameInterval; diff --git a/services/surfaceflinger/tests/unittests/EventThreadTest.cpp b/services/surfaceflinger/tests/unittests/EventThreadTest.cpp index fa36d9c16b..c033af8645 100644 --- a/services/surfaceflinger/tests/unittests/EventThreadTest.cpp +++ b/services/surfaceflinger/tests/unittests/EventThreadTest.cpp @@ -415,6 +415,10 @@ TEST_F(EventThreadTest, getLatestVsyncEventData) { EXPECT_CALL(*mVSyncSource, getLatestVSyncData()).WillOnce(Return(preferredData)); VsyncEventData vsyncEventData = mThread->getLatestVsyncEventData(mConnection); + + // Check EventThread immediately requested a resync. + EXPECT_TRUE(mResyncCallRecorder.waitForCall().has_value()); + EXPECT_GT(vsyncEventData.frameTimelines[0].deadlineTimestamp, now) << "Deadline timestamp should be greater than frame time"; for (size_t i = 0; i < VsyncEventData::kFrameTimelinesLength; i++) { |