| /* | |
| * 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 |