blob: b12e0847cf771ccc59ef6b545ef43d5acc2ed6b4 [file]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SYNTHMARK_ADPF_WRAPPER_H
#define SYNTHMARK_ADPF_WRAPPER_H
#include <algorithm>
#include <functional>
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
#include <mutex>
#include "oboe/Definitions.h"
namespace oboe {
struct APerformanceHintManager;
struct APerformanceHintSession;
typedef struct APerformanceHintManager APerformanceHintManager;
typedef struct APerformanceHintSession APerformanceHintSession;
class AdpfWrapper {
public:
/**
* Create an ADPF session that can be used to boost performance.
* @param threadId
* @param targetDurationNanos - nominal period of isochronous task
* @return zero or negative error
*/
int open(pid_t threadId,
int64_t targetDurationNanos);
bool isOpen() const {
return (mHintSession != nullptr);
}
void close();
/**
* Call this at the beginning of the callback that you are measuring.
*/
void onBeginCallback();
/**
* Call this at the end of the callback that you are measuring.
* It is OK to skip this if you have a short callback.
*/
void onEndCallback(double durationScaler);
/**
* For internal use only!
* This is a hack for communicating with experimental versions of ADPF.
* @param enabled
*/
static void setUseAlternative(bool enabled) {
sUseAlternativeHack = enabled;
}
/**
* Report the measured duration of a callback.
* This is normally called by onEndCallback().
* On older Android devices (below Android API level 36), you may want to call this
* directly in order to give an advance hint of a jump in workload.
* On Android API level 36 and above, notifyWorkloadIncrease() is the preferred
* API to call instead to signal an upcoming increase in workload.
* @param actualDurationNanos
*/
void reportActualDuration(int64_t actualDurationNanos);
void reportWorkload(int32_t appWorkload);
/**
* Informs the framework of an upcoming increase in the workload of an audio callback
* bound to this session. The user can specify whether the increase is expected to be
* on the CPU, GPU, or both.
*
* Sending hints for both CPU and GPU counts as two separate hints for the purposes of the
* rate limiter.
*
* This was introduced in Android API Level 36
*
* @param cpu Indicates if the workload increase is expected to affect the CPU.
* @param gpu Indicates if the workload increase is expected to affect the GPU.
* @param debugName A required string used to identify this specific hint during
* tracing. This debug string will only be held for the duration of the
* method, and can be safely discarded after.
*
* @return Result::OK on success.
* Result::ErrorClosed if open was not called.
* Result::ErrorUnimplemented if the API is not supported.
* Result::ErrorInvalidHandle if no hints were requested.
* Result::ErrorInvalidRate if the hint was rate limited.
* Result::ErrorNoService if communication with the system service has failed.
* Result::ErrorUnavailable if the hint is not supported.
*/
oboe::Result notifyWorkloadIncrease(bool cpu, bool gpu, const char* debugName);
/**
* Informs the framework of an upcoming reset in the workload of an audio callback
* bound to this session, or the imminent start of a new workload. The user can specify
* whether the reset is expected to affect the CPU, GPU, or both.
*
* Sending hints for both CPU and GPU counts as two separate hints for the purposes of the
* this load tracking.
*
* This was introduced in Android API Level 36
*
* @param cpu Indicates if the workload reset is expected to affect the CPU.
* @param gpu Indicates if the workload reset is expected to affect the GPU.
* @param debugName A required string used to identify this specific hint during
* tracing. This debug string will only be held for the duration of the
* method, and can be safely discarded after.
*
* @return Result::OK on success.
* Result::ErrorClosed if open was not called.
* Result::ErrorUnimplemented if the API is not supported.
* Result::ErrorInvalidHandle if no hints were requested.
* Result::ErrorInvalidRate if the hint was rate limited.
* Result::ErrorNoService if communication with the system service has failed.
* Result::ErrorUnavailable if the hint is not supported.
*/
oboe::Result notifyWorkloadReset(bool cpu, bool gpu, const char* debugName);
/**
* Informs the framework of an upcoming one-off expensive frame for an audio callback
* bound to this session. This frame will be treated as not representative of the workload as a
* whole, and it will be discarded the purposes of load tracking. The user can specify
* whether the workload spike is expected to be on the CPU, GPU, or both.
*
* Sending hints for both CPU and GPU counts as two separate hints for the purposes of the
* rate limiter.
*
* This was introduced in Android API Level 36
*
* @param cpu Indicates if the workload spike is expected to affect the CPU.
* @param gpu Indicates if the workload spike is expected to affect the GPU.
* @param debugName A required string used to identify this specific hint during
* tracing. This debug string will only be held for the duration of the
* method, and can be safely discarded after.
*
* @return Result::OK on success.
* Result::ErrorClosed if open was not called.
* Result::ErrorUnimplemented if the API is not supported.
* Result::ErrorInvalidHandle if no hints were requested.
* Result::ErrorInvalidRate if the hint was rate limited.
* Result::ErrorNoService if communication with the system service has failed.
* Result::ErrorUnavailable if the hint is not supported.
*/
oboe::Result notifyWorkloadSpike(bool cpu, bool gpu, const char* debugName);
private:
std::mutex mLock;
APerformanceHintSession *mHintSession = nullptr;
int64_t mBeginCallbackNanos = 0;
static bool sUseAlternativeHack;
int32_t mPreviousWorkload = 0;
double mNanosPerWorkloadUnit = 0.0;
};
}
#endif //SYNTHMARK_ADPF_WRAPPER_H