xref: /aosp_15_r20/hardware/interfaces/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/PreparedModel.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_3_UTILS_PREPARED_MODEL_H
18 #define ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_3_UTILS_PREPARED_MODEL_H
19 
20 #include <android/hardware/neuralnetworks/1.3/IPreparedModel.h>
21 #include <nnapi/IPreparedModel.h>
22 #include <nnapi/Result.h>
23 #include <nnapi/Types.h>
24 #include <nnapi/hal/1.0/ProtectCallback.h>
25 #include <nnapi/hal/CommonUtils.h>
26 
27 #include <memory>
28 #include <tuple>
29 #include <utility>
30 #include <vector>
31 
32 // See hardware/interfaces/neuralnetworks/utils/README.md for more information on HIDL interface
33 // lifetimes across processes and for protecting asynchronous calls across HIDL.
34 
35 namespace android::hardware::neuralnetworks::V1_3::utils {
36 
37 // Class that adapts V1_3::IPreparedModel to nn::IPreparedModel.
38 class PreparedModel final : public nn::IPreparedModel,
39                             public std::enable_shared_from_this<PreparedModel> {
40     struct PrivateConstructorTag {};
41 
42   public:
43     static nn::GeneralResult<std::shared_ptr<const PreparedModel>> create(
44             sp<V1_3::IPreparedModel> preparedModel, bool executeSynchronously);
45 
46     PreparedModel(PrivateConstructorTag tag, bool executeSynchronously,
47                   sp<V1_3::IPreparedModel> preparedModel, hal::utils::DeathHandler deathHandler);
48 
49     nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> execute(
50             const nn::Request& request, nn::MeasureTiming measure,
51             const nn::OptionalTimePoint& deadline, const nn::OptionalDuration& loopTimeoutDuration,
52             const std::vector<nn::TokenValuePair>& hints,
53             const std::vector<nn::ExtensionNameAndPrefix>& extensionNameToPrefix) const override;
54 
55     nn::GeneralResult<std::pair<nn::SyncFence, nn::ExecuteFencedInfoCallback>> executeFenced(
56             const nn::Request& request, const std::vector<nn::SyncFence>& waitFor,
57             nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline,
58             const nn::OptionalDuration& loopTimeoutDuration,
59             const nn::OptionalDuration& timeoutDurationAfterFence,
60             const std::vector<nn::TokenValuePair>& hints,
61             const std::vector<nn::ExtensionNameAndPrefix>& extensionNameToPrefix) const override;
62 
63     nn::GeneralResult<nn::SharedExecution> createReusableExecution(
64             const nn::Request& request, nn::MeasureTiming measure,
65             const nn::OptionalDuration& loopTimeoutDuration,
66             const std::vector<nn::TokenValuePair>& hints,
67             const std::vector<nn::ExtensionNameAndPrefix>& extensionNameToPrefix) const override;
68 
69     nn::GeneralResult<nn::SharedBurst> configureExecutionBurst() const override;
70 
71     std::any getUnderlyingResource() const override;
72 
73     nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> executeInternal(
74             const Request& request, V1_2::MeasureTiming measure, const OptionalTimePoint& deadline,
75             const OptionalTimeoutDuration& loopTimeoutDuration,
76             const hal::utils::RequestRelocation& relocation) const;
77 
78     nn::GeneralResult<std::pair<nn::SyncFence, nn::ExecuteFencedInfoCallback>>
79     executeFencedInternal(const Request& request, const hidl_vec<hidl_handle>& waitFor,
80                           V1_2::MeasureTiming measure, const OptionalTimePoint& deadline,
81                           const OptionalTimeoutDuration& loopTimeoutDuration,
82                           const OptionalTimeoutDuration& timeoutDurationAfterFence,
83                           const hal::utils::RequestRelocation& relocation) const;
84 
85   private:
86     nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> executeSynchronously(
87             const Request& request, V1_2::MeasureTiming measure, const OptionalTimePoint& deadline,
88             const OptionalTimeoutDuration& loopTimeoutDuration) const;
89     nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> executeAsynchronously(
90             const Request& request, V1_2::MeasureTiming measure, const OptionalTimePoint& deadline,
91             const OptionalTimeoutDuration& loopTimeoutDuration) const;
92 
93     const bool kExecuteSynchronously;
94     const sp<V1_3::IPreparedModel> kPreparedModel;
95     const hal::utils::DeathHandler kDeathHandler;
96 };
97 
98 }  // namespace android::hardware::neuralnetworks::V1_3::utils
99 
100 #endif  // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_1_3_UTILS_PREPARED_MODEL_H
101