diff options
author | Miao Wang <miaowang@google.com> | 2019-01-24 03:07:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-24 03:07:57 +0000 |
commit | eeea25d73105bab339a41f1e948107d300e300f0 (patch) | |
tree | 19614eedfc0bbde14285c62cdd1394e4d9b80bb0 /nn/runtime/test/TestValidation.cpp | |
parent | 60abc3a2cc48c730330750a4b447e5b6506f5631 (diff) | |
parent | a80d37b3551aa2a2ff54189f537f58494c86aa7b (diff) | |
download | ml-eeea25d73105bab339a41f1e948107d300e300f0.tar.gz |
Merge "Add AHardwareBuffer support for NNAPI"
Diffstat (limited to 'nn/runtime/test/TestValidation.cpp')
-rw-r--r-- | nn/runtime/test/TestValidation.cpp | 174 |
1 files changed, 151 insertions, 23 deletions
diff --git a/nn/runtime/test/TestValidation.cpp b/nn/runtime/test/TestValidation.cpp index 085c0eb4c..855850835 100644 --- a/nn/runtime/test/TestValidation.cpp +++ b/nn/runtime/test/TestValidation.cpp @@ -287,6 +287,72 @@ TEST_F(ValidationTestModel, SetOperandValueFromMemory) { ANEURALNETWORKS_BAD_STATE); } +TEST_F(ValidationTestModel, SetOperandValueFromAHardwareBuffer) { + uint32_t dimensions[]{1}; + ANeuralNetworksOperandType quant8Type{.type = ANEURALNETWORKS_TENSOR_QUANT8_ASYMM, + .dimensionCount = 1, + .dimensions = dimensions, + .scale = 1.0, + .zeroPoint = 0}; + EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &quant8Type), ANEURALNETWORKS_NO_ERROR); + + AHardwareBuffer_Desc desc{ + .width = 16, + .height = 16, + .layers = 1, + .format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, + .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, + }; + + AHardwareBuffer* buffer = nullptr; + ASSERT_EQ(AHardwareBuffer_allocate(&desc, &buffer), 0); + + ANeuralNetworksMemory* memory; + EXPECT_EQ(ANeuralNetworksMemory_createFromAHardwareBuffer(buffer, &memory), + ANEURALNETWORKS_NO_ERROR); + + // This should fail, since non-BLOB AHardwareBuffer is not allowed. + EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0, memory, 0, sizeof(uint8_t)), + ANEURALNETWORKS_UNMAPPABLE); + + AHardwareBuffer_release(buffer); +} + +TEST_F(ValidationTestModel, SetOperandValueFromAHardwareBufferBlob) { + uint32_t dimensions[]{1}; + ANeuralNetworksOperandType floatType{ + .type = ANEURALNETWORKS_TENSOR_FLOAT32, .dimensionCount = 1, .dimensions = dimensions}; + EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &floatType), ANEURALNETWORKS_NO_ERROR); + + const size_t memorySize = 20; + AHardwareBuffer_Desc desc{ + .width = memorySize, + .height = 1, + .layers = 1, + .format = AHARDWAREBUFFER_FORMAT_BLOB, + .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, + }; + + AHardwareBuffer* buffer = nullptr; + ASSERT_EQ(AHardwareBuffer_allocate(&desc, &buffer), 0); + + ANeuralNetworksMemory* memory; + EXPECT_EQ(ANeuralNetworksMemory_createFromAHardwareBuffer(buffer, &memory), + ANEURALNETWORKS_NO_ERROR); + + // This should fail, since offset is larger than memorySize. + EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0, memory, memorySize + 1, + sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + + // This should fail, since requested size is larger than the memory. + EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0, memory, memorySize - 3, + sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + + AHardwareBuffer_release(buffer); +} + TEST_F(ValidationTestModel, AddOEMOperand) { ANeuralNetworksOperandType OEMScalarType{ .type = ANEURALNETWORKS_OEM_SCALAR, .dimensionCount = 0, .dimensions = nullptr}; @@ -547,55 +613,46 @@ TEST_F(ValidationTestCompilation, Finish) { } TEST_F(ValidationTestExecution, SetInput) { - ANeuralNetworksExecution* execution; - EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR); - char buffer[20]; EXPECT_EQ(ANeuralNetworksExecution_setInput(nullptr, 0, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); - EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 0, nullptr, nullptr, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setInput(mExecution, 0, nullptr, nullptr, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); // This should fail, since memory is not the size of a float32. - EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 0, nullptr, buffer, 20), + EXPECT_EQ(ANeuralNetworksExecution_setInput(mExecution, 0, nullptr, buffer, 20), ANEURALNETWORKS_BAD_DATA); // This should fail, as this operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 999, nullptr, buffer, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setInput(mExecution, 999, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_BAD_DATA); // This should fail, as this operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, -1, nullptr, buffer, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setInput(mExecution, -1, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_BAD_DATA); } TEST_F(ValidationTestExecution, SetOutput) { - ANeuralNetworksExecution* execution; - EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR); - char buffer[20]; EXPECT_EQ(ANeuralNetworksExecution_setOutput(nullptr, 0, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); - EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 0, nullptr, nullptr, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setOutput(mExecution, 0, nullptr, nullptr, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); // This should fail, since memory is not the size of a float32. - EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 0, nullptr, buffer, 20), + EXPECT_EQ(ANeuralNetworksExecution_setOutput(mExecution, 0, nullptr, buffer, 20), ANEURALNETWORKS_BAD_DATA); // This should fail, as this operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 999, nullptr, buffer, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setOutput(mExecution, 999, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_BAD_DATA); // This should fail, as this operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, -1, nullptr, buffer, sizeof(float)), + EXPECT_EQ(ANeuralNetworksExecution_setOutput(mExecution, -1, nullptr, buffer, sizeof(float)), ANEURALNETWORKS_BAD_DATA); } TEST_F(ValidationTestExecution, SetInputFromMemory) { - ANeuralNetworksExecution* execution; - EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR); - const size_t memorySize = 20; int memoryFd = ASharedMemory_create("nnMemory", memorySize); ASSERT_GT(memoryFd, 0); @@ -608,36 +665,71 @@ TEST_F(ValidationTestExecution, SetInputFromMemory) { EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(nullptr, 0, nullptr, memory, 0, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr, nullptr, 0, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, nullptr, 0, sizeof(float)), ANEURALNETWORKS_UNEXPECTED_NULL); // This should fail, since the operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 999, nullptr, memory, 0, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 999, nullptr, memory, 0, sizeof(float)), ANEURALNETWORKS_BAD_DATA); // This should fail, since the operand does not exist. - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, -1, nullptr, memory, 0, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, -1, nullptr, memory, 0, sizeof(float)), ANEURALNETWORKS_BAD_DATA); // This should fail, since memory is not the size of a float32. - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr, memory, 0, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, 0, memorySize), ANEURALNETWORKS_BAD_DATA); // This should fail, since offset is larger than memorySize. - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr, memory, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, memorySize + 1, sizeof(float)), ANEURALNETWORKS_BAD_DATA); // This should fail, since requested size is larger than the memory. - EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr, memory, + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, memorySize - 3, sizeof(float)), ANEURALNETWORKS_BAD_DATA); } +TEST_F(ValidationTestExecution, SetInputFromAHardwareBufferBlob) { + const size_t memorySize = 20; + + AHardwareBuffer_Desc desc{ + .width = memorySize, + .height = 1, + .layers = 1, + .format = AHARDWAREBUFFER_FORMAT_BLOB, + .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, + }; + + AHardwareBuffer* buffer = nullptr; + ASSERT_EQ(AHardwareBuffer_allocate(&desc, &buffer), 0); + + ANeuralNetworksMemory* memory; + EXPECT_EQ(ANeuralNetworksMemory_createFromAHardwareBuffer(buffer, &memory), + ANEURALNETWORKS_NO_ERROR); + + // This should fail, since memory is not the size of a float32. + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, 0, + memorySize), + ANEURALNETWORKS_BAD_DATA); + + // This should fail, since offset is larger than memorySize. + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, + memorySize + 1, sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + // This should fail, since requested size is larger than the memory. + EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(mExecution, 0, nullptr, memory, + memorySize - 3, sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + + AHardwareBuffer_release(buffer); +} + TEST_F(ValidationTestExecution, SetOutputFromMemory) { ANeuralNetworksExecution* execution; EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR); @@ -684,6 +776,42 @@ TEST_F(ValidationTestExecution, SetOutputFromMemory) { ANEURALNETWORKS_BAD_DATA); } +TEST_F(ValidationTestExecution, SetOutputFromAHardwareBufferBlob) { + const size_t memorySize = 20; + + AHardwareBuffer_Desc desc{ + .width = memorySize, + .height = 1, + .layers = 1, + .format = AHARDWAREBUFFER_FORMAT_BLOB, + .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, + }; + + AHardwareBuffer* buffer = nullptr; + ASSERT_EQ(AHardwareBuffer_allocate(&desc, &buffer), 0); + + ANeuralNetworksMemory* memory; + EXPECT_EQ(ANeuralNetworksMemory_createFromAHardwareBuffer(buffer, &memory), + ANEURALNETWORKS_NO_ERROR); + + // This should fail, since memory is not the size of a float32. + EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(mExecution, 0, nullptr, memory, 0, + memorySize), + ANEURALNETWORKS_BAD_DATA); + + // This should fail, since offset is larger than memorySize. + EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(mExecution, 0, nullptr, memory, + memorySize + 1, sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + + // This should fail, since requested size is larger than the memory. + EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(mExecution, 0, nullptr, memory, + memorySize - 3, sizeof(float)), + ANEURALNETWORKS_BAD_DATA); + + AHardwareBuffer_release(buffer); +} + TEST_F(ValidationTestExecution, Compute) { EXPECT_EQ(ANeuralNetworksExecution_compute(nullptr), ANEURALNETWORKS_UNEXPECTED_NULL); } |