blob: 4f9eafc08c1a77e39cad7888d0826747f5e41ffe [file]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ML_NN_CHROMEOS_IPC_DRIVER_H_
#define ML_NN_CHROMEOS_IPC_DRIVER_H_
#include <HalInterfaces.h>
namespace android {
namespace nn {
// We need to forward declare this since its header file
// contains ChromeOS headers that contains macros that are
// also defined in the Android ecosystem.
class MojoController;
// This is the application / NNAPI side driver class used
// to communicate with the remote HAL driver process. It
// effectively just forwards NNAPI calls across the IPC
// boundary.
class IPCDriver : public V1_3::IDevice {
public:
IPCDriver(const char* name, sp<V1_3::IDevice> delegate);
// These methods are done over mojo
hardware::Return<void> getCapabilities_1_3(
getCapabilities_1_3_cb cb) override;
hardware::Return<V1_0::ErrorStatus> prepareModel(
const V1_0::Model& model,
const sp<V1_0::IPreparedModelCallback>& callback) override;
// These methods are done by converting to the 1_3 version.
hardware::Return<void> getCapabilities(getCapabilities_cb cb) override;
hardware::Return<void> getCapabilities_1_1(
getCapabilities_1_1_cb cb) override;
hardware::Return<void> getCapabilities_1_2(
getCapabilities_1_2_cb cb) override;
// These methods are performed on the local CPU delegate
hardware::Return<void> getVersionString(getVersionString_cb cb) override;
hardware::Return<void> getType(getType_cb cb) override;
hardware::Return<void> getSupportedExtensions(
getSupportedExtensions_cb) override;
hardware::Return<void> getSupportedOperations(
const V1_0::Model& model,
getSupportedOperations_cb cb) override;
hardware::Return<void> getSupportedOperations_1_1(
const V1_1::Model& model,
getSupportedOperations_1_1_cb cb) override;
hardware::Return<void> getSupportedOperations_1_2(
const V1_2::Model& model,
getSupportedOperations_1_2_cb cb) override;
hardware::Return<void> getSupportedOperations_1_3(
const V1_3::Model& model,
getSupportedOperations_1_3_cb cb) override;
hardware::Return<void> getNumberOfCacheFilesNeeded(
getNumberOfCacheFilesNeeded_cb cb) override;
hardware::Return<V1_0::ErrorStatus> prepareModel_1_1(
const V1_1::Model& model,
V1_1::ExecutionPreference preference,
const sp<V1_0::IPreparedModelCallback>& callback) override;
hardware::Return<V1_0::ErrorStatus> prepareModel_1_2(
const V1_2::Model& model,
V1_1::ExecutionPreference preference,
const hardware::hidl_vec<hardware::hidl_handle>& modelCache,
const hardware::hidl_vec<hardware::hidl_handle>& dataCache,
const HalCacheToken& token,
const sp<V1_2::IPreparedModelCallback>& callback) override;
hardware::Return<V1_3::ErrorStatus> prepareModel_1_3(
const V1_3::Model& model,
V1_1::ExecutionPreference preference,
V1_3::Priority priority,
const V1_3::OptionalTimePoint& deadline,
const hardware::hidl_vec<hardware::hidl_handle>& modelCache,
const hardware::hidl_vec<hardware::hidl_handle>& dataCache,
const HalCacheToken& token,
const sp<V1_3::IPreparedModelCallback>& callback) override;
hardware::Return<V1_0::ErrorStatus> prepareModelFromCache(
const hardware::hidl_vec<hardware::hidl_handle>& modelCache,
const hardware::hidl_vec<hardware::hidl_handle>& dataCache,
const HalCacheToken& token,
const sp<V1_2::IPreparedModelCallback>& callback) override;
hardware::Return<V1_3::ErrorStatus> prepareModelFromCache_1_3(
const V1_3::OptionalTimePoint& deadline,
const hardware::hidl_vec<hardware::hidl_handle>& modelCache,
const hardware::hidl_vec<hardware::hidl_handle>& dataCache,
const HalCacheToken& token,
const sp<V1_3::IPreparedModelCallback>& callback) override;
hardware::Return<V1_0::DeviceStatus> getStatus() override;
hardware::Return<void> allocate(
const V1_3::BufferDesc& desc,
const hardware::hidl_vec<sp<V1_3::IPreparedModel>>& preparedModels,
const hardware::hidl_vec<V1_3::BufferRole>& inputRoles,
const hardware::hidl_vec<V1_3::BufferRole>& outputRoles,
allocate_cb cb) override;
private:
std::unique_ptr<MojoController> mojo_;
// TODO: Remove this once all the methods have been implemented
// on the mojo object.
sp<V1_3::IDevice> delegate_;
};
} // namespace nn
} // namespace android
#endif // ML_NN_CHROMEOS_IPC_DRIVER_H_