Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b6edcbb authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge changes from topic "executeFenced_tests" into rvc-dev am: 3930e637 am:...

Merge changes from topic "executeFenced_tests" into rvc-dev am: 3930e637 am: 9573104f am: c6c7e332

Change-Id: I4394590709ccac10cfa6adb51876049ed718c2c9
parents d9771d2d c6c7e332
Loading
Loading
Loading
Loading
+37 −17
Original line number Diff line number Diff line
@@ -626,21 +626,28 @@ void EvaluatePreparedModel(const sp<IDevice>& device, const sp<IPreparedModel>&
            ErrorStatus result;
            hidl_handle syncFenceHandle;
            sp<IFencedExecutionCallback> fencedCallback;
            Return<void> ret = preparedModel->executeFenced(
                    request, {}, testConfig.measureTiming, {}, loopTimeoutDuration, {},
                    [&result, &syncFenceHandle, &fencedCallback](
            auto callbackFunc = [&result, &syncFenceHandle, &fencedCallback](
                                        ErrorStatus error, const hidl_handle& handle,
                                        const sp<IFencedExecutionCallback>& callback) {
                result = error;
                syncFenceHandle = handle;
                fencedCallback = callback;
                    });
            };
            Return<void> ret =
                    preparedModel->executeFenced(request, {}, testConfig.measureTiming, {},
                                                 loopTimeoutDuration, {}, callbackFunc);
            ASSERT_TRUE(ret.isOk());
            if (result != ErrorStatus::NONE) {
                ASSERT_EQ(syncFenceHandle.getNativeHandle(), nullptr);
                ASSERT_EQ(fencedCallback, nullptr);
                executionStatus = ErrorStatus::GENERAL_FAILURE;
                executionStatus = result;
            } else if (syncFenceHandle.getNativeHandle()) {
                // If a sync fence is returned, try start another run waiting for the sync fence.
                ret = preparedModel->executeFenced(request, {syncFenceHandle},
                                                   testConfig.measureTiming, {},
                                                   loopTimeoutDuration, {}, callbackFunc);
                ASSERT_TRUE(ret.isOk());
                ASSERT_EQ(result, ErrorStatus::NONE);
                waitForSyncFence(syncFenceHandle.getNativeHandle()->data[0]);
            }
            if (result == ErrorStatus::NONE) {
@@ -656,9 +663,7 @@ void EvaluatePreparedModel(const sp<IDevice>& device, const sp<IPreparedModel>&
        }
    }

    // The driver is allowed to reject executeFenced, and if they do, we should skip.
    if ((testConfig.outputType != OutputType::FULLY_SPECIFIED ||
         testConfig.executor == Executor::FENCED) &&
    if (testConfig.outputType != OutputType::FULLY_SPECIFIED &&
        executionStatus == ErrorStatus::GENERAL_FAILURE) {
        if (skipped != nullptr) {
            *skipped = true;
@@ -691,12 +696,22 @@ void EvaluatePreparedModel(const sp<IDevice>& device, const sp<IPreparedModel>&
                        outputShapes.size() == testModel.main.outputIndexes.size());
            break;
        case OutputType::UNSPECIFIED:
            if (testConfig.executor == Executor::FENCED) {
                // For Executor::FENCED, the output shape must be fully specified.
                ASSERT_EQ(ErrorStatus::INVALID_ARGUMENT, executionStatus);
                return;
            }
            // If the model output operands are not fully specified, outputShapes must have
            // the same number of elements as the number of outputs.
            ASSERT_EQ(ErrorStatus::NONE, executionStatus);
            ASSERT_EQ(outputShapes.size(), testModel.main.outputIndexes.size());
            break;
        case OutputType::INSUFFICIENT:
            if (testConfig.executor == Executor::FENCED) {
                // For Executor::FENCED, the output shape must be fully specified.
                ASSERT_EQ(ErrorStatus::INVALID_ARGUMENT, executionStatus);
                return;
            }
            ASSERT_EQ(ErrorStatus::OUTPUT_INSUFFICIENT_SIZE, executionStatus);
            ASSERT_EQ(outputShapes.size(), testModel.main.outputIndexes.size());
            ASSERT_FALSE(outputShapes[0].isSufficient);
@@ -739,12 +754,12 @@ void EvaluatePreparedModel(const sp<IDevice>& device, const sp<IPreparedModel>&
        case TestKind::DYNAMIC_SHAPE: {
            outputTypesList = {OutputType::UNSPECIFIED, OutputType::INSUFFICIENT};
            measureTimingList = {MeasureTiming::NO, MeasureTiming::YES};
            executorList = {Executor::ASYNC, Executor::SYNC, Executor::BURST};
            executorList = {Executor::ASYNC, Executor::SYNC, Executor::BURST, Executor::FENCED};
        } break;
        case TestKind::MEMORY_DOMAIN: {
            outputTypesList = {OutputType::FULLY_SPECIFIED};
            measureTimingList = {MeasureTiming::NO};
            executorList = {Executor::ASYNC, Executor::SYNC};
            executorList = {Executor::ASYNC, Executor::SYNC, Executor::FENCED};
            memoryType = MemoryType::DEVICE;
        } break;
        case TestKind::FENCED_COMPUTE: {
@@ -921,8 +936,13 @@ INSTANTIATE_GENERATED_TEST(DynamicOutputShapeTest, [](const TestModel& testModel
INSTANTIATE_GENERATED_TEST(MemoryDomainTest,
                           [](const TestModel& testModel) { return !testModel.expectFailure; });

INSTANTIATE_GENERATED_TEST(FencedComputeTest,
                           [](const TestModel& testModel) { return !testModel.expectFailure; });
INSTANTIATE_GENERATED_TEST(FencedComputeTest, [](const TestModel& testModel) {
    return !testModel.expectFailure &&
           std::all_of(testModel.main.outputIndexes.begin(), testModel.main.outputIndexes.end(),
                       [&testModel](uint32_t index) {
                           return testModel.main.operands[index].data.size() > 0;
                       });
});

INSTANTIATE_GENERATED_TEST(QuantizationCouplingTest, [](const TestModel& testModel) {
    return testModel.hasQuant8CoupledOperands() && testModel.main.operations.size() == 1;