Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b59d94a authored by Matt Buckley's avatar Matt Buckley
Browse files

Disable ADPF CPU hints for SF unless active display is on

Currently AOD is bugged and does not always match refresh rate between
SF and HWC, which disrupts ADPF hint sessions in SF which are sensitive
to refresh rate (b/218066882). This patch disables ADPF CPU hints for
the AOD case until this issue is resolved.

Bug: b/240619471
Test: atest libsurfaceflinger_unittest:libsurfaceflinger_unittest.SurfaceFlingerPowerHintTest
Change-Id: I4fa617a108f14da9df278c4a449795363ec29cf3
Merged-In: I4fa617a108f14da9df278c4a449795363ec29cf3
(cherry picked from commit ba8d15a1)
parent 1cf6d7f4
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -2085,7 +2085,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
+24 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ void SurfaceFlingerPowerHintTest::SetUp() {
                    .setNativeWindow(mNativeWindow)
                    .setPowerMode(hal::PowerMode::ON)
                    .inject();
    mFlinger.mutableActiveDisplayToken() = mDisplay->getDisplayToken();
}

void SurfaceFlingerPowerHintTest::setupScheduler() {
@@ -148,5 +149,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