Move hint session initialization to setSurface

Hint session initialization was previously during draw() which can be
problematic as it's not guaranteed to have unblocked choreographer yet.
This moves it somewhere less problematic, and reports actual work
durations in a separate renderthread callback to ensure these binders
don't block the critical path more than necessary.

Bug: 263755904
Test: manual
Change-Id: Icd7e1fcd84cd3f493bea34d1b48d14444d2f5b68
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index f223137..6f549dc 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -194,6 +194,8 @@
     ATRACE_CALL();
 
     if (window) {
+        // Ensure the hint session is running here, away from any critical paths
+        mHintSessionWrapper.init();
         mNativeSurface = std::make_unique<ReliableSurface>(window);
         mNativeSurface->init();
         if (enableTimeout) {
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index dece548..8c9f65f 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.cpp
+++ b/libs/hwui/renderthread/HintSessionWrapper.cpp
@@ -95,17 +95,13 @@
     }
 }
 
-bool HintSessionWrapper::useHintSession() {
-    if (!Properties::useHintManager || !Properties::isDrawingEnabled()) return false;
-    if (mHintSession) return true;
-    // If session does not exist, create it;
-    // this defers session creation until we try to actually use it.
-    if (!mSessionValid) return false;
-    return init();
-}
-
 bool HintSessionWrapper::init() {
-    if (mUiThreadId < 0 || mRenderThreadId < 0) return false;
+    // If it already exists, broke last time we tried this, shouldn't be running, or
+    // has bad argument values, don't even bother
+    if (mHintSession != nullptr || !mSessionValid || !Properties::useHintManager ||
+        !Properties::isDrawingEnabled() || mUiThreadId < 0 || mRenderThreadId < 0) {
+        return false;
+    }
 
     // Assume that if we return before the end, it broke
     mSessionValid = false;
@@ -130,7 +126,7 @@
 }
 
 void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos) {
-    if (!useHintSession()) return;
+    if (mHintSession == nullptr) return;
     targetWorkDurationNanos = targetWorkDurationNanos * Properties::targetCpuTimePercentage / 100;
     if (targetWorkDurationNanos != mLastTargetWorkDuration &&
         targetWorkDurationNanos > kSanityCheckLowerBound &&
@@ -142,7 +138,7 @@
 }
 
 void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
-    if (!useHintSession()) return;
+    if (mHintSession == nullptr) return;
     if (actualDurationNanos > kSanityCheckLowerBound &&
         actualDurationNanos < kSanityCheckUpperBound) {
         gAPH_reportActualWorkDurationFn(mHintSession, actualDurationNanos);
@@ -150,7 +146,7 @@
 }
 
 void HintSessionWrapper::sendLoadResetHint() {
-    if (!useHintSession()) return;
+    if (mHintSession == nullptr) return;
     nsecs_t now = systemTime();
     if (now - mLastFrameNotification > kResetHintTimeout) {
         gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_RESET));
@@ -159,7 +155,7 @@
 }
 
 void HintSessionWrapper::sendLoadIncreaseHint() {
-    if (!useHintSession()) return;
+    if (mHintSession == nullptr) return;
     gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_UP));
 }
 
diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h
index c0f7a57..f2f1298 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.h
+++ b/libs/hwui/renderthread/HintSessionWrapper.h
@@ -34,10 +34,9 @@
     void reportActualWorkDuration(long actualDurationNanos);
     void sendLoadResetHint();
     void sendLoadIncreaseHint();
+    bool init();
 
 private:
-    bool useHintSession();
-    bool init();
     APerformanceHintSession* mHintSession = nullptr;
 
     nsecs_t mLastFrameNotification = 0;