Loading services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp +35 −16 Original line number Original line Diff line number Diff line Loading @@ -80,22 +80,33 @@ void traceExpensiveRendering(bool enabled) { } // namespace } // namespace PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) : mFlinger(flinger) { : mFlinger(flinger), if (getUpdateTimeout()) { mUseScreenUpdateTimer(getUpdateTimeout() > 0), mScreenUpdateTimer.emplace("UpdateImminentTimer", mScreenUpdateTimer( OneShotTimer::Interval(getUpdateTimeout()), "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()), /* resetCallback */ nullptr, /* resetCallback */ [this] { mSendUpdateImminent.store(false); }, /* timeoutCallback */ /* timeoutCallback */ [this] { [this] { const nsecs_t timeSinceLastUpdate = systemTime() - mLastScreenUpdatedTime.load(); if (timeSinceLastUpdate < getUpdateTimeout()) { // We may try to disable expensive rendering and allow // for sending DISPLAY_UPDATE_IMMINENT hints too early if // we idled very shortly after updating the screen, so // make sure we wait enough time. std::this_thread::sleep_for(std::chrono::nanoseconds( getUpdateTimeout() - timeSinceLastUpdate)); } mSendUpdateImminent.store(true); mSendUpdateImminent.store(true); mFlinger.disableExpensiveRendering(); mFlinger.disableExpensiveRendering(); }) {} }); } } void PowerAdvisor::init() { void PowerAdvisor::init() { // Defer starting the screen update timer until SurfaceFlinger finishes construction. // Defer starting the screen update timer until SurfaceFlinger finishes construction. if (mUseScreenUpdateTimer) { if (mScreenUpdateTimer) { mScreenUpdateTimer.start(); mScreenUpdateTimer->start(); } } } } Loading Loading @@ -135,7 +146,7 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { return; return; } } if (mSendUpdateImminent.load()) { if (mSendUpdateImminent.exchange(false)) { std::lock_guard lock(mPowerHalMutex); std::lock_guard lock(mPowerHalMutex); HalWrapper* const halWrapper = getPowerHal(); HalWrapper* const halWrapper = getPowerHal(); if (halWrapper == nullptr) { if (halWrapper == nullptr) { Loading @@ -147,10 +158,18 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { mReconnectPowerHal = true; mReconnectPowerHal = true; return; return; } } if (mScreenUpdateTimer) { mScreenUpdateTimer->reset(); } else { // If we don't have a screen update timer, then we don't throttle power hal calls so // flip this bit back to allow for calling into power hal again. mSendUpdateImminent.store(true); } } } if (mUseScreenUpdateTimer) { if (mScreenUpdateTimer) { mScreenUpdateTimer.reset(); mLastScreenUpdatedTime.store(systemTime()); } } } } Loading services/surfaceflinger/DisplayHardware/PowerAdvisor.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -160,9 +160,9 @@ private: bool mNotifiedExpensiveRendering = false; bool mNotifiedExpensiveRendering = false; SurfaceFlinger& mFlinger; SurfaceFlinger& mFlinger; const bool mUseScreenUpdateTimer; std::atomic_bool mSendUpdateImminent = true; std::atomic_bool mSendUpdateImminent = true; scheduler::OneShotTimer mScreenUpdateTimer; std::atomic<nsecs_t> mLastScreenUpdatedTime = 0; std::optional<scheduler::OneShotTimer> mScreenUpdateTimer; // Higher-level timing data used for estimation // Higher-level timing data used for estimation struct DisplayTimeline { struct DisplayTimeline { Loading Loading
services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp +35 −16 Original line number Original line Diff line number Diff line Loading @@ -80,22 +80,33 @@ void traceExpensiveRendering(bool enabled) { } // namespace } // namespace PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) : mFlinger(flinger) { : mFlinger(flinger), if (getUpdateTimeout()) { mUseScreenUpdateTimer(getUpdateTimeout() > 0), mScreenUpdateTimer.emplace("UpdateImminentTimer", mScreenUpdateTimer( OneShotTimer::Interval(getUpdateTimeout()), "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()), /* resetCallback */ nullptr, /* resetCallback */ [this] { mSendUpdateImminent.store(false); }, /* timeoutCallback */ /* timeoutCallback */ [this] { [this] { const nsecs_t timeSinceLastUpdate = systemTime() - mLastScreenUpdatedTime.load(); if (timeSinceLastUpdate < getUpdateTimeout()) { // We may try to disable expensive rendering and allow // for sending DISPLAY_UPDATE_IMMINENT hints too early if // we idled very shortly after updating the screen, so // make sure we wait enough time. std::this_thread::sleep_for(std::chrono::nanoseconds( getUpdateTimeout() - timeSinceLastUpdate)); } mSendUpdateImminent.store(true); mSendUpdateImminent.store(true); mFlinger.disableExpensiveRendering(); mFlinger.disableExpensiveRendering(); }) {} }); } } void PowerAdvisor::init() { void PowerAdvisor::init() { // Defer starting the screen update timer until SurfaceFlinger finishes construction. // Defer starting the screen update timer until SurfaceFlinger finishes construction. if (mUseScreenUpdateTimer) { if (mScreenUpdateTimer) { mScreenUpdateTimer.start(); mScreenUpdateTimer->start(); } } } } Loading Loading @@ -135,7 +146,7 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { return; return; } } if (mSendUpdateImminent.load()) { if (mSendUpdateImminent.exchange(false)) { std::lock_guard lock(mPowerHalMutex); std::lock_guard lock(mPowerHalMutex); HalWrapper* const halWrapper = getPowerHal(); HalWrapper* const halWrapper = getPowerHal(); if (halWrapper == nullptr) { if (halWrapper == nullptr) { Loading @@ -147,10 +158,18 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { mReconnectPowerHal = true; mReconnectPowerHal = true; return; return; } } if (mScreenUpdateTimer) { mScreenUpdateTimer->reset(); } else { // If we don't have a screen update timer, then we don't throttle power hal calls so // flip this bit back to allow for calling into power hal again. mSendUpdateImminent.store(true); } } } if (mUseScreenUpdateTimer) { if (mScreenUpdateTimer) { mScreenUpdateTimer.reset(); mLastScreenUpdatedTime.store(systemTime()); } } } } Loading
services/surfaceflinger/DisplayHardware/PowerAdvisor.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -160,9 +160,9 @@ private: bool mNotifiedExpensiveRendering = false; bool mNotifiedExpensiveRendering = false; SurfaceFlinger& mFlinger; SurfaceFlinger& mFlinger; const bool mUseScreenUpdateTimer; std::atomic_bool mSendUpdateImminent = true; std::atomic_bool mSendUpdateImminent = true; scheduler::OneShotTimer mScreenUpdateTimer; std::atomic<nsecs_t> mLastScreenUpdatedTime = 0; std::optional<scheduler::OneShotTimer> mScreenUpdateTimer; // Higher-level timing data used for estimation // Higher-level timing data used for estimation struct DisplayTimeline { struct DisplayTimeline { Loading