1ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet/*
2ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Copyright (C) 2017 The Android Open Source Project
3ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
4ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License");
5ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * you may not use this file except in compliance with the License.
6ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * You may obtain a copy of the License at
7ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
8ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *      http://www.apache.org/licenses/LICENSE-2.0
9ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
10ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software
11ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS,
12ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * See the License for the specific language governing permissions and
14ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * limitations under the License.
15ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet */
16ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
17ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#define LOG_TAG "SampleDriverFloatSlow"
18ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
19ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "SampleDriver.h"
20ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
21ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "HalInterfaces.h"
22ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "Utils.h"
23c5e342b62bf25a98d15ae28ee97916b274296e94Jean-Luc Brouillet#include "ValidateHal.h"
24ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
25ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <android-base/logging.h>
26ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <hidl/LegacySupport.h>
27ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <thread>
28ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
29ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace android {
30ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace nn {
31ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace sample_driver {
32ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
33ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletclass SampleDriverFloatSlow : public SampleDriver {
34ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletpublic:
35ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    SampleDriverFloatSlow() : SampleDriver("sample-float-slow") {}
3647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross    Return<void> getCapabilities_1_1(getCapabilities_1_1_cb cb) override;
37d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler    Return<void> getSupportedOperations_1_1(const V1_1::Model& model,
38d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                                            getSupportedOperations_1_1_cb cb) override;
39ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet};
40ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
4147b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid GrossReturn<void> SampleDriverFloatSlow::getCapabilities_1_1(getCapabilities_1_1_cb cb) {
42a116e12f3a150b3dfc6afa91b0997e551490a9f8Jean-Luc Brouillet    android::nn::initVLogMask();
43820215d28bed6c90f696cde0f282445d16da432eMiao Wang    VLOG(DRIVER) << "getCapabilities()";
44ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    Capabilities capabilities = {.float32Performance = {.execTime = 1.3f, .powerUsage = 0.7f},
4547b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                 .quantized8Performance = {.execTime = 1.0f, .powerUsage = 1.0f},
4647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                 .relaxedFloat32toFloat16Performance =
4747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                     {.execTime = 1.2f, .powerUsage = 0.6f}};
48ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    cb(ErrorStatus::NONE, capabilities);
49ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return Void();
50ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
51ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
52d56b2323c6e367d77bc226c5e35908d9512af79eMichael ButlerReturn<void> SampleDriverFloatSlow::getSupportedOperations_1_1(const V1_1::Model& model,
53d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                                                               getSupportedOperations_1_1_cb cb) {
54820215d28bed6c90f696cde0f282445d16da432eMiao Wang    VLOG(DRIVER) << "getSupportedOperations()";
55ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    if (validateModel(model)) {
56ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        const size_t count = model.operations.size();
57ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        std::vector<bool> supported(count);
58ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        for (size_t i = 0; i < count; i++) {
59d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler            const Operation& operation = model.operations[i];
60ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet            if (operation.inputs.size() > 0) {
61ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                const Operand& firstOperand = model.operands[operation.inputs[0]];
62ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                supported[i] = firstOperand.type == OperandType::TENSOR_FLOAT32;
63ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet            }
64ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        }
65ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        cb(ErrorStatus::NONE, supported);
66ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    } else {
67ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        std::vector<bool> supported;
68ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        cb(ErrorStatus::INVALID_ARGUMENT, supported);
69ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    }
70ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return Void();
71ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
72ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
73ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace sample_driver
74ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace nn
75ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace android
76ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
77ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::nn::sample_driver::SampleDriverFloatSlow;
78ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::sp;
79ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
80ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletint main() {
81ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    sp<SampleDriverFloatSlow> driver(new SampleDriverFloatSlow());
82ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return driver->run();
83ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
84