Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e06be0b authored by Matt Buckley's avatar Matt Buckley Committed by Automerger Merge Worker
Browse files

Merge "Create hint session asynchronously" into udc-dev am: 5c406a3c

parents 81adc99e 5c406a3c
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -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));
}

+3 −0
Original line number Diff line number Diff line
@@ -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;