Support the fallback path with device memories.
CPU fallback with device memories:
1. Allocate BLOB mode AHWBs for input and output device memories.
2. Copy out input device memories by IBuffer::copyTo.
3. Compute on CPU.
4. Copy back output device memories by IBuffer::copyFrom.
Bug: 152208838
Test: NNT_static with a broken driver
Change-Id: I9fed3134a7c56c893ff94e892cc25d230a1bd972
Merged-In: I9fed3134a7c56c893ff94e892cc25d230a1bd972
(cherry picked from commit 7b352ec1d710de550df2719a98083b04ccadfe1a)
diff --git a/runtime/Memory.cpp b/runtime/Memory.cpp
index 7ff3651..09e597e 100644
--- a/runtime/Memory.cpp
+++ b/runtime/Memory.cpp
@@ -134,7 +134,6 @@
}
Metadata getMetadata() const override {
- CHECK(mInitialized);
return {.logicalSize = TypeManager::get()->getSizeOfData(kOperand.type, mUpdatedDimensions),
.dimensions = mUpdatedDimensions,
.operand = kOperand};
@@ -158,6 +157,10 @@
return true;
}
+ bool createdWithUnknownShape() const override {
+ return TypeManager::get()->getSizeOfData(kOperand.type, kInitialDimensions) == 0;
+ }
+
void setInitialized(bool initialized) override { mInitialized = initialized; }
bool isInitialized() const override { return mInitialized; }
@@ -243,7 +246,7 @@
return ANEURALNETWORKS_NO_ERROR;
}
-static int copyIBufferToHidlMemory(const sp<IBuffer>& src, const hidl_memory& dst) {
+int copyIBufferToHidlMemory(const sp<IBuffer>& src, const hidl_memory& dst) {
const auto ret = src->copyTo(dst);
if (!ret.isOk()) {
LOG(ERROR) << "ANeuralNetworksMemory_copy failure: " << ret.description();
@@ -252,8 +255,8 @@
return convertErrorStatusToResultCode(static_cast<ErrorStatus>(ret));
}
-static int copyHidlMemoryToIBuffer(const hidl_memory& src, const sp<IBuffer>& dst,
- const std::vector<uint32_t>& dimensions) {
+int copyHidlMemoryToIBuffer(const hidl_memory& src, const sp<IBuffer>& dst,
+ const std::vector<uint32_t>& dimensions) {
const auto ret = dst->copyFrom(src, dimensions);
if (!ret.isOk()) {
LOG(ERROR) << "ANeuralNetworksMemory_copy failure: " << ret.description();