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

Commit e3a54706 authored by Matt Buckley's avatar Matt Buckley
Browse files

Check for adpf cpu hints for SurfaceFlinger during init

Currently adpf hints for SurfaceFlinger only checks when boot finishes,
but now that it can be enabled via sysprop it's also necessary to check
during SF initialization. This patch lets SurfaceFlinger start the
session during init, and then if it becomes enabled later it will start
the session after boot instead.

Bug: b/239477143
Bug: b/195990840

Test: manual
Change-Id: Ifdbe177ab4097277a3f238653723c153f29e5b99
parent 883349a8
Loading
Loading
Loading
Loading
+30 −14
Original line number Diff line number Diff line
@@ -686,23 +686,22 @@ void SurfaceFlinger::bootFinished() {

        readPersistentProperties();
        mPowerAdvisor->onBootFinished();
        const bool powerHintEnabled = mFlagManager.use_adpf_cpu_hint();
        mPowerAdvisor->enablePowerHint(powerHintEnabled);
        const bool powerHintUsed = mPowerAdvisor->usePowerHintSession();
        ALOGD("Power hint is %s",
              powerHintUsed ? "supported" : (powerHintEnabled ? "unsupported" : "disabled"));
        if (powerHintUsed) {
            std::optional<pid_t> renderEngineTid = getRenderEngine().getRenderEngineTid();
            std::vector<int32_t> tidList;
            tidList.emplace_back(gettid());
            if (renderEngineTid.has_value()) {
                tidList.emplace_back(*renderEngineTid);
            }
            if (!mPowerAdvisor->startPowerHintSession(tidList)) {
                ALOGW("Cannot start power hint session");

        // try to enable power hint session again using mendel flag now that boot is finished,
        // but only if we didn't already try earlier
        if (!mPowerAdvisor->usePowerHintSession() && mFlagManager.use_adpf_cpu_hint()) {
            mPowerAdvisor->enablePowerHint(true);
            // check again to make sure it's actually supported
            if (mPowerAdvisor->usePowerHintSession()) {
                startPowerHintSession();
            }
        }

        ALOGD("Power hint session is %s",
              mPowerAdvisor->usePowerHintSession()
                      ? "enabled"
                      : (!mPowerAdvisor->supportsPowerHintSession() ? "unsupported" : "disabled"));

        mBootStage = BootStage::FINISHED;

        if (property_get_bool("sf.debug.show_refresh_rate_overlay", false)) {
@@ -826,6 +825,11 @@ void SurfaceFlinger::init() {

    mPowerAdvisor->init();

    mPowerAdvisor->enablePowerHint(mFlagManager.use_adpf_cpu_hint());
    if (mPowerAdvisor->usePowerHintSession()) {
        startPowerHintSession();
    }

    char primeShaderCache[PROPERTY_VALUE_MAX];
    property_get("service.sf.prime_shader_cache", primeShaderCache, "1");
    if (atoi(primeShaderCache)) {
@@ -7218,6 +7222,18 @@ bool SurfaceFlinger::commitCreatedLayers(int64_t vsyncId) {
    return true;
}

void SurfaceFlinger::startPowerHintSession() const {
    std::optional<pid_t> renderEngineTid = getRenderEngine().getRenderEngineTid();
    std::vector<int32_t> tidList;
    tidList.emplace_back(gettid());
    if (renderEngineTid.has_value()) {
        tidList.emplace_back(*renderEngineTid);
    }
    if (!mPowerAdvisor->startPowerHintSession(tidList)) {
        ALOGW("Cannot start power hint session");
    }
}

// gui::ISurfaceComposer

binder::Status SurfaceComposerAIDL::bootFinished() {
+2 −0
Original line number Diff line number Diff line
@@ -1416,6 +1416,8 @@ private:
        bool early = false;
    } mPowerHintSessionMode;

    void startPowerHintSession() const;

    nsecs_t mAnimationTransactionTimeout = s2ns(5);

    friend class SurfaceComposerAIDL;