diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index f223137241d15..6f549dcb5a976 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -194,6 +194,8 @@ void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { ATRACE_CALL(); if (window) { + // Ensure the hint session is running here, away from any critical paths + mHintSessionWrapper.init(); mNativeSurface = std::make_unique(window); mNativeSurface->init(); if (enableTimeout) { diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp index dece548e9dc19..8c9f65fac10c4 100644 --- a/libs/hwui/renderthread/HintSessionWrapper.cpp +++ b/libs/hwui/renderthread/HintSessionWrapper.cpp @@ -95,17 +95,13 @@ HintSessionWrapper::~HintSessionWrapper() { } } -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 @@ bool HintSessionWrapper::init() { } 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::updateTargetWorkDuration(long targetWorkDurationNanos) } 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::reportActualWorkDuration(long actualDurationNanos) { } void HintSessionWrapper::sendLoadResetHint() { - if (!useHintSession()) return; + if (mHintSession == nullptr) return; nsecs_t now = systemTime(); if (now - mLastFrameNotification > kResetHintTimeout) { gAPH_sendHintFn(mHintSession, static_cast(SessionHint::CPU_LOAD_RESET)); @@ -159,7 +155,7 @@ void HintSessionWrapper::sendLoadResetHint() { } void HintSessionWrapper::sendLoadIncreaseHint() { - if (!useHintSession()) return; + if (mHintSession == nullptr) return; gAPH_sendHintFn(mHintSession, static_cast(SessionHint::CPU_LOAD_UP)); } diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h index c0f7a57bed754..f2f1298c1eec7 100644 --- a/libs/hwui/renderthread/HintSessionWrapper.h +++ b/libs/hwui/renderthread/HintSessionWrapper.h @@ -34,10 +34,9 @@ public: void reportActualWorkDuration(long actualDurationNanos); void sendLoadResetHint(); void sendLoadIncreaseHint(); + bool init(); private: - bool useHintSession(); - bool init(); APerformanceHintSession* mHintSession = nullptr; nsecs_t mLastFrameNotification = 0;