summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Matt Buckley <mattbuckley@google.com> 2023-01-19 03:04:19 +0000
committer Matt Buckley <mattbuckley@google.com> 2023-01-21 02:41:29 +0000
commit124d0c675a3c0d4fcd48e5af8463b8b938b09080 (patch)
treefc4ee00fbd4658786176d3f87b1130fa2cf3c43f
parent0f5c1d95934a717e1ae00af5a419c60804db09ab (diff)
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
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp2
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.cpp24
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.h3
3 files changed, 13 insertions, 16 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index f223137241d1..6f549dcb5a97 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<ReliableSurface>(window);
mNativeSurface->init();
if (enableTimeout) {
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index dece548e9dc1..8c9f65fac10c 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<int>(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<int>(SessionHint::CPU_LOAD_UP));
}
diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h
index c0f7a57bed75..f2f1298c1eec 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;