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 "SampleDriverMinimal" 18ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 19ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "SampleDriver.h" 20ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 21ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "HalInterfaces.h" 22ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "NeuralNetworksOEM.h" 23ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "Utils.h" 24c5e342b62bf25a98d15ae28ee97916b274296e94Jean-Luc Brouillet#include "ValidateHal.h" 25ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 26ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <android-base/logging.h> 27ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <hidl/LegacySupport.h> 28ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <thread> 29ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 30ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace android { 31ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace nn { 32ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace sample_driver { 33ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 34ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletclass SampleDriverMinimal : public SampleDriver { 35ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletpublic: 36ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet SampleDriverMinimal() : SampleDriver("sample-minimal") {} 3747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross Return<void> getCapabilities_1_1(getCapabilities_1_1_cb cb) override; 38d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler Return<void> getSupportedOperations_1_1(const V1_1::Model& model, 39d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler getSupportedOperations_1_1_cb cb) override; 40ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}; 41ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 4247b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid GrossReturn<void> SampleDriverMinimal::getCapabilities_1_1(getCapabilities_1_1_cb cb) { 43a116e12f3a150b3dfc6afa91b0997e551490a9f8Jean-Luc Brouillet android::nn::initVLogMask(); 44820215d28bed6c90f696cde0f282445d16da432eMiao Wang VLOG(DRIVER) << "getCapabilities()"; 45ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet Capabilities capabilities = {.float32Performance = {.execTime = 0.4f, .powerUsage = 0.5f}, 4647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross .quantized8Performance = {.execTime = 1.0f, .powerUsage = 1.0f}, 4747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross .relaxedFloat32toFloat16Performance = 4847b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross {.execTime = 0.4f, .powerUsage = 0.5f}}; 49ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::NONE, capabilities); 50ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return Void(); 51ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 52ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 53d56b2323c6e367d77bc226c5e35908d9512af79eMichael ButlerReturn<void> SampleDriverMinimal::getSupportedOperations_1_1(const V1_1::Model& model, 54d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler getSupportedOperations_1_1_cb cb) { 55820215d28bed6c90f696cde0f282445d16da432eMiao Wang VLOG(DRIVER) << "getSupportedOperations()"; 56ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet if (validateModel(model)) { 57ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet const size_t count = model.operations.size(); 58ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet std::vector<bool> supported(count); 59ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet // Simulate supporting just a few ops 60ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet for (size_t i = 0; i < count; i++) { 61ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet supported[i] = false; 62d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler const Operation& operation = model.operations[i]; 63ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet switch (operation.type) { 64d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler case OperationType::ADD: 65d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler case OperationType::CONCATENATION: 66d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler case OperationType::CONV_2D: { 67ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet const Operand& firstOperand = model.operands[operation.inputs[0]]; 68ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet if (firstOperand.type == OperandType::TENSOR_FLOAT32) { 69ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet supported[i] = true; 70ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 71ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet break; 72ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 73ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet default: 74ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet break; 75ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 76ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 77ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::NONE, supported); 78ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } else { 79ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet std::vector<bool> supported; 80ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::INVALID_ARGUMENT, supported); 81ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 82ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return Void(); 83ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 84ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 85ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace sample_driver 86ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace nn 87ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace android 88ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 89ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::nn::sample_driver::SampleDriverMinimal; 90ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::sp; 91ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 92ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletint main() { 93ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet sp<SampleDriverMinimal> driver(new SampleDriverMinimal()); 94ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return driver->run(); 95ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 96