Loading services/surfaceflinger/Scheduler/VSyncPredictor.h +7 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,13 @@ public: void setDisplayModePtr(ftl::NonNull<DisplayModePtr>) final EXCLUDES(mMutex); bool isCurrentMode(const ftl::NonNull<DisplayModePtr>& modePtr) const EXCLUDES(mMutex) { std::lock_guard lock(mMutex); return mDisplayModePtr->getId() == modePtr->getId() && mDisplayModePtr->getVsyncRate().getPeriodNsecs() == mRateMap.find(idealPeriod())->second.slope; } void setRenderRate(Fps, bool applyImmediately) final EXCLUDES(mMutex); void onFrameBegin(TimePoint expectedPresentTime, TimePoint lastConfirmedPresentTime) final Loading services/surfaceflinger/Scheduler/VSyncReactor.cpp +1 −2 Original line number Diff line number Diff line Loading @@ -141,8 +141,7 @@ void VSyncReactor::onDisplayModeChanged(ftl::NonNull<DisplayModePtr> modePtr, bo std::lock_guard lock(mMutex); mLastHwVsync.reset(); if (!mSupportKernelIdleTimer && modePtr->getVsyncRate().getPeriodNsecs() == mTracker.currentPeriod() && !force) { if (!mSupportKernelIdleTimer && mTracker.isCurrentMode(modePtr) && !force) { endPeriodTransition(); setIgnorePresentFencesInternal(false); mMoreSamplesNeeded = false; Loading services/surfaceflinger/Scheduler/VSyncTracker.h +5 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,11 @@ public: */ virtual Period minFramePeriod() const = 0; /** * Checks if the sourced mode is equal to the mode in the tracker. */ virtual bool isCurrentMode(const ftl::NonNull<DisplayModePtr>& modePtr) const = 0; /* Inform the tracker that the samples it has are not accurate for prediction. */ virtual void resetModel() = 0; Loading services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ public: void onFrameBegin(TimePoint, TimePoint) final {} void onFrameMissed(TimePoint) final {} void dump(std::string&) const final {} bool isCurrentMode(const ftl::NonNull<DisplayModePtr>&) const final { return false; }; protected: std::mutex mutable mMutex; Loading services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -230,7 +230,8 @@ TEST_F(VSyncReactorTest, setPeriodCalledOnceConfirmedChange) { TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) { nsecs_t sampleTime = 0; nsecs_t const newPeriod = 5000; mReactor.onDisplayModeChanged(displayMode(newPeriod), false); auto modePtr = displayMode(newPeriod); mReactor.onDisplayModeChanged(modePtr, false); bool periodFlushed = true; EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); Loading @@ -238,7 +239,9 @@ TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) { EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); mReactor.onDisplayModeChanged(displayMode(period), false); modePtr = displayMode(period); EXPECT_CALL(*mMockTracker, isCurrentMode(modePtr)).WillOnce(Return(true)); mReactor.onDisplayModeChanged(modePtr, false); EXPECT_FALSE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } Loading Loading
services/surfaceflinger/Scheduler/VSyncPredictor.h +7 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,13 @@ public: void setDisplayModePtr(ftl::NonNull<DisplayModePtr>) final EXCLUDES(mMutex); bool isCurrentMode(const ftl::NonNull<DisplayModePtr>& modePtr) const EXCLUDES(mMutex) { std::lock_guard lock(mMutex); return mDisplayModePtr->getId() == modePtr->getId() && mDisplayModePtr->getVsyncRate().getPeriodNsecs() == mRateMap.find(idealPeriod())->second.slope; } void setRenderRate(Fps, bool applyImmediately) final EXCLUDES(mMutex); void onFrameBegin(TimePoint expectedPresentTime, TimePoint lastConfirmedPresentTime) final Loading
services/surfaceflinger/Scheduler/VSyncReactor.cpp +1 −2 Original line number Diff line number Diff line Loading @@ -141,8 +141,7 @@ void VSyncReactor::onDisplayModeChanged(ftl::NonNull<DisplayModePtr> modePtr, bo std::lock_guard lock(mMutex); mLastHwVsync.reset(); if (!mSupportKernelIdleTimer && modePtr->getVsyncRate().getPeriodNsecs() == mTracker.currentPeriod() && !force) { if (!mSupportKernelIdleTimer && mTracker.isCurrentMode(modePtr) && !force) { endPeriodTransition(); setIgnorePresentFencesInternal(false); mMoreSamplesNeeded = false; Loading
services/surfaceflinger/Scheduler/VSyncTracker.h +5 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,11 @@ public: */ virtual Period minFramePeriod() const = 0; /** * Checks if the sourced mode is equal to the mode in the tracker. */ virtual bool isCurrentMode(const ftl::NonNull<DisplayModePtr>& modePtr) const = 0; /* Inform the tracker that the samples it has are not accurate for prediction. */ virtual void resetModel() = 0; Loading
services/surfaceflinger/tests/unittests/VSyncDispatchRealtimeTest.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ public: void onFrameBegin(TimePoint, TimePoint) final {} void onFrameMissed(TimePoint) final {} void dump(std::string&) const final {} bool isCurrentMode(const ftl::NonNull<DisplayModePtr>&) const final { return false; }; protected: std::mutex mutable mMutex; Loading
services/surfaceflinger/tests/unittests/VSyncReactorTest.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -230,7 +230,8 @@ TEST_F(VSyncReactorTest, setPeriodCalledOnceConfirmedChange) { TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) { nsecs_t sampleTime = 0; nsecs_t const newPeriod = 5000; mReactor.onDisplayModeChanged(displayMode(newPeriod), false); auto modePtr = displayMode(newPeriod); mReactor.onDisplayModeChanged(modePtr, false); bool periodFlushed = true; EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); Loading @@ -238,7 +239,9 @@ TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) { EXPECT_TRUE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); mReactor.onDisplayModeChanged(displayMode(period), false); modePtr = displayMode(period); EXPECT_CALL(*mMockTracker, isCurrentMode(modePtr)).WillOnce(Return(true)); mReactor.onDisplayModeChanged(modePtr, false); EXPECT_FALSE(mReactor.addHwVsyncTimestamp(sampleTime += period, std::nullopt, &periodFlushed)); EXPECT_FALSE(periodFlushed); } Loading