summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Matt Buckley <mattbuckley@google.com> 2023-03-30 20:58:22 +0000
committer Matt Buckley <mattbuckley@google.com> 2023-05-03 17:34:47 +0000
commit191f5cc501c2983196aa0a68a04dcb7f07898e0e (patch)
tree7516d544019dd638b102ef7fbb47dd66e73b0a6c
parent9b65137e97e150436f236c493a993ee2753f36bc (diff)
Create hint session asynchronously
Sends createHintSession asynchronously inside worker thread Consistency is maintained by returning the session with a std::future which we only check when we try to do hint session operations within renderthread, to avoid races or mutexes necessary with a callback fn. Bug: 272002264 Test: manual Change-Id: I9b64f20f1abdac91993742b9f9aea7824288fdd3
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.cpp41
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.h3
2 files changed, 32 insertions, 12 deletions
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index 8c9f65fac10c..597cbf732d82 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.cpp
+++ b/libs/hwui/renderthread/HintSessionWrapper.cpp
@@ -20,11 +20,14 @@
#include <private/performance_hint_private.h>
#include <utils/Log.h>
+#include <chrono>
#include <vector>
#include "../Properties.h"
#include "thread/CommonPool.h"
+using namespace std::chrono_literals;
+
namespace android {
namespace uirenderer {
namespace renderthread {
@@ -96,10 +99,25 @@ HintSessionWrapper::~HintSessionWrapper() {
}
bool HintSessionWrapper::init() {
- // If it already exists, broke last time we tried this, shouldn't be running, or
+ if (mHintSession != nullptr) return true;
+
+ // If we're waiting for the session
+ if (mHintSessionFuture.valid()) {
+ // If the session is here
+ if (mHintSessionFuture.wait_for(0s) == std::future_status::ready) {
+ mHintSession = mHintSessionFuture.get();
+ if (mHintSession != nullptr) {
+ mSessionValid = true;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // If it 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) {
+ if (!mSessionValid || !Properties::useHintManager || !Properties::isDrawingEnabled() ||
+ mUiThreadId < 0 || mRenderThreadId < 0) {
return false;
}
@@ -118,15 +136,14 @@ bool HintSessionWrapper::init() {
// Use a placeholder target value to initialize,
// this will always be replaced elsewhere before it gets used
int64_t defaultTargetDurationNanos = 16666667;
- mHintSession =
- gAPH_createSessionFn(manager, tids.data(), tids.size(), defaultTargetDurationNanos);
-
- mSessionValid = !!mHintSession;
- return mSessionValid;
+ mHintSessionFuture = CommonPool::async([=, tids = std::move(tids)] {
+ return gAPH_createSessionFn(manager, tids.data(), tids.size(), defaultTargetDurationNanos);
+ });
+ return false;
}
void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos) {
- if (mHintSession == nullptr) return;
+ if (!init()) return;
targetWorkDurationNanos = targetWorkDurationNanos * Properties::targetCpuTimePercentage / 100;
if (targetWorkDurationNanos != mLastTargetWorkDuration &&
targetWorkDurationNanos > kSanityCheckLowerBound &&
@@ -138,7 +155,7 @@ void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos)
}
void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
- if (mHintSession == nullptr) return;
+ if (!init()) return;
if (actualDurationNanos > kSanityCheckLowerBound &&
actualDurationNanos < kSanityCheckUpperBound) {
gAPH_reportActualWorkDurationFn(mHintSession, actualDurationNanos);
@@ -146,7 +163,7 @@ void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
}
void HintSessionWrapper::sendLoadResetHint() {
- if (mHintSession == nullptr) return;
+ if (!init()) return;
nsecs_t now = systemTime();
if (now - mLastFrameNotification > kResetHintTimeout) {
gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_RESET));
@@ -155,7 +172,7 @@ void HintSessionWrapper::sendLoadResetHint() {
}
void HintSessionWrapper::sendLoadIncreaseHint() {
- if (mHintSession == nullptr) return;
+ if (!init()) 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 f2f1298c1eec..b7a433fb4eae 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.h
+++ b/libs/hwui/renderthread/HintSessionWrapper.h
@@ -18,6 +18,8 @@
#include <android/performance_hint.h>
+#include <future>
+
#include "utils/TimeUtils.h"
namespace android {
@@ -38,6 +40,7 @@ public:
private:
APerformanceHintSession* mHintSession = nullptr;
+ std::future<APerformanceHintSession*> mHintSessionFuture;
nsecs_t mLastFrameNotification = 0;
nsecs_t mLastTargetWorkDuration = 0;