Loading services/surfaceflinger/Scheduler/MessageQueue.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -188,12 +188,13 @@ void MessageQueue::scheduleConfigure() { postMessage(sp<ConfigureHandler>::make(mCompositor)); } void MessageQueue::scheduleFrame() { void MessageQueue::scheduleFrame(Duration workDurationSlack) { SFTRACE_CALL(); std::lock_guard lock(mVsync.mutex); const auto workDuration = Duration(mVsync.workDuration.get() - workDurationSlack); mVsync.scheduledFrameTimeOpt = mVsync.registration->schedule({.workDuration = mVsync.workDuration.get().count(), mVsync.registration->schedule({.workDuration = workDuration.ns(), .readyDuration = 0, .lastVsync = mVsync.lastCallbackTime.ns()}); } Loading services/surfaceflinger/Scheduler/MessageQueue.h +2 −2 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ public: virtual void postMessage(sp<MessageHandler>&&) = 0; virtual void postMessageDelayed(sp<MessageHandler>&&, nsecs_t uptimeDelay) = 0; virtual void scheduleConfigure() = 0; virtual void scheduleFrame() = 0; virtual void scheduleFrame(Duration workDurationSlack = Duration::fromNs(0)) = 0; virtual std::optional<scheduler::ScheduleResult> getScheduledFrameResult() const = 0; }; Loading Loading @@ -149,7 +149,7 @@ public: void postMessageDelayed(sp<MessageHandler>&&, nsecs_t uptimeDelay) override; void scheduleConfigure() override; void scheduleFrame() override; void scheduleFrame(Duration workDurationSlack = Duration::fromNs(0)) override; std::optional<scheduler::ScheduleResult> getScheduledFrameResult() const override; }; Loading services/surfaceflinger/SurfaceFlinger.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -2161,12 +2161,12 @@ sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection( return mScheduler->createDisplayEventConnection(cycle, eventRegistration, layerHandle); } void SurfaceFlinger::scheduleCommit(FrameHint hint) { void SurfaceFlinger::scheduleCommit(FrameHint hint, Duration workDurationSlack) { if (hint == FrameHint::kActive) { mScheduler->resetIdleTimer(); } mPowerAdvisor->notifyDisplayUpdateImminentAndCpuReset(); mScheduler->scheduleFrame(); mScheduler->scheduleFrame(workDurationSlack); } void SurfaceFlinger::scheduleComposite(FrameHint hint) { Loading Loading @@ -2626,7 +2626,10 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, mScheduler->getVsyncSchedule()->getTracker().onFrameMissed( pacesetterFrameTarget.expectedPresentTime()); } scheduleCommit(FrameHint::kNone); const Duration slack = FlagManager::getInstance().allow_n_vsyncs_in_targeter() ? TimePoint::now() - pacesetterFrameTarget.frameBeginTime() : Duration::fromNs(0); scheduleCommit(FrameHint::kNone, slack); return false; } } Loading services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ public: enum class FrameHint { kNone, kActive }; // Schedule commit of transactions on the main thread ahead of the next VSYNC. void scheduleCommit(FrameHint); void scheduleCommit(FrameHint, Duration workDurationSlack = Duration::fromNs(0)); // As above, but also force composite regardless if transactions were committed. void scheduleComposite(FrameHint); // As above, but also force dirty geometry to repaint. Loading services/surfaceflinger/tests/unittests/FrameRateSelectionStrategyTest.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ namespace android { using testing::_; using testing::DoAll; using testing::Mock; using testing::SetArgPointee; Loading Loading @@ -91,7 +92,7 @@ INSTANTIATE_TEST_SUITE_P(PerLayerType, FrameRateSelectionStrategyTest, PrintToStringParamName); TEST_P(FrameRateSelectionStrategyTest, SetAndGet) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading @@ -104,7 +105,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetAndGet) { } TEST_P(FrameRateSelectionStrategyTest, SetChildOverrideChildren) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading @@ -128,7 +129,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetChildOverrideChildren) { } TEST_P(FrameRateSelectionStrategyTest, SetParentOverrideChildren) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading Loading @@ -169,7 +170,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetParentOverrideChildren) { } TEST_P(FrameRateSelectionStrategyTest, OverrideChildrenAndSelf) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading Loading
services/surfaceflinger/Scheduler/MessageQueue.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -188,12 +188,13 @@ void MessageQueue::scheduleConfigure() { postMessage(sp<ConfigureHandler>::make(mCompositor)); } void MessageQueue::scheduleFrame() { void MessageQueue::scheduleFrame(Duration workDurationSlack) { SFTRACE_CALL(); std::lock_guard lock(mVsync.mutex); const auto workDuration = Duration(mVsync.workDuration.get() - workDurationSlack); mVsync.scheduledFrameTimeOpt = mVsync.registration->schedule({.workDuration = mVsync.workDuration.get().count(), mVsync.registration->schedule({.workDuration = workDuration.ns(), .readyDuration = 0, .lastVsync = mVsync.lastCallbackTime.ns()}); } Loading
services/surfaceflinger/Scheduler/MessageQueue.h +2 −2 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ public: virtual void postMessage(sp<MessageHandler>&&) = 0; virtual void postMessageDelayed(sp<MessageHandler>&&, nsecs_t uptimeDelay) = 0; virtual void scheduleConfigure() = 0; virtual void scheduleFrame() = 0; virtual void scheduleFrame(Duration workDurationSlack = Duration::fromNs(0)) = 0; virtual std::optional<scheduler::ScheduleResult> getScheduledFrameResult() const = 0; }; Loading Loading @@ -149,7 +149,7 @@ public: void postMessageDelayed(sp<MessageHandler>&&, nsecs_t uptimeDelay) override; void scheduleConfigure() override; void scheduleFrame() override; void scheduleFrame(Duration workDurationSlack = Duration::fromNs(0)) override; std::optional<scheduler::ScheduleResult> getScheduledFrameResult() const override; }; Loading
services/surfaceflinger/SurfaceFlinger.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -2161,12 +2161,12 @@ sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection( return mScheduler->createDisplayEventConnection(cycle, eventRegistration, layerHandle); } void SurfaceFlinger::scheduleCommit(FrameHint hint) { void SurfaceFlinger::scheduleCommit(FrameHint hint, Duration workDurationSlack) { if (hint == FrameHint::kActive) { mScheduler->resetIdleTimer(); } mPowerAdvisor->notifyDisplayUpdateImminentAndCpuReset(); mScheduler->scheduleFrame(); mScheduler->scheduleFrame(workDurationSlack); } void SurfaceFlinger::scheduleComposite(FrameHint hint) { Loading Loading @@ -2626,7 +2626,10 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, mScheduler->getVsyncSchedule()->getTracker().onFrameMissed( pacesetterFrameTarget.expectedPresentTime()); } scheduleCommit(FrameHint::kNone); const Duration slack = FlagManager::getInstance().allow_n_vsyncs_in_targeter() ? TimePoint::now() - pacesetterFrameTarget.frameBeginTime() : Duration::fromNs(0); scheduleCommit(FrameHint::kNone, slack); return false; } } Loading
services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ public: enum class FrameHint { kNone, kActive }; // Schedule commit of transactions on the main thread ahead of the next VSYNC. void scheduleCommit(FrameHint); void scheduleCommit(FrameHint, Duration workDurationSlack = Duration::fromNs(0)); // As above, but also force composite regardless if transactions were committed. void scheduleComposite(FrameHint); // As above, but also force dirty geometry to repaint. Loading
services/surfaceflinger/tests/unittests/FrameRateSelectionStrategyTest.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ namespace android { using testing::_; using testing::DoAll; using testing::Mock; using testing::SetArgPointee; Loading Loading @@ -91,7 +92,7 @@ INSTANTIATE_TEST_SUITE_P(PerLayerType, FrameRateSelectionStrategyTest, PrintToStringParamName); TEST_P(FrameRateSelectionStrategyTest, SetAndGet) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading @@ -104,7 +105,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetAndGet) { } TEST_P(FrameRateSelectionStrategyTest, SetChildOverrideChildren) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading @@ -128,7 +129,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetChildOverrideChildren) { } TEST_P(FrameRateSelectionStrategyTest, SetParentOverrideChildren) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading Loading @@ -169,7 +170,7 @@ TEST_P(FrameRateSelectionStrategyTest, SetParentOverrideChildren) { } TEST_P(FrameRateSelectionStrategyTest, OverrideChildrenAndSelf) { EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1); EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame(_)).Times(1); const auto& layerFactory = GetParam(); auto layer1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); Loading