From ff9a5a527a05d0638fca6010fefa9e7420d1f7ab Mon Sep 17 00:00:00 2001 From: Michael Butler Date: Fri, 15 Oct 2021 16:23:20 -0700 Subject: [PATCH] Allow implicit conversions for NN errors -- hal This change allows GeneralErrors to be created from a string and allows ExecutionErrors to be created from a string or a GeneralError. This makes error handling more terse, removing the need for helper functions such as makeGeneralFailure or makeExecutionFailure. Bug: N/A Test: mma Change-Id: I8c5e80a2eb4f399fad64aab763fe6fa08cf8d1db --- .../1.0/utils/include/nnapi/hal/1.0/Utils.h | 4 +- .../1.0/utils/src/PreparedModel.cpp | 9 ++-- .../1.1/utils/include/nnapi/hal/1.1/Utils.h | 4 +- .../1.2/utils/include/nnapi/hal/1.2/Utils.h | 4 +- neuralnetworks/1.2/utils/src/Callbacks.cpp | 3 +- neuralnetworks/1.2/utils/src/Conversions.cpp | 5 +- .../utils/src/ExecutionBurstController.cpp | 21 +++----- .../1.2/utils/src/ExecutionBurstServer.cpp | 15 ++---- .../1.2/utils/src/PreparedModel.cpp | 11 ++-- .../1.3/utils/include/nnapi/hal/1.3/Utils.h | 4 +- neuralnetworks/1.3/utils/src/Callbacks.cpp | 3 +- neuralnetworks/1.3/utils/src/Conversions.cpp | 5 +- neuralnetworks/1.3/utils/src/Execution.cpp | 2 +- .../1.3/utils/src/PreparedModel.cpp | 19 +++---- .../aidl/utils/include/nnapi/hal/aidl/Utils.h | 5 +- neuralnetworks/aidl/utils/src/Burst.cpp | 22 ++++---- neuralnetworks/aidl/utils/src/Conversions.cpp | 5 +- neuralnetworks/aidl/utils/src/Execution.cpp | 2 +- .../aidl/utils/src/PreparedModel.cpp | 20 ++++---- .../utils/adapter/src/PreparedModel.cpp | 51 +++++++++++-------- .../common/include/nnapi/hal/HandleError.h | 32 ------------ .../utils/common/src/CommonUtils.cpp | 2 +- 22 files changed, 99 insertions(+), 149 deletions(-) diff --git a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h index 1baabdf562..360b338c0e 100644 --- a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h +++ b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/Utils.h @@ -50,8 +50,8 @@ bool valid(const Type& halObject) { } template -nn::GeneralResult compliantVersion(const Type& canonical) { - const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(canonical))); +nn::Result compliantVersion(const Type& canonical) { + const auto version = NN_TRY(nn::validate(canonical)); if (version > kVersion) { return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; } diff --git a/neuralnetworks/1.0/utils/src/PreparedModel.cpp b/neuralnetworks/1.0/utils/src/PreparedModel.cpp index 00970c090d..3060c652da 100644 --- a/neuralnetworks/1.0/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.0/utils/src/PreparedModel.cpp @@ -63,12 +63,11 @@ nn::ExecutionResult, nn::Timing>> Prepare // Ensure that request is ready for IPC. std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); - const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); + const auto hidlRequest = NN_TRY(convert(requestInShared)); return executeInternal(hidlRequest, relocation); } diff --git a/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h b/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h index a8cf8cf7b9..09d9fe89a7 100644 --- a/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h +++ b/neuralnetworks/1.1/utils/include/nnapi/hal/1.1/Utils.h @@ -52,8 +52,8 @@ bool valid(const Type& halObject) { } template -nn::GeneralResult compliantVersion(const Type& canonical) { - const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(canonical))); +nn::Result compliantVersion(const Type& canonical) { + const auto version = NN_TRY(nn::validate(canonical)); if (version > kVersion) { return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; } diff --git a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h index 09691b65ee..5c3b8a743c 100644 --- a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h +++ b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/Utils.h @@ -61,8 +61,8 @@ bool valid(const Type& halObject) { } template -nn::GeneralResult compliantVersion(const Type& canonical) { - const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(canonical))); +nn::Result compliantVersion(const Type& canonical) { + const auto version = NN_TRY(nn::validate(canonical)); if (version > kVersion) { return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; } diff --git a/neuralnetworks/1.2/utils/src/Callbacks.cpp b/neuralnetworks/1.2/utils/src/Callbacks.cpp index 9f54bb12dd..01b5e12387 100644 --- a/neuralnetworks/1.2/utils/src/Callbacks.cpp +++ b/neuralnetworks/1.2/utils/src/Callbacks.cpp @@ -75,8 +75,7 @@ nn::ExecutionResult, nn::Timing>> executi << "execution failed with " << toString(status); } HANDLE_HAL_STATUS(status) << "execution failed with " << toString(status); - return hal::utils::makeExecutionFailure( - convertExecutionGeneralResultsHelper(outputShapes, timing)); + return convertExecutionGeneralResultsHelper(outputShapes, timing); } Return PreparedModelCallback::notify(V1_0::ErrorStatus status, diff --git a/neuralnetworks/1.2/utils/src/Conversions.cpp b/neuralnetworks/1.2/utils/src/Conversions.cpp index 29945b75e5..6a80b42db9 100644 --- a/neuralnetworks/1.2/utils/src/Conversions.cpp +++ b/neuralnetworks/1.2/utils/src/Conversions.cpp @@ -120,9 +120,8 @@ GeneralResult unvalidatedConvert(const hal::V1_2::Capabilities& ca NN_TRY(unvalidatedConvert(capabilities.relaxedFloat32toFloat16PerformanceTensor)); auto operandPerformance = NN_TRY(unvalidatedConvert(capabilities.operandPerformance)); - auto table = NN_TRY(hal::utils::makeGeneralFailure( - Capabilities::OperandPerformanceTable::create(std::move(operandPerformance)), - nn::ErrorStatus::GENERAL_FAILURE)); + auto table = + NN_TRY(Capabilities::OperandPerformanceTable::create(std::move(operandPerformance))); return Capabilities{ .relaxedFloat32toFloat16PerformanceScalar = relaxedFloat32toFloat16PerformanceScalar, diff --git a/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp b/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp index b4b6f680d3..60dfe525ec 100644 --- a/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp +++ b/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp @@ -317,8 +317,7 @@ ExecutionBurstController::execute(const nn::Request& request, nn::MeasureTiming // if the request is valid but of a higher version than what's supported in burst execution, // fall back to another execution path - if (const auto version = NN_TRY(hal::utils::makeExecutionFailure(nn::validate(request))); - version > nn::Version::ANDROID_Q) { + if (const auto version = NN_TRY(nn::validate(request)); version > nn::Version::ANDROID_Q) { // fallback to another execution path if the packet could not be sent return kPreparedModel->execute(request, measure, deadline, loopTimeoutDuration); } @@ -326,17 +325,15 @@ ExecutionBurstController::execute(const nn::Request& request, nn::MeasureTiming // ensure that request is ready for IPC std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); // clear pools field of request, as they will be provided via slots const auto requestWithoutPools = nn::Request{ .inputs = requestInShared.inputs, .outputs = requestInShared.outputs, .pools = {}}; - auto hidlRequest = NN_TRY( - hal::utils::makeExecutionFailure(V1_0::utils::unvalidatedConvert(requestWithoutPools))); - const auto hidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); + auto hidlRequest = NN_TRY(V1_0::utils::unvalidatedConvert(requestWithoutPools)); + const auto hidlMeasure = NN_TRY(convert(measure)); std::vector slots; std::vector holds; @@ -364,8 +361,7 @@ nn::GeneralResult ExecutionBurstController::createReusableE // if the request is valid but of a higher version than what's supported in burst execution, // fall back to another execution path - if (const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(request))); - version > nn::Version::ANDROID_Q) { + if (const auto version = NN_TRY(nn::validate(request)); version > nn::Version::ANDROID_Q) { // fallback to another execution path if the packet could not be sent return kPreparedModel->createReusableExecution(request, measure, loopTimeoutDuration); } @@ -427,8 +423,7 @@ ExecutionBurstController::executeInternal(const std::vector& re } // get result packet - const auto [status, outputShapes, timing] = - NN_TRY(hal::utils::makeExecutionFailure(mResultChannelReceiver->getBlocking())); + const auto [status, outputShapes, timing] = NN_TRY(mResultChannelReceiver->getBlocking()); if (relocation.output) { relocation.output->flush(); diff --git a/neuralnetworks/1.2/utils/src/ExecutionBurstServer.cpp b/neuralnetworks/1.2/utils/src/ExecutionBurstServer.cpp index c67159e895..65ec7f5532 100644 --- a/neuralnetworks/1.2/utils/src/ExecutionBurstServer.cpp +++ b/neuralnetworks/1.2/utils/src/ExecutionBurstServer.cpp @@ -45,8 +45,6 @@ namespace android::hardware::neuralnetworks::V1_2::utils { namespace { -using neuralnetworks::utils::makeExecutionFailure; - constexpr V1_2::Timing kNoTiming = {std::numeric_limits::max(), std::numeric_limits::max()}; @@ -241,28 +239,25 @@ nn::ExecutionResult, Timing>> ExecutionBurstServ "ExecutionBurstServer getting memory, executing, and returning results"); // ensure executor with cache has required memory - const auto cacheEntries = - NN_TRY(makeExecutionFailure(mMemoryCache.getCacheEntries(slotsOfPools))); + const auto cacheEntries = NN_TRY(mMemoryCache.getCacheEntries(slotsOfPools)); // convert request, populating its pools // This code performs an unvalidated convert because the request object without its pools is // invalid because it is incomplete. Instead, the validation is performed after the memory pools // have been added to the request. - auto canonicalRequest = - NN_TRY(makeExecutionFailure(nn::unvalidatedConvert(requestWithoutPools))); + auto canonicalRequest = NN_TRY(nn::unvalidatedConvert(requestWithoutPools)); CHECK(canonicalRequest.pools.empty()); std::transform(cacheEntries.begin(), cacheEntries.end(), std::back_inserter(canonicalRequest.pools), [](const auto& cacheEntry) { return cacheEntry.first; }); - NN_TRY(makeExecutionFailure(validate(canonicalRequest))); + NN_TRY(validate(canonicalRequest)); - nn::MeasureTiming canonicalMeasure = NN_TRY(makeExecutionFailure(nn::convert(measure))); + nn::MeasureTiming canonicalMeasure = NN_TRY(nn::convert(measure)); const auto [outputShapes, timing] = NN_TRY(mBurstExecutor->execute(canonicalRequest, canonicalMeasure, {}, {})); - return std::make_pair(NN_TRY(makeExecutionFailure(convert(outputShapes))), - NN_TRY(makeExecutionFailure(convert(timing)))); + return std::make_pair(NN_TRY(convert(outputShapes)), NN_TRY(convert(timing))); } } // namespace android::hardware::neuralnetworks::V1_2::utils diff --git a/neuralnetworks/1.2/utils/src/PreparedModel.cpp b/neuralnetworks/1.2/utils/src/PreparedModel.cpp index d0ef36e7b5..c26118410d 100644 --- a/neuralnetworks/1.2/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.2/utils/src/PreparedModel.cpp @@ -95,13 +95,12 @@ nn::ExecutionResult, nn::Timing>> Prepare // Ensure that request is ready for IPC. std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); - const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); - const auto hidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); + const auto hidlRequest = NN_TRY(convert(requestInShared)); + const auto hidlMeasure = NN_TRY(convert(measure)); return executeInternal(hidlRequest, hidlMeasure, relocation); } diff --git a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h index 1d76caaba6..28525bd450 100644 --- a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h +++ b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Utils.h @@ -61,8 +61,8 @@ bool valid(const Type& halObject) { } template -nn::GeneralResult compliantVersion(const Type& canonical) { - const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(canonical))); +nn::Result compliantVersion(const Type& canonical) { + const auto version = NN_TRY(nn::validate(canonical)); if (version > kVersion) { return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; } diff --git a/neuralnetworks/1.3/utils/src/Callbacks.cpp b/neuralnetworks/1.3/utils/src/Callbacks.cpp index 8e9fb833b1..156216f594 100644 --- a/neuralnetworks/1.3/utils/src/Callbacks.cpp +++ b/neuralnetworks/1.3/utils/src/Callbacks.cpp @@ -91,8 +91,7 @@ nn::ExecutionResult, nn::Timing>> executi << "execution failed with " << toString(status); } HANDLE_HAL_STATUS(status) << "execution failed with " << toString(status); - return hal::utils::makeExecutionFailure( - convertExecutionGeneralResultsHelper(outputShapes, timing)); + return convertExecutionGeneralResultsHelper(outputShapes, timing); } Return PreparedModelCallback::notify(V1_0::ErrorStatus status, diff --git a/neuralnetworks/1.3/utils/src/Conversions.cpp b/neuralnetworks/1.3/utils/src/Conversions.cpp index 11225cf2cb..b35b2cdf89 100644 --- a/neuralnetworks/1.3/utils/src/Conversions.cpp +++ b/neuralnetworks/1.3/utils/src/Conversions.cpp @@ -131,9 +131,8 @@ GeneralResult unvalidatedConvert(const hal::V1_3::Capabilities& ca } auto operandPerformance = NN_TRY(unvalidatedConvert(capabilities.operandPerformance)); - auto table = NN_TRY(hal::utils::makeGeneralFailure( - Capabilities::OperandPerformanceTable::create(std::move(operandPerformance)), - nn::ErrorStatus::GENERAL_FAILURE)); + auto table = + NN_TRY(Capabilities::OperandPerformanceTable::create(std::move(operandPerformance))); return Capabilities{ .relaxedFloat32toFloat16PerformanceScalar = NN_TRY( diff --git a/neuralnetworks/1.3/utils/src/Execution.cpp b/neuralnetworks/1.3/utils/src/Execution.cpp index 3d17cc3ef4..4dc0ddfc0d 100644 --- a/neuralnetworks/1.3/utils/src/Execution.cpp +++ b/neuralnetworks/1.3/utils/src/Execution.cpp @@ -65,7 +65,7 @@ Execution::Execution(PrivateConstructorTag /*tag*/, nn::ExecutionResult, nn::Timing>> Execution::compute( const nn::OptionalTimePoint& deadline) const { - const auto hidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); + const auto hidlDeadline = NN_TRY(convert(deadline)); return kPreparedModel->executeInternal(kRequest, kMeasure, hidlDeadline, kLoopTimeoutDuration, kRelocation); } diff --git a/neuralnetworks/1.3/utils/src/PreparedModel.cpp b/neuralnetworks/1.3/utils/src/PreparedModel.cpp index 1623de5e9f..d5dee9d34b 100644 --- a/neuralnetworks/1.3/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.3/utils/src/PreparedModel.cpp @@ -62,8 +62,7 @@ nn::GeneralResult> fence auto resultSyncFence = nn::SyncFence::createAsSignaled(); if (syncFence.getNativeHandle() != nullptr) { auto sharedHandle = NN_TRY(nn::convert(syncFence)); - resultSyncFence = NN_TRY(hal::utils::makeGeneralFailure( - nn::SyncFence::create(std::move(sharedHandle)), nn::ErrorStatus::GENERAL_FAILURE)); + resultSyncFence = NN_TRY(nn::SyncFence::create(std::move(sharedHandle))); } if (callback == nullptr) { @@ -141,16 +140,14 @@ nn::ExecutionResult, nn::Timing>> Prepare // Ensure that request is ready for IPC. std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); - const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); - const auto hidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); - const auto hidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); - const auto hidlLoopTimeoutDuration = - NN_TRY(hal::utils::makeExecutionFailure(convert(loopTimeoutDuration))); + const auto hidlRequest = NN_TRY(convert(requestInShared)); + const auto hidlMeasure = NN_TRY(convert(measure)); + const auto hidlDeadline = NN_TRY(convert(deadline)); + const auto hidlLoopTimeoutDuration = NN_TRY(convert(loopTimeoutDuration)); return executeInternal(hidlRequest, hidlMeasure, hidlDeadline, hidlLoopTimeoutDuration, relocation); diff --git a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h index 316d34fdfe..1b149e452b 100644 --- a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h +++ b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Utils.h @@ -50,9 +50,8 @@ bool valid(const Type& halObject) { } template -nn::GeneralResult compliantVersion(const Type& canonical) { - const auto version = NN_TRY(::android::hardware::neuralnetworks::utils::makeGeneralFailure( - nn::validate(canonical))); +nn::Result compliantVersion(const Type& canonical) { + const auto version = NN_TRY(nn::validate(canonical)); if (version > kVersion) { return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; } diff --git a/neuralnetworks/aidl/utils/src/Burst.cpp b/neuralnetworks/aidl/utils/src/Burst.cpp index 800ac32944..c59c10bedd 100644 --- a/neuralnetworks/aidl/utils/src/Burst.cpp +++ b/neuralnetworks/aidl/utils/src/Burst.cpp @@ -176,16 +176,14 @@ nn::ExecutionResult, nn::Timing>> Burst:: // Ensure that request is ready for IPC. std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation)); - const auto aidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); - const auto aidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); - const auto aidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); - const auto aidlLoopTimeoutDuration = - NN_TRY(hal::utils::makeExecutionFailure(convert(loopTimeoutDuration))); + const auto aidlRequest = NN_TRY(convert(requestInShared)); + const auto aidlMeasure = NN_TRY(convert(measure)); + const auto aidlDeadline = NN_TRY(convert(deadline)); + const auto aidlLoopTimeoutDuration = NN_TRY(convert(loopTimeoutDuration)); std::vector memoryIdentifierTokens; std::vector holds; @@ -233,8 +231,8 @@ nn::ExecutionResult, nn::Timing>> Burst:: return NN_ERROR(nn::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE, std::move(canonicalOutputShapes)) << "execution failed with " << nn::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE; } - auto [outputShapes, timing] = NN_TRY(hal::utils::makeExecutionFailure( - convertExecutionResults(executionResult.outputShapes, executionResult.timing))); + auto [outputShapes, timing] = + NN_TRY(convertExecutionResults(executionResult.outputShapes, executionResult.timing)); if (relocation.output) { relocation.output->flush(); @@ -308,7 +306,7 @@ BurstExecution::BurstExecution(PrivateConstructorTag /*tag*/, std::shared_ptr, nn::Timing>> BurstExecution::compute( const nn::OptionalTimePoint& deadline) const { - const auto aidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); + const auto aidlDeadline = NN_TRY(convert(deadline)); return kBurst->executeInternal(kRequest, kMemoryIdentifierTokens, kMeasure, aidlDeadline, kLoopTimeoutDuration, kRelocation); } diff --git a/neuralnetworks/aidl/utils/src/Conversions.cpp b/neuralnetworks/aidl/utils/src/Conversions.cpp index f0871564d2..ddff3f2cb7 100644 --- a/neuralnetworks/aidl/utils/src/Conversions.cpp +++ b/neuralnetworks/aidl/utils/src/Conversions.cpp @@ -178,9 +178,8 @@ GeneralResult unvalidatedConvert(const aidl_hal::Capabilities& cap } auto operandPerformance = NN_TRY(unvalidatedConvert(capabilities.operandPerformance)); - auto table = NN_TRY(hal::utils::makeGeneralFailure( - Capabilities::OperandPerformanceTable::create(std::move(operandPerformance)), - nn::ErrorStatus::GENERAL_FAILURE)); + auto table = + NN_TRY(Capabilities::OperandPerformanceTable::create(std::move(operandPerformance))); return Capabilities{ .relaxedFloat32toFloat16PerformanceScalar = NN_TRY( diff --git a/neuralnetworks/aidl/utils/src/Execution.cpp b/neuralnetworks/aidl/utils/src/Execution.cpp index 2aee8a6713..13d4f32048 100644 --- a/neuralnetworks/aidl/utils/src/Execution.cpp +++ b/neuralnetworks/aidl/utils/src/Execution.cpp @@ -60,7 +60,7 @@ Execution::Execution(PrivateConstructorTag /*tag*/, nn::ExecutionResult, nn::Timing>> Execution::compute( const nn::OptionalTimePoint& deadline) const { - const auto aidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); + const auto aidlDeadline = NN_TRY(convert(deadline)); return kPreparedModel->executeInternal(kRequest, kMeasure, aidlDeadline, kLoopTimeoutDuration, kRelocation); } diff --git a/neuralnetworks/aidl/utils/src/PreparedModel.cpp b/neuralnetworks/aidl/utils/src/PreparedModel.cpp index f861d74f77..0769016b4c 100644 --- a/neuralnetworks/aidl/utils/src/PreparedModel.cpp +++ b/neuralnetworks/aidl/utils/src/PreparedModel.cpp @@ -78,16 +78,14 @@ nn::ExecutionResult, nn::Timing>> Prepare // Ensure that request is ready for IPC. std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; - const nn::Request& requestInShared = - NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, - &maybeRequestInShared, &relocation))); + const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation)); - const auto aidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); - const auto aidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); - const auto aidlDeadline = NN_TRY(hal::utils::makeExecutionFailure(convert(deadline))); - const auto aidlLoopTimeoutDuration = - NN_TRY(hal::utils::makeExecutionFailure(convert(loopTimeoutDuration))); + const auto aidlRequest = NN_TRY(convert(requestInShared)); + const auto aidlMeasure = NN_TRY(convert(measure)); + const auto aidlDeadline = NN_TRY(convert(deadline)); + const auto aidlLoopTimeoutDuration = NN_TRY(convert(loopTimeoutDuration)); return executeInternal(aidlRequest, aidlMeasure, aidlDeadline, aidlLoopTimeoutDuration, relocation); } @@ -110,8 +108,8 @@ PreparedModel::executeInternal(const Request& request, bool measure, int64_t dea return NN_ERROR(nn::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE, std::move(canonicalOutputShapes)) << "execution failed with " << nn::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE; } - auto [outputShapes, timing] = NN_TRY(hal::utils::makeExecutionFailure( - convertExecutionResults(executionResult.outputShapes, executionResult.timing))); + auto [outputShapes, timing] = + NN_TRY(convertExecutionResults(executionResult.outputShapes, executionResult.timing)); if (relocation.output) { relocation.output->flush(); diff --git a/neuralnetworks/utils/adapter/src/PreparedModel.cpp b/neuralnetworks/utils/adapter/src/PreparedModel.cpp index 8968c2cc91..7397defb34 100644 --- a/neuralnetworks/utils/adapter/src/PreparedModel.cpp +++ b/neuralnetworks/utils/adapter/src/PreparedModel.cpp @@ -57,6 +57,15 @@ auto convertInput(const Type& object) -> decltype(nn::convert(std::declval return result; } +nn::GeneralResult validateRequestForModel(const nn::Request& request, + const nn::Model& model) { + nn::GeneralResult version = nn::validateRequestForModel(request, model); + if (!version.ok()) { + version.error().code = nn::ErrorStatus::INVALID_ARGUMENT; + } + return version; +} + class FencedExecutionCallback final : public V1_3::IFencedExecutionCallback { public: explicit FencedExecutionCallback(const nn::ExecuteFencedInfoCallback& callback) @@ -148,8 +157,7 @@ nn::GeneralResult execute(const nn::SharedPreparedModel& preparedModel, ui const std::any resource = preparedModel->getUnderlyingResource(); if (const auto* model = std::any_cast(&resource)) { CHECK(*model != nullptr); - NN_TRY(utils::makeGeneralFailure(nn::validateRequestForModel(nnRequest, **model), - nn::ErrorStatus::INVALID_ARGUMENT)); + NN_TRY(adapter::validateRequestForModel(nnRequest, **model)); } Task task = [preparedModel, nnRequest = std::move(nnRequest), callback] { @@ -175,8 +183,7 @@ nn::GeneralResult execute_1_2(const nn::SharedPreparedModel& preparedModel const std::any resource = preparedModel->getUnderlyingResource(); if (const auto* model = std::any_cast(&resource)) { CHECK(*model != nullptr); - NN_TRY(utils::makeGeneralFailure(nn::validateRequestForModel(nnRequest, **model), - nn::ErrorStatus::INVALID_ARGUMENT)); + NN_TRY(adapter::validateRequestForModel(nnRequest, **model)); } Task task = [preparedModel, nnRequest = std::move(nnRequest), nnMeasure, callback] { @@ -206,8 +213,7 @@ nn::GeneralResult execute_1_3(const nn::SharedPreparedModel& preparedModel const std::any resource = preparedModel->getUnderlyingResource(); if (const auto* model = std::any_cast(&resource)) { CHECK(*model != nullptr); - NN_TRY(utils::makeGeneralFailure(nn::validateRequestForModel(nnRequest, **model), - nn::ErrorStatus::INVALID_ARGUMENT)); + NN_TRY(adapter::validateRequestForModel(nnRequest, **model)); } Task task = [preparedModel, nnRequest = std::move(nnRequest), nnMeasure, nnDeadline, @@ -224,14 +230,14 @@ nn::GeneralResult execute_1_3(const nn::SharedPreparedModel& preparedModel nn::ExecutionResult, V1_2::Timing>> executeSynchronously( const nn::SharedPreparedModel& preparedModel, const V1_0::Request& request, V1_2::MeasureTiming measure) { - const auto nnRequest = NN_TRY(utils::makeExecutionFailure(convertInput(request))); - const auto nnMeasure = NN_TRY(utils::makeExecutionFailure(convertInput(measure))); + const auto nnRequest = NN_TRY(convertInput(request)); + const auto nnMeasure = NN_TRY(convertInput(measure)); const auto [outputShapes, timing] = NN_TRY(preparedModel->execute(nnRequest, nnMeasure, {}, {})); - auto hidlOutputShapes = NN_TRY(utils::makeExecutionFailure(V1_2::utils::convert(outputShapes))); - const auto hidlTiming = NN_TRY(utils::makeExecutionFailure(V1_2::utils::convert(timing))); + auto hidlOutputShapes = NN_TRY(V1_2::utils::convert(outputShapes)); + const auto hidlTiming = NN_TRY(V1_2::utils::convert(timing)); return std::make_pair(std::move(hidlOutputShapes), hidlTiming); } @@ -239,29 +245,30 @@ nn::ExecutionResult, V1_2::Timing>> execut const nn::SharedPreparedModel& preparedModel, const V1_3::Request& request, V1_2::MeasureTiming measure, const V1_3::OptionalTimePoint& deadline, const V1_3::OptionalTimeoutDuration& loopTimeoutDuration) { - const auto nnRequest = NN_TRY(utils::makeExecutionFailure(convertInput(request))); - const auto nnMeasure = NN_TRY(utils::makeExecutionFailure(convertInput(measure))); - const auto nnDeadline = NN_TRY(utils::makeExecutionFailure(convertInput(deadline))); - const auto nnLoopTimeoutDuration = - NN_TRY(utils::makeExecutionFailure(convertInput(loopTimeoutDuration))); + const auto nnRequest = NN_TRY(convertInput(request)); + const auto nnMeasure = NN_TRY(convertInput(measure)); + const auto nnDeadline = NN_TRY(convertInput(deadline)); + const auto nnLoopTimeoutDuration = NN_TRY(convertInput(loopTimeoutDuration)); const auto [outputShapes, timing] = NN_TRY(preparedModel->execute(nnRequest, nnMeasure, nnDeadline, nnLoopTimeoutDuration)); - auto hidlOutputShapes = NN_TRY(utils::makeExecutionFailure(V1_3::utils::convert(outputShapes))); - const auto hidlTiming = NN_TRY(utils::makeExecutionFailure(V1_3::utils::convert(timing))); + auto hidlOutputShapes = NN_TRY(V1_3::utils::convert(outputShapes)); + const auto hidlTiming = NN_TRY(V1_3::utils::convert(timing)); return std::make_pair(std::move(hidlOutputShapes), hidlTiming); } nn::GeneralResult> convertSyncFences( const hidl_vec& handles) { + auto nnHandles = NN_TRY(convertInput(handles)); std::vector syncFences; syncFences.reserve(handles.size()); - for (const auto& handle : handles) { - auto nativeHandle = NN_TRY(convertInput(handle)); - auto syncFence = NN_TRY(utils::makeGeneralFailure( - nn::SyncFence::create(std::move(nativeHandle)), nn::ErrorStatus::INVALID_ARGUMENT)); - syncFences.push_back(std::move(syncFence)); + for (auto&& handle : nnHandles) { + if (auto syncFence = nn::SyncFence::create(std::move(handle)); !syncFence.ok()) { + return nn::error(nn::ErrorStatus::INVALID_ARGUMENT) << std::move(syncFence).error(); + } else { + syncFences.push_back(std::move(syncFence).value()); + } } return syncFences; } diff --git a/neuralnetworks/utils/common/include/nnapi/hal/HandleError.h b/neuralnetworks/utils/common/include/nnapi/hal/HandleError.h index 209b66304c..e51f916792 100644 --- a/neuralnetworks/utils/common/include/nnapi/hal/HandleError.h +++ b/neuralnetworks/utils/common/include/nnapi/hal/HandleError.h @@ -52,38 +52,6 @@ nn::GeneralResult handleTransportError(const hardware::Return& ret) std::move(result).value(); \ }) -template -nn::GeneralResult makeGeneralFailure( - nn::Result result, nn::ErrorStatus status = nn::ErrorStatus::GENERAL_FAILURE) { - if (!result.has_value()) { - return nn::error(status) << std::move(result).error(); - } - if constexpr (!std::is_same_v) { - return std::move(result).value(); - } else { - return {}; - } -} - -template -nn::ExecutionResult makeExecutionFailure(nn::GeneralResult result) { - if (!result.has_value()) { - const auto [message, status] = std::move(result).error(); - return nn::error(status) << message; - } - if constexpr (!std::is_same_v) { - return std::move(result).value(); - } else { - return {}; - } -} - -template -nn::ExecutionResult makeExecutionFailure( - nn::Result result, nn::ErrorStatus status = nn::ErrorStatus::GENERAL_FAILURE) { - return makeExecutionFailure(makeGeneralFailure(result, status)); -} - #define HANDLE_HAL_STATUS(status) \ if (const auto canonical = ::android::nn::convert(status).value_or( \ ::android::nn::ErrorStatus::GENERAL_FAILURE); \ diff --git a/neuralnetworks/utils/common/src/CommonUtils.cpp b/neuralnetworks/utils/common/src/CommonUtils.cpp index ae02c88285..235ba29d08 100644 --- a/neuralnetworks/utils/common/src/CommonUtils.cpp +++ b/neuralnetworks/utils/common/src/CommonUtils.cpp @@ -333,7 +333,7 @@ nn::GeneralResult> convertRequestFromP nn::GeneralResult> countNumberOfConsumers( size_t numberOfOperands, const std::vector& operations) { - return makeGeneralFailure(nn::countNumberOfConsumers(numberOfOperands, operations)); + return nn::countNumberOfConsumers(numberOfOperands, operations); } nn::GeneralResult createHidlMemoryFromSharedMemory(const nn::SharedMemory& memory) {