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
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 4f54f17..e06ee38 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -686,23 +686,22 @@
 
         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 @@
 
     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 @@
     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() {
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 7d23c3c..ee47032 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -1416,6 +1416,8 @@
         bool early = false;
     } mPowerHintSessionMode;
 
+    void startPowerHintSession() const;
+
     nsecs_t mAnimationTransactionTimeout = s2ns(5);
 
     friend class SurfaceComposerAIDL;