Loading services/surfaceflinger/Scheduler/VsyncSchedule.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define ATRACE_TAG ATRACE_TAG_GRAPHICS #include <ftl/fake_guard.h> #include <gui/TraceUtils.h> #include <scheduler/Fps.h> #include <scheduler/Timer.h> Loading Loading @@ -144,6 +145,14 @@ void VsyncSchedule::startPeriodTransition(Period period, bool force) { } bool VsyncSchedule::addResyncSample(TimePoint timestamp, ftl::Optional<Period> hwcVsyncPeriod) { ATRACE_CALL(); if (mClearTimestampsOnNextSample) { ATRACE_FORMAT("clearing sample after HW vsync enabled", __func__); getTracker().resetModel(); mClearTimestampsOnNextSample = false; } bool needsHwVsync = false; bool periodFlushed = false; { Loading @@ -170,7 +179,7 @@ void VsyncSchedule::enableHardwareVsync() { void VsyncSchedule::enableHardwareVsyncLocked() { if (mHwVsyncState == HwVsyncState::Disabled) { getTracker().resetModel(); mClearTimestampsOnNextSample = true; mRequestHardwareVsync(mId, true); mHwVsyncState = HwVsyncState::Enabled; } Loading services/surfaceflinger/Scheduler/VsyncSchedule.h +5 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,11 @@ private: // device is off. HwVsyncState mPendingHwVsyncState GUARDED_BY(kMainThreadContext) = HwVsyncState::Disabled; // Whether to reset the timestamps stored in the vsync model on the next hw vsync sample. This // is to avoid clearing the model when hw vsync is enabled, in order to be consistent with the // stale timestamps. Instead, clear the model on the first hw vsync callback. bool mClearTimestampsOnNextSample = false; class PredictedVsyncTracer; using TracerPtr = std::unique_ptr<PredictedVsyncTracer>; Loading services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp +5 −7 Original line number Diff line number Diff line Loading @@ -91,18 +91,16 @@ struct EventThreadIsSupportedVariant : public EventThreadBaseSupportedVariant { }; struct DispSyncIsSupportedVariant { static void setupResetModelCallExpectations(DisplayTransactionTest* test) { static void setupStartPeriodTransitionCallExpectations(DisplayTransactionTest* test) { auto vsyncSchedule = test->mFlinger.scheduler()->getVsyncSchedule(); EXPECT_CALL(static_cast<mock::VsyncController&>(vsyncSchedule->getController()), startPeriodTransition(DEFAULT_VSYNC_PERIOD, false)) .Times(1); EXPECT_CALL(static_cast<mock::VSyncTracker&>(vsyncSchedule->getTracker()), resetModel()) .Times(1); } }; struct DispSyncNotSupportedVariant { static void setupResetModelCallExpectations(DisplayTransactionTest* /* test */) {} static void setupStartPeriodTransitionCallExpectations(DisplayTransactionTest* /* test */) {} }; // -------------------------------------------------------------------- Loading @@ -125,7 +123,7 @@ struct TransitionOffToOnVariant : public TransitionVariantCommon<PowerMode::OFF, static void setupCallExpectations(DisplayTransactionTest* test) { Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupRepaintEverythingCallExpectations(test); } Loading Loading @@ -186,7 +184,7 @@ struct TransitionDozeSuspendToDozeVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE); } }; Loading @@ -204,7 +202,7 @@ struct TransitionDozeSuspendToOnVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); } }; Loading Loading
services/surfaceflinger/Scheduler/VsyncSchedule.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define ATRACE_TAG ATRACE_TAG_GRAPHICS #include <ftl/fake_guard.h> #include <gui/TraceUtils.h> #include <scheduler/Fps.h> #include <scheduler/Timer.h> Loading Loading @@ -144,6 +145,14 @@ void VsyncSchedule::startPeriodTransition(Period period, bool force) { } bool VsyncSchedule::addResyncSample(TimePoint timestamp, ftl::Optional<Period> hwcVsyncPeriod) { ATRACE_CALL(); if (mClearTimestampsOnNextSample) { ATRACE_FORMAT("clearing sample after HW vsync enabled", __func__); getTracker().resetModel(); mClearTimestampsOnNextSample = false; } bool needsHwVsync = false; bool periodFlushed = false; { Loading @@ -170,7 +179,7 @@ void VsyncSchedule::enableHardwareVsync() { void VsyncSchedule::enableHardwareVsyncLocked() { if (mHwVsyncState == HwVsyncState::Disabled) { getTracker().resetModel(); mClearTimestampsOnNextSample = true; mRequestHardwareVsync(mId, true); mHwVsyncState = HwVsyncState::Enabled; } Loading
services/surfaceflinger/Scheduler/VsyncSchedule.h +5 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,11 @@ private: // device is off. HwVsyncState mPendingHwVsyncState GUARDED_BY(kMainThreadContext) = HwVsyncState::Disabled; // Whether to reset the timestamps stored in the vsync model on the next hw vsync sample. This // is to avoid clearing the model when hw vsync is enabled, in order to be consistent with the // stale timestamps. Instead, clear the model on the first hw vsync callback. bool mClearTimestampsOnNextSample = false; class PredictedVsyncTracer; using TracerPtr = std::unique_ptr<PredictedVsyncTracer>; Loading
services/surfaceflinger/tests/unittests/SurfaceFlinger_SetPowerModeInternalTest.cpp +5 −7 Original line number Diff line number Diff line Loading @@ -91,18 +91,16 @@ struct EventThreadIsSupportedVariant : public EventThreadBaseSupportedVariant { }; struct DispSyncIsSupportedVariant { static void setupResetModelCallExpectations(DisplayTransactionTest* test) { static void setupStartPeriodTransitionCallExpectations(DisplayTransactionTest* test) { auto vsyncSchedule = test->mFlinger.scheduler()->getVsyncSchedule(); EXPECT_CALL(static_cast<mock::VsyncController&>(vsyncSchedule->getController()), startPeriodTransition(DEFAULT_VSYNC_PERIOD, false)) .Times(1); EXPECT_CALL(static_cast<mock::VSyncTracker&>(vsyncSchedule->getTracker()), resetModel()) .Times(1); } }; struct DispSyncNotSupportedVariant { static void setupResetModelCallExpectations(DisplayTransactionTest* /* test */) {} static void setupStartPeriodTransitionCallExpectations(DisplayTransactionTest* /* test */) {} }; // -------------------------------------------------------------------- Loading @@ -125,7 +123,7 @@ struct TransitionOffToOnVariant : public TransitionVariantCommon<PowerMode::OFF, static void setupCallExpectations(DisplayTransactionTest* test) { Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupRepaintEverythingCallExpectations(test); } Loading Loading @@ -186,7 +184,7 @@ struct TransitionDozeSuspendToDozeVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupComposerCallExpectations(test, Case::Doze::ACTUAL_POWER_MODE_FOR_DOZE); } }; Loading @@ -204,7 +202,7 @@ struct TransitionDozeSuspendToOnVariant template <typename Case> static void setupCallExpectations(DisplayTransactionTest* test) { Case::EventThread::setupEnableVsyncCallExpectations(test); Case::DispSync::setupResetModelCallExpectations(test); Case::DispSync::setupStartPeriodTransitionCallExpectations(test); Case::setupComposerCallExpectations(test, IComposerClient::PowerMode::ON); } }; Loading