blob: 1f9fc1ee19eee1b1f83df1a69f83efd081839004 [file] [log] [blame]
surmeh0149b9e102018-05-17 14:11:25 +01001//
Mike Kellye2d611e2021-10-14 12:35:58 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beck93e48982018-09-05 13:05:09 +01003// SPDX-License-Identifier: MIT
surmeh0149b9e102018-05-17 14:11:25 +01004//
Mike Kellye2d611e2021-10-14 12:35:58 +01005
surmeh0149b9e102018-05-17 14:11:25 +01006#include "DriverTestHelpers.hpp"
7#include <log/log.h>
Sadik Armagan9150bff2021-05-26 15:40:53 +01008
surmeh0149b9e102018-05-17 14:11:25 +01009namespace android
10{
11namespace hardware
12{
13namespace neuralnetworks
14{
15namespace V1_0
16{
17
Kevin Mayec1e5b82020-02-26 17:00:39 +000018std::ostream& operator<<(std::ostream& os, V1_0::ErrorStatus stat)
surmeh0149b9e102018-05-17 14:11:25 +010019{
20 return os << static_cast<int>(stat);
21}
22
23} // namespace android::hardware::neuralnetworks::V1_0
24} // namespace android::hardware::neuralnetworks
25} // namespace android::hardware
26} // namespace android
27
surmeh0149b9e102018-05-17 14:11:25 +010028namespace driverTestHelpers
29{
30
telsoa01ce3e84a2018-08-31 09:31:35 +010031using namespace android::hardware;
32using namespace armnn_driver;
33
Kevin Mayec1e5b82020-02-26 17:00:39 +000034Return<void> ExecutionCallback::notify(V1_0::ErrorStatus status)
surmeh0149b9e102018-05-17 14:11:25 +010035{
36 (void)status;
37 ALOGI("ExecutionCallback::notify invoked");
38 std::lock_guard<std::mutex> executionLock(mMutex);
39 mNotified = true;
40 mCondition.notify_one();
41 return Void();
42}
43
44Return<void> ExecutionCallback::wait()
45{
46 ALOGI("ExecutionCallback::wait invoked");
47 std::unique_lock<std::mutex> executionLock(mMutex);
48 while (!mNotified)
49 {
50 mCondition.wait(executionLock);
51 }
52 mNotified = false;
53 return Void();
54}
55
Kevin Mayec1e5b82020-02-26 17:00:39 +000056Return<void> PreparedModelCallback::notify(V1_0::ErrorStatus status,
Sadik Armagane6e54a82019-05-08 10:18:05 +010057 const android::sp<V1_0::IPreparedModel>& preparedModel)
surmeh0149b9e102018-05-17 14:11:25 +010058{
59 m_ErrorStatus = status;
60 m_PreparedModel = preparedModel;
61 return Void();
62}
63
Sadik Armagan6a903a72020-05-26 10:41:54 +010064#if defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3)
Ferran Balaguerb2397fd2019-07-25 12:12:39 +010065
Kevin Mayec1e5b82020-02-26 17:00:39 +000066Return<void> PreparedModelCallback_1_2::notify(V1_0::ErrorStatus status,
Ferran Balaguerb2397fd2019-07-25 12:12:39 +010067 const android::sp<V1_0::IPreparedModel>& preparedModel)
68{
69 m_ErrorStatus = status;
70 m_PreparedModel = preparedModel;
71 return Void();
72}
73
Kevin Mayec1e5b82020-02-26 17:00:39 +000074Return<void> PreparedModelCallback_1_2::notify_1_2(V1_0::ErrorStatus status,
Ferran Balaguerb2397fd2019-07-25 12:12:39 +010075 const android::sp<V1_2::IPreparedModel>& preparedModel)
76{
77 m_ErrorStatus = status;
78 m_PreparedModel_1_2 = preparedModel;
79 return Void();
80}
81
82#endif
83
Sadik Armagan6a903a72020-05-26 10:41:54 +010084#ifdef ARMNN_ANDROID_NN_V1_3
85
86Return<void> PreparedModelCallback_1_3::notify(V1_0::ErrorStatus status,
87 const android::sp<V1_0::IPreparedModel>& preparedModel)
88{
89 m_1_0_ErrorStatus = status;
90 m_PreparedModel = preparedModel;
91 return Void();
92}
93
94Return<void> PreparedModelCallback_1_3::notify_1_2(V1_0::ErrorStatus status,
95 const android::sp<V1_2::IPreparedModel>& preparedModel)
96{
97 m_1_0_ErrorStatus = status;
98 m_PreparedModel_1_2 = preparedModel;
99 return Void();
100}
101
102Return<void> PreparedModelCallback_1_3::notify_1_3(V1_3::ErrorStatus status,
103 const android::sp<V1_3::IPreparedModel>& preparedModel)
104{
105 m_1_3_ErrorStatus = status;
106 m_PreparedModel_1_3 = preparedModel;
107 return Void();
108}
109
110#endif
111
surmeh0149b9e102018-05-17 14:11:25 +0100112// lifted from common/Utils.cpp
113hidl_memory allocateSharedMemory(int64_t size)
114{
115 hidl_memory memory;
116
117 const std::string& type = "ashmem";
118 android::sp<IAllocator> allocator = IAllocator::getService(type);
119 allocator->allocate(size, [&](bool success, const hidl_memory& mem) {
120 if (!success)
121 {
122 ALOGE("unable to allocate %li bytes of %s", size, type.c_str());
123 }
124 else
125 {
126 memory = mem;
127 }
128 });
129
130 return memory;
131}
132
Sadik Armagane6e54a82019-05-08 10:18:05 +0100133android::sp<V1_0::IPreparedModel> PrepareModelWithStatus(const V1_0::Model& model,
134 armnn_driver::ArmnnDriver& driver,
Kevin Mayec1e5b82020-02-26 17:00:39 +0000135 V1_0::ErrorStatus& prepareStatus,
136 V1_0::ErrorStatus expectedStatus)
surmeh0149b9e102018-05-17 14:11:25 +0100137{
surmeh0149b9e102018-05-17 14:11:25 +0100138 android::sp<PreparedModelCallback> cb(new PreparedModelCallback());
139 driver.prepareModel(model, cb);
140
141 prepareStatus = cb->GetErrorStatus();
Mike Kellye2d611e2021-10-14 12:35:58 +0100142 DOCTEST_CHECK((int)prepareStatus == (int)expectedStatus);
Kevin Mayec1e5b82020-02-26 17:00:39 +0000143 if (expectedStatus == V1_0::ErrorStatus::NONE)
surmeh0149b9e102018-05-17 14:11:25 +0100144 {
Mike Kellye2d611e2021-10-14 12:35:58 +0100145 DOCTEST_CHECK((cb->GetPreparedModel() != nullptr));
surmeh0149b9e102018-05-17 14:11:25 +0100146 }
147 return cb->GetPreparedModel();
148}
149
Sadik Armagan6a903a72020-05-26 10:41:54 +0100150#if defined(ARMNN_ANDROID_NN_V1_1) || defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3)
Nikhil Raj77605822018-09-03 11:25:56 +0100151
Sadik Armagane6e54a82019-05-08 10:18:05 +0100152android::sp<V1_0::IPreparedModel> PrepareModelWithStatus(const V1_1::Model& model,
153 armnn_driver::ArmnnDriver& driver,
Kevin Mayec1e5b82020-02-26 17:00:39 +0000154 V1_0::ErrorStatus& prepareStatus,
155 V1_0::ErrorStatus expectedStatus)
surmeh0149b9e102018-05-17 14:11:25 +0100156{
Nikhil Raj77605822018-09-03 11:25:56 +0100157 android::sp<PreparedModelCallback> cb(new PreparedModelCallback());
Matteo Martincigh8b287c22018-09-07 09:25:10 +0100158 driver.prepareModel_1_1(model, V1_1::ExecutionPreference::LOW_POWER, cb);
Nikhil Raj77605822018-09-03 11:25:56 +0100159
160 prepareStatus = cb->GetErrorStatus();
Mike Kellye2d611e2021-10-14 12:35:58 +0100161 DOCTEST_CHECK((int)prepareStatus == (int)expectedStatus);
Kevin Mayec1e5b82020-02-26 17:00:39 +0000162 if (expectedStatus == V1_0::ErrorStatus::NONE)
Nikhil Raj77605822018-09-03 11:25:56 +0100163 {
Mike Kellye2d611e2021-10-14 12:35:58 +0100164 DOCTEST_CHECK((cb->GetPreparedModel() != nullptr));
Nikhil Raj77605822018-09-03 11:25:56 +0100165 }
166 return cb->GetPreparedModel();
surmeh0149b9e102018-05-17 14:11:25 +0100167}
168
Nikhil Raj77605822018-09-03 11:25:56 +0100169#endif
170
Sadik Armagan6a903a72020-05-26 10:41:54 +0100171#if defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3)
Ferran Balaguerb2397fd2019-07-25 12:12:39 +0100172
173android::sp<V1_2::IPreparedModel> PrepareModelWithStatus_1_2(const armnn_driver::hal_1_2::HalPolicy::Model& model,
174 armnn_driver::ArmnnDriver& driver,
Kevin Mayec1e5b82020-02-26 17:00:39 +0000175 V1_0::ErrorStatus& prepareStatus,
176 V1_0::ErrorStatus expectedStatus)
Ferran Balaguerb2397fd2019-07-25 12:12:39 +0100177{
178 android::sp<PreparedModelCallback_1_2> cb(new PreparedModelCallback_1_2());
179
180 android::hardware::hidl_vec<android::hardware::hidl_handle> emptyHandle1;
181 android::hardware::hidl_vec<android::hardware::hidl_handle> emptyHandle2;
182 armnn_driver::ArmnnDriver::HidlToken emptyToken;
183
184 driver.prepareModel_1_2(model, V1_1::ExecutionPreference::LOW_POWER, emptyHandle1, emptyHandle2, emptyToken, cb);
185
186 prepareStatus = cb->GetErrorStatus();
Mike Kellye2d611e2021-10-14 12:35:58 +0100187 DOCTEST_CHECK((int)prepareStatus == (int)expectedStatus);
Kevin Mayec1e5b82020-02-26 17:00:39 +0000188 if (expectedStatus == V1_0::ErrorStatus::NONE)
Ferran Balaguerb2397fd2019-07-25 12:12:39 +0100189 {
Mike Kellye2d611e2021-10-14 12:35:58 +0100190 DOCTEST_CHECK((cb->GetPreparedModel_1_2() != nullptr));
Ferran Balaguerb2397fd2019-07-25 12:12:39 +0100191 }
192 return cb->GetPreparedModel_1_2();
193}
194
195#endif
196
Sadik Armagan6a903a72020-05-26 10:41:54 +0100197#ifdef ARMNN_ANDROID_NN_V1_3
198
199android::sp<V1_3::IPreparedModel> PrepareModelWithStatus_1_3(const armnn_driver::hal_1_3::HalPolicy::Model& model,
200 armnn_driver::ArmnnDriver& driver,
David Monahan82609562020-08-31 15:50:32 +0100201 V1_3::ErrorStatus& prepareStatus,
202 V1_3::Priority priority)
Sadik Armagan6a903a72020-05-26 10:41:54 +0100203{
204 android::sp<PreparedModelCallback_1_3> cb(new PreparedModelCallback_1_3());
205
206 android::hardware::hidl_vec<android::hardware::hidl_handle> emptyHandle1;
207 android::hardware::hidl_vec<android::hardware::hidl_handle> emptyHandle2;
208 armnn_driver::ArmnnDriver::HidlToken emptyToken;
209
210 driver.prepareModel_1_3(model,
211 V1_1::ExecutionPreference::LOW_POWER,
David Monahan82609562020-08-31 15:50:32 +0100212 priority,
Sadik Armagan6a903a72020-05-26 10:41:54 +0100213 {},
214 emptyHandle1,
215 emptyHandle2,
216 emptyToken,
217 cb);
218
219 prepareStatus = cb->Get_1_3_ErrorStatus();
220 if (prepareStatus == V1_3::ErrorStatus::NONE)
221 {
Mike Kellye2d611e2021-10-14 12:35:58 +0100222 DOCTEST_CHECK((cb->GetPreparedModel_1_3() != nullptr));
Sadik Armagan6a903a72020-05-26 10:41:54 +0100223 }
224 return cb->GetPreparedModel_1_3();
225}
226
227#endif
228
Kevin Mayec1e5b82020-02-26 17:00:39 +0000229V1_0::ErrorStatus Execute(android::sp<V1_0::IPreparedModel> preparedModel,
230 const V1_0::Request& request,
231 V1_0::ErrorStatus expectedStatus)
surmeh0149b9e102018-05-17 14:11:25 +0100232{
Mike Kellye2d611e2021-10-14 12:35:58 +0100233 DOCTEST_CHECK(preparedModel.get() != nullptr);
surmeh0149b9e102018-05-17 14:11:25 +0100234 android::sp<ExecutionCallback> cb(new ExecutionCallback());
Kevin Mayec1e5b82020-02-26 17:00:39 +0000235 V1_0::ErrorStatus execStatus = preparedModel->execute(request, cb);
Mike Kellye2d611e2021-10-14 12:35:58 +0100236 DOCTEST_CHECK((int)execStatus == (int)expectedStatus);
surmeh0149b9e102018-05-17 14:11:25 +0100237 ALOGI("Execute: waiting for callback to be invoked");
238 cb->wait();
239 return execStatus;
240}
241
Kevin Mayec1e5b82020-02-26 17:00:39 +0000242android::sp<ExecutionCallback> ExecuteNoWait(android::sp<V1_0::IPreparedModel> preparedModel,
243 const V1_0::Request& request)
surmeh0149b9e102018-05-17 14:11:25 +0100244{
Mike Kellye2d611e2021-10-14 12:35:58 +0100245 DOCTEST_CHECK(preparedModel.get() != nullptr);
surmeh0149b9e102018-05-17 14:11:25 +0100246 android::sp<ExecutionCallback> cb(new ExecutionCallback());
Sadik Armagan9150bff2021-05-26 15:40:53 +0100247 V1_0::ErrorStatus execStatus = preparedModel->execute(request, cb);
Mike Kellye2d611e2021-10-14 12:35:58 +0100248 DOCTEST_CHECK((int)execStatus == (int)V1_0::ErrorStatus::NONE);
surmeh0149b9e102018-05-17 14:11:25 +0100249 ALOGI("ExecuteNoWait: returning callback object");
250 return cb;
251}
252
253template<>
254OperandType TypeToOperandType<float>()
255{
256 return OperandType::TENSOR_FLOAT32;
Matteo Martincigh8b287c22018-09-07 09:25:10 +0100257}
surmeh0149b9e102018-05-17 14:11:25 +0100258
259template<>
260OperandType TypeToOperandType<int32_t>()
261{
262 return OperandType::TENSOR_INT32;
Matteo Martincigh8b287c22018-09-07 09:25:10 +0100263}
surmeh0149b9e102018-05-17 14:11:25 +0100264
265} // namespace driverTestHelpers