Loading services/surfaceflinger/SurfaceFlinger.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -2065,7 +2065,11 @@ bool SurfaceFlinger::commit(nsecs_t frameTime, int64_t vsyncId, nsecs_t expected } // Save this once per commit + composite to ensure consistency mPowerHintSessionEnabled = mPowerAdvisor->usePowerHintSession(); // TODO (b/240619471): consider removing active display check once AOD is fixed const auto activeDisplay = FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(mActiveDisplayToken)); mPowerHintSessionEnabled = mPowerAdvisor->usePowerHintSession() && activeDisplay && activeDisplay->getPowerMode() == hal::PowerMode::ON; if (mPowerHintSessionEnabled) { const auto& display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get(); // get stable vsync period from display mode Loading services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,7 @@ void SurfaceFlingerPowerHintTest::SetUp() { .setNativeWindow(mNativeWindow) .setPowerMode(hal::PowerMode::ON) .inject(); mFlinger.mutableActiveDisplayToken() = mDisplay->getDisplayToken(); } void SurfaceFlingerPowerHintTest::setupScheduler() { Loading Loading @@ -150,5 +151,28 @@ TEST_F(SurfaceFlingerPowerHintTest, sendDurationsIncludingHwcWaitTime) { mFlinger.commitAndComposite(now, kVsyncId, now + mockVsyncPeriod.count()); } TEST_F(SurfaceFlingerPowerHintTest, inactiveOnDisplayDoze) { ON_CALL(*mPowerAdvisor, usePowerHintSession()).WillByDefault(Return(true)); mDisplay->setPowerMode(hal::PowerMode::DOZE); const std::chrono::nanoseconds mockVsyncPeriod = 15ms; EXPECT_CALL(*mPowerAdvisor, setTargetWorkDuration(_)).Times(0); const nsecs_t now = systemTime(); const std::chrono::nanoseconds mockHwcRunTime = 20ms; EXPECT_CALL(*mDisplaySurface, prepareFrame(compositionengine::DisplaySurface::CompositionType::Hwc)) .Times(1); EXPECT_CALL(*mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _, _)) .WillOnce([mockHwcRunTime] { std::this_thread::sleep_for(mockHwcRunTime); return hardware::graphics::composer::V2_1::Error::NONE; }); EXPECT_CALL(*mPowerAdvisor, sendActualWorkDuration()).Times(0); static constexpr bool kVsyncId = 123; // arbitrary mFlinger.commitAndComposite(now, kVsyncId, now + mockVsyncPeriod.count()); } } // namespace } // namespace android Loading
services/surfaceflinger/SurfaceFlinger.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -2065,7 +2065,11 @@ bool SurfaceFlinger::commit(nsecs_t frameTime, int64_t vsyncId, nsecs_t expected } // Save this once per commit + composite to ensure consistency mPowerHintSessionEnabled = mPowerAdvisor->usePowerHintSession(); // TODO (b/240619471): consider removing active display check once AOD is fixed const auto activeDisplay = FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(mActiveDisplayToken)); mPowerHintSessionEnabled = mPowerAdvisor->usePowerHintSession() && activeDisplay && activeDisplay->getPowerMode() == hal::PowerMode::ON; if (mPowerHintSessionEnabled) { const auto& display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get(); // get stable vsync period from display mode Loading
services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,7 @@ void SurfaceFlingerPowerHintTest::SetUp() { .setNativeWindow(mNativeWindow) .setPowerMode(hal::PowerMode::ON) .inject(); mFlinger.mutableActiveDisplayToken() = mDisplay->getDisplayToken(); } void SurfaceFlingerPowerHintTest::setupScheduler() { Loading Loading @@ -150,5 +151,28 @@ TEST_F(SurfaceFlingerPowerHintTest, sendDurationsIncludingHwcWaitTime) { mFlinger.commitAndComposite(now, kVsyncId, now + mockVsyncPeriod.count()); } TEST_F(SurfaceFlingerPowerHintTest, inactiveOnDisplayDoze) { ON_CALL(*mPowerAdvisor, usePowerHintSession()).WillByDefault(Return(true)); mDisplay->setPowerMode(hal::PowerMode::DOZE); const std::chrono::nanoseconds mockVsyncPeriod = 15ms; EXPECT_CALL(*mPowerAdvisor, setTargetWorkDuration(_)).Times(0); const nsecs_t now = systemTime(); const std::chrono::nanoseconds mockHwcRunTime = 20ms; EXPECT_CALL(*mDisplaySurface, prepareFrame(compositionengine::DisplaySurface::CompositionType::Hwc)) .Times(1); EXPECT_CALL(*mComposer, presentOrValidateDisplay(HWC_DISPLAY, _, _, _, _, _)) .WillOnce([mockHwcRunTime] { std::this_thread::sleep_for(mockHwcRunTime); return hardware::graphics::composer::V2_1::Error::NONE; }); EXPECT_CALL(*mPowerAdvisor, sendActualWorkDuration()).Times(0); static constexpr bool kVsyncId = 123; // arbitrary mFlinger.commitAndComposite(now, kVsyncId, now + mockVsyncPeriod.count()); } } // namespace } // namespace android