diff --git a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp index ff21960e6a..29fdee4398 100644 --- a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.cpp @@ -78,13 +78,6 @@ enum class MemoryType { SHARED, DEVICE }; enum class IOType { INPUT, OUTPUT }; -static void waitForSyncFence(int syncFd) { - constexpr int kInfiniteTimeout = -1; - ASSERT_GT(syncFd, 0); - int r = sync_wait(syncFd, kInfiniteTimeout); - ASSERT_GE(r, 0); -} - struct TestConfig { Executor executor; MeasureTiming measureTiming; @@ -275,6 +268,13 @@ void copyTestBuffers(const std::vector& buffers, uint8_t* out } // namespace +void waitForSyncFence(int syncFd) { + constexpr int kInfiniteTimeout = -1; + ASSERT_GT(syncFd, 0); + int r = sync_wait(syncFd, kInfiniteTimeout); + ASSERT_GE(r, 0); +} + Model createModel(const TestModel& testModel) { uint32_t constCopySize = 0; uint32_t constRefSize = 0; diff --git a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.h b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.h index 834d335f50..38d6486478 100644 --- a/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.h +++ b/neuralnetworks/1.3/vts/functional/GeneratedTestHarness.h @@ -77,6 +77,8 @@ enum class TestKind { void EvaluatePreparedModel(const sp& device, const sp& preparedModel, const test_helper::TestModel& testModel, TestKind testKind); +void waitForSyncFence(int syncFd); + } // namespace android::hardware::neuralnetworks::V1_3::vts::functional #endif // ANDROID_HARDWARE_NEURALNETWORKS_V1_3_GENERATED_TEST_HARNESS_H diff --git a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp index 08c1b35510..3c0c8858b6 100644 --- a/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp +++ b/neuralnetworks/1.3/vts/functional/MemoryDomainTests.cpp @@ -864,6 +864,9 @@ class MemoryDomainExecutionTest case Executor::SYNC: EXPECT_EQ(executeSync(preparedModel, request), expectedStatus); break; + case Executor::FENCED: + EXPECT_EQ(executeFenced(preparedModel, request), expectedStatus); + break; default: ASSERT_TRUE(false); } @@ -912,7 +915,38 @@ class MemoryDomainExecutionTest return executionStatus; } - // TODO(xusongw): Add executeFenced. + ErrorStatus executeFenced(const sp& preparedModel, const Request& request) { + ErrorStatus executionStatus; + hidl_handle syncFenceHandle; + sp fencedCallback; + const auto callbackFunc = [&executionStatus, &syncFenceHandle, &fencedCallback]( + ErrorStatus error, const hidl_handle& handle, + const sp& callback) { + executionStatus = error; + syncFenceHandle = handle; + fencedCallback = callback; + }; + Return ret = preparedModel->executeFenced(request, {}, MeasureTiming::NO, {}, {}, {}, + callbackFunc); + EXPECT_TRUE(ret.isOk()); + if (executionStatus != ErrorStatus::NONE) { + EXPECT_EQ(syncFenceHandle.getNativeHandle(), nullptr); + EXPECT_EQ(fencedCallback, nullptr); + return executionStatus; + } + if (syncFenceHandle.getNativeHandle()) { + waitForSyncFence(syncFenceHandle.getNativeHandle()->data[0]); + } + EXPECT_NE(fencedCallback, nullptr); + ret = fencedCallback->getExecutionInfo( + [&executionStatus](ErrorStatus error, Timing t, Timing) { + executionStatus = error; + EXPECT_EQ(UINT64_MAX, t.timeOnDevice); + EXPECT_EQ(UINT64_MAX, t.timeInDriver); + }); + EXPECT_TRUE(ret.isOk()); + return executionStatus; + } const Executor kExecutor = std::get(GetParam()); }; @@ -1111,6 +1145,9 @@ TEST_P(MemoryDomainExecutionTest, SameRequestMultipleRoles) { } TEST_P(MemoryDomainExecutionTest, InvalidDimensions) { + // FENCED execution does not support dynamic shape. + if (kExecutor == Executor::FENCED) return; + TestOperand testOperand = kTestOperand; testOperand.dimensions[0] = 0; auto preparedModel = createConvPreparedModel(testOperand); @@ -1148,7 +1185,7 @@ TEST_P(MemoryDomainExecutionTest, InvalidDimensions) { ErrorStatus::GENERAL_FAILURE); } -const auto kExecutorChoices = testing::Values(Executor::ASYNC, Executor::SYNC); +const auto kExecutorChoices = testing::Values(Executor::ASYNC, Executor::SYNC, Executor::FENCED); std::string printMemoryDomainExecutionTest( const testing::TestParamInfo& info) {