Add AHardwareBuffer support for NNAPI
- The main purpose for AHardwareBuffer support is for model inputs &
outputs.
- ANeuralNetworks_setOperandValueFromMemory only accepts BLOB mode
AHardwareBuffer.
- ANeuralNetworks_set[Input|Output]FromMemory can accepts non-BLOB mode
AHardwareBuffer. And for non-BLOB mode buffer, the entire buffer will
be used.
- There is no guarantee that arbitrary AHardwareBuffer can be used by
arbitrary devices. The execution must fail if the driver cannot
consume the buffer.
- No CPU fallback for AHardwareBuffer except BLOB mode.
Test: mm
Test: NeuralNetworksTest_static
Change-Id: I9d9ac95aea1e56b583c06e4f9c9afdaab1403152
Merged-In: I9d9ac95aea1e56b583c06e4f9c9afdaab1403152
(cherry picked from commit 5777040ee6f93f4060f7efb6cffaf5bff37f99d8)
diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp
index e0c91d0..c053fad 100644
--- a/runtime/NeuralNetworks.cpp
+++ b/runtime/NeuralNetworks.cpp
@@ -32,6 +32,8 @@
#include "Tracing.h"
#include "Utils.h"
+#include "vndk/hardware_buffer.h"
+
#include <cstddef>
#include <memory>
#include <vector>
@@ -546,6 +548,22 @@
return ANEURALNETWORKS_NO_ERROR;
}
+int ANeuralNetworksMemory_createFromAHardwareBuffer(const AHardwareBuffer* ahwb,
+ ANeuralNetworksMemory** memory) {
+ NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromAHardwareBuffer");
+ *memory = nullptr;
+ std::unique_ptr<MemoryAHWB> m = std::make_unique<MemoryAHWB>();
+ if (m == nullptr) {
+ return ANEURALNETWORKS_OUT_OF_MEMORY;
+ }
+ int n = m->set(ahwb);
+ if (n != ANEURALNETWORKS_NO_ERROR) {
+ return n;
+ }
+ *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
+ return ANEURALNETWORKS_NO_ERROR;
+}
+
void ANeuralNetworksMemory_free(ANeuralNetworksMemory* memory) {
NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksMemory_free");
// No validation. Free of nullptr is valid.