From de1cd79500a3e6b8744d00fbf54abaae741d881f Mon Sep 17 00:00:00 2001 From: Finn Williams Date: Wed, 2 Mar 2022 12:45:44 +0000 Subject: Add patch to support mapping ashmem and fix error handling Signed-off-by: Kevin May Signed-off-by: Finn Williams Change-Id: I8ff912691c4d197d398c22c3e08288d0d0fd7e0a --- shim/BuildGuideShimSupportLibrary.md | 6 +++-- shim/sl/canonical/ArmnnPreparedModel.cpp | 26 +++++++++++++++------ shim/sl/scripts/NeuralNetworks.patch | 39 ++++++++++++++++++++++++++++++++ shim/sl/scripts/NeuralNetworks_cpp.patch | 13 ----------- shim/sl/scripts/modify_aosp_libs.sh | 8 +++---- 5 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 shim/sl/scripts/NeuralNetworks.patch delete mode 100644 shim/sl/scripts/NeuralNetworks_cpp.patch diff --git a/shim/BuildGuideShimSupportLibrary.md b/shim/BuildGuideShimSupportLibrary.md index 1d8fb43cae..8029032371 100644 --- a/shim/BuildGuideShimSupportLibrary.md +++ b/shim/BuildGuideShimSupportLibrary.md @@ -31,6 +31,8 @@ export AOSP_ROOT= export NDK=/android-ndk-r20b export NDK_TOOLCHAIN_ROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64 export PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH +export $FLATBUFFERS_ANDROID_BUILD= +export $FLATBUFFERS_X86_BUILD= ``` ## Download Arm NN @@ -83,8 +85,8 @@ CXX_FLAGS="-fPIE -fPIC" cmake .. \ -DARMCOMPUTE_ROOT=$AOSP_ROOT/vendor/arm/clframework/ \ -DARMCOMPUTE_BUILD_DIR=$AOSP_ROOT/vendor/arm/clframework/build/android-arm64v8a/ \ -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \ --DFLATBUFFERS_ROOT= \ --DFLATC_DIR= \ +-DFLATBUFFERS_ROOT=$FLATBUFFERS_ANDROID_BUILD \ +-DFLATC_DIR=$FLATBUFFERS_X86_BUILD \ -DBUILD_ARMNN_SERIALIZER=1 -DBUILD_GATORD_MOCK=0 -DBUILD_BASE_PIPE_SERVER=0 ``` diff --git a/shim/sl/canonical/ArmnnPreparedModel.cpp b/shim/sl/canonical/ArmnnPreparedModel.cpp index 659a26cf3b..94809497d1 100644 --- a/shim/sl/canonical/ArmnnPreparedModel.cpp +++ b/shim/sl/canonical/ArmnnPreparedModel.cpp @@ -332,7 +332,7 @@ ExecutionResult, Timing>> ArmnnPreparedModel: switch(status) { case ErrorStatus::OUTPUT_INSUFFICIENT_SIZE: - return NN_ERROR(ErrorStatus::NONE); + return NN_ERROR(ErrorStatus::OUTPUT_INSUFFICIENT_SIZE); case ErrorStatus::GENERAL_FAILURE: return NN_ERROR(ErrorStatus::GENERAL_FAILURE); case ErrorStatus::INVALID_ARGUMENT: @@ -522,10 +522,6 @@ GeneralResult> ArmnnPreparedMode VLOG(DRIVER) << "ArmnnCanonicalPreparedModel::executeFenced(...) before ExecuteGraph"; auto errorStatus = ExecuteGraph(memPools, *inputs, *outputs, ctx); - if (errorStatus != ErrorStatus::NONE) - { - return NN_ERROR(errorStatus) << "executeFenced() failed"; - } VLOG(DRIVER) << "ArmnnCanonicalPreparedModel::executeFenced(...) after ExecuteGraph"; if (relocation.output) { @@ -533,8 +529,24 @@ GeneralResult> ArmnnPreparedMode } ExecuteFencedInfoCallback armnnFencedExecutionCallback = - [timingSinceLaunch, timingAfterFence]() { - return std::make_pair(timingSinceLaunch, timingAfterFence); + [timingSinceLaunch, timingAfterFence, errorStatus]() { + + GeneralResult> result; + + switch(errorStatus) + { + case ErrorStatus::OUTPUT_INSUFFICIENT_SIZE: + result.error().code = (ErrorStatus::OUTPUT_INSUFFICIENT_SIZE); + case ErrorStatus::GENERAL_FAILURE: + result.error().code = (ErrorStatus::GENERAL_FAILURE); + case ErrorStatus::INVALID_ARGUMENT: + result.error().code = (ErrorStatus::INVALID_ARGUMENT); + default: + { + result.value() = std::make_pair(timingSinceLaunch, timingAfterFence); + } + } + return result; }; return std::make_pair(SyncFence::createAsSignaled(), std::move(armnnFencedExecutionCallback )); } diff --git a/shim/sl/scripts/NeuralNetworks.patch b/shim/sl/scripts/NeuralNetworks.patch new file mode 100644 index 0000000000..c33177e081 --- /dev/null +++ b/shim/sl/scripts/NeuralNetworks.patch @@ -0,0 +1,39 @@ +diff --git a/common/SharedMemoryAndroid.cpp b/common/SharedMemoryAndroid.cpp +index 4730de36b..896d643e7 100644 +--- a/common/SharedMemoryAndroid.cpp ++++ b/common/SharedMemoryAndroid.cpp +@@ -160,8 +160,19 @@ GeneralResult allocateSharedMemory(size_t size) { + return createSharedMemoryFromUniqueFd(size, prot, std::move(fd), offset); + } + +-GeneralResult map(const Memory::Ashmem& /*memory*/) { +- return NN_ERROR(ErrorStatus::INVALID_ARGUMENT) << "Cannot map ashmem memory"; ++GeneralResult map(const Memory::Ashmem& memory) { ++ constexpr off64_t offset = 0; ++ constexpr int prot = PROT_READ | PROT_WRITE; ++ std::shared_ptr mapping = ++ base::MappedFile::FromFd(memory.fd, offset, memory.size, prot); ++ if (mapping == nullptr || mapping->data() == nullptr) { ++ return NN_ERROR() << "Can't mmap the file descriptor."; ++ } ++ return Mapping{ ++ .pointer = mapping->data(), ++ .size = memory.size, ++ .context = std::move(mapping), ++ }; + } + + #endif // NN_COMPATIBILITY_LIBRARY_BUILD +diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp +index b91d3ce45..8977dac68 100644 +--- a/runtime/NeuralNetworks.cpp ++++ b/runtime/NeuralNetworks.cpp +@@ -1859,7 +1859,7 @@ int SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation( + #define NNCL_FUNC(symbol) .symbol = symbol + + NnApiSLDriverImplFL5 slDriverImpl{ +- .base{.implFeatureLevel = ANEURALNETWORKS_FEATURE_LEVEL_5}, ++ .base={.implFeatureLevel = ANEURALNETWORKS_FEATURE_LEVEL_5}, + NNCL_FUNC(ANeuralNetworksBurst_create), + NNCL_FUNC(ANeuralNetworksBurst_free), + NNCL_FUNC(ANeuralNetworksCompilation_createForDevices), diff --git a/shim/sl/scripts/NeuralNetworks_cpp.patch b/shim/sl/scripts/NeuralNetworks_cpp.patch deleted file mode 100644 index 40bdc07e8b..0000000000 --- a/shim/sl/scripts/NeuralNetworks_cpp.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp -index b91d3ce45..8977dac68 100644 ---- a/runtime/NeuralNetworks.cpp -+++ b/runtime/NeuralNetworks.cpp -@@ -1859,7 +1859,7 @@ int SL_ANeuralNetworksDevice_forEachVendorExtensionOperandTypeInformation( - #define NNCL_FUNC(symbol) .symbol = symbol - - NnApiSLDriverImplFL5 slDriverImpl{ -- .base{.implFeatureLevel = ANEURALNETWORKS_FEATURE_LEVEL_5}, -+ .base={.implFeatureLevel = ANEURALNETWORKS_FEATURE_LEVEL_5}, - NNCL_FUNC(ANeuralNetworksBurst_create), - NNCL_FUNC(ANeuralNetworksBurst_free), - NNCL_FUNC(ANeuralNetworksCompilation_createForDevices), diff --git a/shim/sl/scripts/modify_aosp_libs.sh b/shim/sl/scripts/modify_aosp_libs.sh index c991678dd2..b10a36cfd1 100755 --- a/shim/sl/scripts/modify_aosp_libs.sh +++ b/shim/sl/scripts/modify_aosp_libs.sh @@ -11,12 +11,12 @@ pushd "${AOSP_DIR}/system/libbase/" popd pushd "${AOSP_DIR}/packages/modules/NeuralNetworks/" - echo "Applying NeuralNetworks.cpp patch" - git apply "${SCRIPT_PATH}/NeuralNetworks_cpp.patch" + echo "Applying NeuralNetworks patch" + git apply "${SCRIPT_PATH}/NeuralNetworks.patch" echo " Checking out master version of SharedMemory.h/.cpp which includes convertRequestFromPointerToShared" - git checkout master -- common/SharedMemory.cpp - git checkout master -- common/include/nnapi/SharedMemory.h + git checkout 736317504083629929373bd349f667893bc8204c -- common/SharedMemory.cpp + git checkout 736317504083629929373bd349f667893bc8204c -- common/include/nnapi/SharedMemory.h popd pushd "${SCRIPT_PATH}/.." -- cgit v1.2.1