diff options
author | Michael Butler <butlermichael@google.com> | 2021-03-25 15:27:38 -0700 |
---|---|---|
committer | Michael Butler <butlermichael@google.com> | 2021-04-07 12:54:45 -0700 |
commit | f03ebd93b9a547538b43014a9be6cbb983676c91 (patch) | |
tree | 0a09f3fa3bbf2ff8dbe67a43c749761fab53b7e1 /neuralnetworks/aidl/utils/src/Utils.cpp | |
parent | dd53d04d8c19515223f86129ca043614e196840e (diff) |
Update NN utility code and VTS tests with new Memory type
This CL fixes the compiler errors that arose of changing the Memory
representation of the NN AIDL HAL, and updates the conversion and
utility code to work with the new Memory type.
This change also makes libaidlcommonsupport available to apex modules at
min sdk level 29.
Bug: 183118727
Test: mma
Test: VtsHalNeuralnetworksTargetTest
Change-Id: Ief565473b4d82e0bb43785fc3b8275b16bd26cf6
Merged-In: Ief565473b4d82e0bb43785fc3b8275b16bd26cf6
(cherry picked from commit b0fcb3927d848e9721f05a458b5d6d4d2cb8079d)
Diffstat (limited to 'neuralnetworks/aidl/utils/src/Utils.cpp')
-rw-r--r-- | neuralnetworks/aidl/utils/src/Utils.cpp | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/neuralnetworks/aidl/utils/src/Utils.cpp b/neuralnetworks/aidl/utils/src/Utils.cpp index 95516c854b..03407be4ce 100644 --- a/neuralnetworks/aidl/utils/src/Utils.cpp +++ b/neuralnetworks/aidl/utils/src/Utils.cpp @@ -16,12 +16,20 @@ #include "Utils.h" +#include <aidl/android/hardware/common/Ashmem.h> +#include <aidl/android/hardware/common/MappableFile.h> +#include <aidl/android/hardware/graphics/common/HardwareBuffer.h> +#include <android/binder_auto_utils.h> #include <android/binder_status.h> #include <nnapi/Result.h> +#include <nnapi/SharedMemory.h> namespace aidl::android::hardware::neuralnetworks::utils { namespace { +nn::GeneralResult<ndk::ScopedFileDescriptor> clone(const ndk::ScopedFileDescriptor& fd); +using utils::clone; + template <typename Type> nn::GeneralResult<std::vector<Type>> cloneVec(const std::vector<Type>& arguments) { std::vector<Type> clonedObjects; @@ -37,24 +45,52 @@ nn::GeneralResult<std::vector<Type>> clone(const std::vector<Type>& arguments) { return cloneVec(arguments); } +nn::GeneralResult<ndk::ScopedFileDescriptor> clone(const ndk::ScopedFileDescriptor& fd) { + auto duplicatedFd = NN_TRY(nn::dupFd(fd.get())); + return ndk::ScopedFileDescriptor(duplicatedFd.release()); +} + +nn::GeneralResult<common::NativeHandle> clone(const common::NativeHandle& handle) { + return common::NativeHandle{ + .fds = NN_TRY(cloneVec(handle.fds)), + .ints = handle.ints, + }; +} + } // namespace nn::GeneralResult<Memory> clone(const Memory& memory) { - common::NativeHandle nativeHandle; - nativeHandle.ints = memory.handle.ints; - nativeHandle.fds.reserve(memory.handle.fds.size()); - for (const auto& fd : memory.handle.fds) { - const int newFd = dup(fd.get()); - if (newFd < 0) { - return NN_ERROR() << "Couldn't dup a file descriptor"; + switch (memory.getTag()) { + case Memory::Tag::ashmem: { + const auto& ashmem = memory.get<Memory::Tag::ashmem>(); + auto handle = common::Ashmem{ + .fd = NN_TRY(clone(ashmem.fd)), + .size = ashmem.size, + }; + return Memory::make<Memory::Tag::ashmem>(std::move(handle)); + } + case Memory::Tag::mappableFile: { + const auto& memFd = memory.get<Memory::Tag::mappableFile>(); + auto handle = common::MappableFile{ + .length = memFd.length, + .prot = memFd.prot, + .fd = NN_TRY(clone(memFd.fd)), + .offset = memFd.offset, + }; + return Memory::make<Memory::Tag::mappableFile>(std::move(handle)); + } + case Memory::Tag::hardwareBuffer: { + const auto& hardwareBuffer = memory.get<Memory::Tag::hardwareBuffer>(); + auto handle = graphics::common::HardwareBuffer{ + .description = hardwareBuffer.description, + .handle = NN_TRY(clone(hardwareBuffer.handle)), + }; + return Memory::make<Memory::Tag::hardwareBuffer>(std::move(handle)); } - nativeHandle.fds.emplace_back(newFd); } - return Memory{ - .handle = std::move(nativeHandle), - .size = memory.size, - .name = memory.name, - }; + return (NN_ERROR() << "Unrecognized Memory::Tag: " << memory.getTag()) + . + operator nn::GeneralResult<Memory>(); } nn::GeneralResult<RequestMemoryPool> clone(const RequestMemoryPool& requestPool) { |