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

Commit e40569ee 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 am:...

Merge "Create hint session asynchronously" into udc-dev am: 5c406a3c am: 7d89526c am: 187ad67d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22951911



Change-Id: I96c93767b527956ec0ea4b6e7c048e9d17a1fc30
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents b70288dc 187ad67d
Loading
Loading
Loading
Loading
+29 −12
Original line number Original line Diff line number Diff line
@@ -20,11 +20,14 @@
#include <private/performance_hint_private.h>
#include <private/performance_hint_private.h>
#include <utils/Log.h>
#include <utils/Log.h>


#include <chrono>
#include <vector>
#include <vector>


#include "../Properties.h"
#include "../Properties.h"
#include "thread/CommonPool.h"
#include "thread/CommonPool.h"


using namespace std::chrono_literals;

namespace android {
namespace android {
namespace uirenderer {
namespace uirenderer {
namespace renderthread {
namespace renderthread {
@@ -96,10 +99,25 @@ HintSessionWrapper::~HintSessionWrapper() {
}
}


bool HintSessionWrapper::init() {
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
    // has bad argument values, don't even bother
    if (mHintSession != nullptr || !mSessionValid || !Properties::useHintManager ||
    if (!mSessionValid || !Properties::useHintManager || !Properties::isDrawingEnabled() ||
        !Properties::isDrawingEnabled() || mUiThreadId < 0 || mRenderThreadId < 0) {
        mUiThreadId < 0 || mRenderThreadId < 0) {
        return false;
        return false;
    }
    }


@@ -118,15 +136,14 @@ bool HintSessionWrapper::init() {
    // Use a placeholder target value to initialize,
    // Use a placeholder target value to initialize,
    // this will always be replaced elsewhere before it gets used
    // this will always be replaced elsewhere before it gets used
    int64_t defaultTargetDurationNanos = 16666667;
    int64_t defaultTargetDurationNanos = 16666667;
    mHintSession =
    mHintSessionFuture = CommonPool::async([=, tids = std::move(tids)] {
            gAPH_createSessionFn(manager, tids.data(), tids.size(), defaultTargetDurationNanos);
        return gAPH_createSessionFn(manager, tids.data(), tids.size(), defaultTargetDurationNanos);

    });
    mSessionValid = !!mHintSession;
    return false;
    return mSessionValid;
}
}


void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos) {
void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos) {
    if (mHintSession == nullptr) return;
    if (!init()) return;
    targetWorkDurationNanos = targetWorkDurationNanos * Properties::targetCpuTimePercentage / 100;
    targetWorkDurationNanos = targetWorkDurationNanos * Properties::targetCpuTimePercentage / 100;
    if (targetWorkDurationNanos != mLastTargetWorkDuration &&
    if (targetWorkDurationNanos != mLastTargetWorkDuration &&
        targetWorkDurationNanos > kSanityCheckLowerBound &&
        targetWorkDurationNanos > kSanityCheckLowerBound &&
@@ -138,7 +155,7 @@ void HintSessionWrapper::updateTargetWorkDuration(long targetWorkDurationNanos)
}
}


void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
    if (mHintSession == nullptr) return;
    if (!init()) return;
    if (actualDurationNanos > kSanityCheckLowerBound &&
    if (actualDurationNanos > kSanityCheckLowerBound &&
        actualDurationNanos < kSanityCheckUpperBound) {
        actualDurationNanos < kSanityCheckUpperBound) {
        gAPH_reportActualWorkDurationFn(mHintSession, actualDurationNanos);
        gAPH_reportActualWorkDurationFn(mHintSession, actualDurationNanos);
@@ -146,7 +163,7 @@ void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
}
}


void HintSessionWrapper::sendLoadResetHint() {
void HintSessionWrapper::sendLoadResetHint() {
    if (mHintSession == nullptr) return;
    if (!init()) return;
    nsecs_t now = systemTime();
    nsecs_t now = systemTime();
    if (now - mLastFrameNotification > kResetHintTimeout) {
    if (now - mLastFrameNotification > kResetHintTimeout) {
        gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_RESET));
        gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_RESET));
@@ -155,7 +172,7 @@ void HintSessionWrapper::sendLoadResetHint() {
}
}


void HintSessionWrapper::sendLoadIncreaseHint() {
void HintSessionWrapper::sendLoadIncreaseHint() {
    if (mHintSession == nullptr) return;
    if (!init()) return;
    gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_UP));
    gAPH_sendHintFn(mHintSession, static_cast<int>(SessionHint::CPU_LOAD_UP));
}
}


+3 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,8 @@


#include <android/performance_hint.h>
#include <android/performance_hint.h>


#include <future>

#include "utils/TimeUtils.h"
#include "utils/TimeUtils.h"


namespace android {
namespace android {
@@ -38,6 +40,7 @@ public:


private:
private:
    APerformanceHintSession* mHintSession = nullptr;
    APerformanceHintSession* mHintSession = nullptr;
    std::future<APerformanceHintSession*> mHintSessionFuture;


    nsecs_t mLastFrameNotification = 0;
    nsecs_t mLastFrameNotification = 0;
    nsecs_t mLastTargetWorkDuration = 0;
    nsecs_t mLastTargetWorkDuration = 0;