Loading services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h +2 −0 Original line number Diff line number Diff line Loading @@ -29,8 +29,10 @@ public: PowerAdvisor(); ~PowerAdvisor() override; MOCK_METHOD0(init, void()); MOCK_METHOD0(onBootFinished, void()); MOCK_METHOD2(setExpensiveRenderingExpected, void(DisplayId displayId, bool expected)); MOCK_METHOD0(isUsingExpensiveRendering, bool()); MOCK_METHOD0(notifyDisplayUpdateImminent, void()); }; Loading services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp +17 −8 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include "../SurfaceFlingerProperties.h" #include "PowerAdvisor.h" #include "SurfaceFlinger.h" namespace android { namespace Hwc2 { Loading Loading @@ -61,14 +62,22 @@ int32_t getUpdateTimeout() { } // namespace PowerAdvisor::PowerAdvisor() : mUseUpdateImminentTimer(getUpdateTimeout() > 0), mUpdateImminentTimer( PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) : mFlinger(flinger), mUseScreenUpdateTimer(getUpdateTimeout() > 0), mScreenUpdateTimer( "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()), /* resetCallback */ [this] { mSendUpdateImminent.store(false); }, /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); }) { if (mUseUpdateImminentTimer) { mUpdateImminentTimer.start(); /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); mFlinger.disableExpensiveRendering(); }) {} void PowerAdvisor::init() { // Defer starting the screen update timer until SurfaceFlinger finishes construction. if (mUseScreenUpdateTimer) { mScreenUpdateTimer.start(); } } Loading Loading @@ -122,8 +131,8 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { } } if (mUseUpdateImminentTimer) { mUpdateImminentTimer.reset(); if (mUseScreenUpdateTimer) { mScreenUpdateTimer.reset(); } } Loading services/surfaceflinger/DisplayHardware/PowerAdvisor.h +12 −3 Original line number Diff line number Diff line Loading @@ -25,14 +25,20 @@ #include "DisplayIdentification.h" namespace android { class SurfaceFlinger; namespace Hwc2 { class PowerAdvisor { public: virtual ~PowerAdvisor(); // Initializes resources that cannot be initialized on construction virtual void init() = 0; virtual void onBootFinished() = 0; virtual void setExpensiveRenderingExpected(DisplayId displayId, bool expected) = 0; virtual bool isUsingExpensiveRendering() = 0; virtual void notifyDisplayUpdateImminent() = 0; }; Loading @@ -50,11 +56,13 @@ public: virtual bool notifyDisplayUpdateImminent() = 0; }; PowerAdvisor(); PowerAdvisor(SurfaceFlinger& flinger); ~PowerAdvisor() override; void init() override; void onBootFinished() override; void setExpensiveRenderingExpected(DisplayId displayId, bool expected) override; bool isUsingExpensiveRendering() override { return mNotifiedExpensiveRendering; } void notifyDisplayUpdateImminent() override; private: Loading @@ -67,9 +75,10 @@ private: std::unordered_set<DisplayId> mExpensiveDisplays; bool mNotifiedExpensiveRendering = false; const bool mUseUpdateImminentTimer; SurfaceFlinger& mFlinger; const bool mUseScreenUpdateTimer; std::atomic_bool mSendUpdateImminent = true; scheduler::OneShotTimer mUpdateImminentTimer; scheduler::OneShotTimer mScreenUpdateTimer; }; } // namespace impl Loading services/surfaceflinger/SurfaceFlinger.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -345,7 +345,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag) mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)), mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()), mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)), mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) { mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)), mPowerAdvisor(*this) { ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str()); mSetInputWindowsListener = new SetInputWindowsListener([&]() { setInputWindowsFinished(); }); Loading Loading @@ -819,6 +820,8 @@ void SurfaceFlinger::init() { // set initial conditions (e.g. unblank default device) initializeDisplays(); mPowerAdvisor.init(); char primeShaderCache[PROPERTY_VALUE_MAX]; property_get("service.sf.prime_shader_cache", primeShaderCache, "1"); if (atoi(primeShaderCache)) { Loading Loading @@ -1276,6 +1279,19 @@ void SurfaceFlinger::performSetActiveMode() { mSetActiveModePending = true; } void SurfaceFlinger::disableExpensiveRendering() { schedule([=]() MAIN_THREAD { ATRACE_CALL(); if (mPowerAdvisor.isUsingExpensiveRendering()) { const auto& displays = ON_MAIN_THREAD(mDisplays); for (const auto& [_, display] : displays) { const static constexpr auto kDisable = false; mPowerAdvisor.setExpensiveRenderingExpected(display->getId(), kDisable); } } }).wait(); } std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(PhysicalDisplayId displayId) { auto modes = getHwComposer().getColorModes(displayId); bool isInternalDisplay = displayId == getInternalDisplayIdLocked(); Loading services/surfaceflinger/SurfaceFlinger.h +4 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,10 @@ public: bool mDisableClientCompositionCache = false; void setInputWindowsFinished(); // Disables expensive rendering for all displays // This is scheduled on the main thread void disableExpensiveRendering(); protected: // We're reference counted, never destroy SurfaceFlinger directly virtual ~SurfaceFlinger(); Loading Loading
services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h +2 −0 Original line number Diff line number Diff line Loading @@ -29,8 +29,10 @@ public: PowerAdvisor(); ~PowerAdvisor() override; MOCK_METHOD0(init, void()); MOCK_METHOD0(onBootFinished, void()); MOCK_METHOD2(setExpensiveRenderingExpected, void(DisplayId displayId, bool expected)); MOCK_METHOD0(isUsingExpensiveRendering, bool()); MOCK_METHOD0(notifyDisplayUpdateImminent, void()); }; Loading
services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp +17 −8 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #include "../SurfaceFlingerProperties.h" #include "PowerAdvisor.h" #include "SurfaceFlinger.h" namespace android { namespace Hwc2 { Loading Loading @@ -61,14 +62,22 @@ int32_t getUpdateTimeout() { } // namespace PowerAdvisor::PowerAdvisor() : mUseUpdateImminentTimer(getUpdateTimeout() > 0), mUpdateImminentTimer( PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) : mFlinger(flinger), mUseScreenUpdateTimer(getUpdateTimeout() > 0), mScreenUpdateTimer( "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()), /* resetCallback */ [this] { mSendUpdateImminent.store(false); }, /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); }) { if (mUseUpdateImminentTimer) { mUpdateImminentTimer.start(); /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); mFlinger.disableExpensiveRendering(); }) {} void PowerAdvisor::init() { // Defer starting the screen update timer until SurfaceFlinger finishes construction. if (mUseScreenUpdateTimer) { mScreenUpdateTimer.start(); } } Loading Loading @@ -122,8 +131,8 @@ void PowerAdvisor::notifyDisplayUpdateImminent() { } } if (mUseUpdateImminentTimer) { mUpdateImminentTimer.reset(); if (mUseScreenUpdateTimer) { mScreenUpdateTimer.reset(); } } Loading
services/surfaceflinger/DisplayHardware/PowerAdvisor.h +12 −3 Original line number Diff line number Diff line Loading @@ -25,14 +25,20 @@ #include "DisplayIdentification.h" namespace android { class SurfaceFlinger; namespace Hwc2 { class PowerAdvisor { public: virtual ~PowerAdvisor(); // Initializes resources that cannot be initialized on construction virtual void init() = 0; virtual void onBootFinished() = 0; virtual void setExpensiveRenderingExpected(DisplayId displayId, bool expected) = 0; virtual bool isUsingExpensiveRendering() = 0; virtual void notifyDisplayUpdateImminent() = 0; }; Loading @@ -50,11 +56,13 @@ public: virtual bool notifyDisplayUpdateImminent() = 0; }; PowerAdvisor(); PowerAdvisor(SurfaceFlinger& flinger); ~PowerAdvisor() override; void init() override; void onBootFinished() override; void setExpensiveRenderingExpected(DisplayId displayId, bool expected) override; bool isUsingExpensiveRendering() override { return mNotifiedExpensiveRendering; } void notifyDisplayUpdateImminent() override; private: Loading @@ -67,9 +75,10 @@ private: std::unordered_set<DisplayId> mExpensiveDisplays; bool mNotifiedExpensiveRendering = false; const bool mUseUpdateImminentTimer; SurfaceFlinger& mFlinger; const bool mUseScreenUpdateTimer; std::atomic_bool mSendUpdateImminent = true; scheduler::OneShotTimer mUpdateImminentTimer; scheduler::OneShotTimer mScreenUpdateTimer; }; } // namespace impl Loading
services/surfaceflinger/SurfaceFlinger.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -345,7 +345,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag) mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)), mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()), mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)), mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) { mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)), mPowerAdvisor(*this) { ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str()); mSetInputWindowsListener = new SetInputWindowsListener([&]() { setInputWindowsFinished(); }); Loading Loading @@ -819,6 +820,8 @@ void SurfaceFlinger::init() { // set initial conditions (e.g. unblank default device) initializeDisplays(); mPowerAdvisor.init(); char primeShaderCache[PROPERTY_VALUE_MAX]; property_get("service.sf.prime_shader_cache", primeShaderCache, "1"); if (atoi(primeShaderCache)) { Loading Loading @@ -1276,6 +1279,19 @@ void SurfaceFlinger::performSetActiveMode() { mSetActiveModePending = true; } void SurfaceFlinger::disableExpensiveRendering() { schedule([=]() MAIN_THREAD { ATRACE_CALL(); if (mPowerAdvisor.isUsingExpensiveRendering()) { const auto& displays = ON_MAIN_THREAD(mDisplays); for (const auto& [_, display] : displays) { const static constexpr auto kDisable = false; mPowerAdvisor.setExpensiveRenderingExpected(display->getId(), kDisable); } } }).wait(); } std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(PhysicalDisplayId displayId) { auto modes = getHwComposer().getColorModes(displayId); bool isInternalDisplay = displayId == getInternalDisplayIdLocked(); Loading
services/surfaceflinger/SurfaceFlinger.h +4 −0 Original line number Diff line number Diff line Loading @@ -331,6 +331,10 @@ public: bool mDisableClientCompositionCache = false; void setInputWindowsFinished(); // Disables expensive rendering for all displays // This is scheduled on the main thread void disableExpensiveRendering(); protected: // We're reference counted, never destroy SurfaceFlinger directly virtual ~SurfaceFlinger(); Loading