Loading graphics/mapper/2.1/IMapper.hal +66 −3 Original line number Diff line number Diff line Loading @@ -16,10 +16,47 @@ package android.hardware.graphics.mapper@2.1; import android.hardware.graphics.mapper@2.0::Error; import android.hardware.graphics.mapper@2.0::IMapper; import android.hardware.graphics.common@1.1::BufferUsage; import android.hardware.graphics.common@1.1::PixelFormat; import @2.0::BufferDescriptor; import @2.0::Error; import @2.0::IMapper; interface IMapper extends @2.0::IMapper { /** * This is the same as @2.0::IMapper::BufferDescriptorInfo except that it * accepts @1.1::PixelFormat and @1.1::BufferUsage. */ struct BufferDescriptorInfo { /** * The width specifies how many columns of pixels must be in the * allocated buffer, but does not necessarily represent the offset in * columns between the same column in adjacent rows. The rows may be * padded. */ uint32_t width; /** * The height specifies how many rows of pixels must be in the * allocated buffer. */ uint32_t height; /** * The number of image layers that must be in the allocated buffer. */ uint32_t layerCount; /** Buffer pixel format. */ PixelFormat format; /** * Buffer usage mask; valid flags can be found in the definition of * BufferUsage. */ bitfield<BufferUsage> usage; }; interface IMapper extends android.hardware.graphics.mapper@2.0::IMapper { /** * Validate that the buffer can be safely accessed by a caller who assumes * the specified descriptorInfo and stride. This must at least validate Loading Loading @@ -58,4 +95,30 @@ interface IMapper extends android.hardware.graphics.mapper@2.0::IMapper { generates (Error error, uint32_t numFds, uint32_t numInts); /** * This is the same as @2.0::IMapper::createDescriptor except that it * accepts @2.1::IMapper::BufferDescriptorInfo. * * Creates a buffer descriptor. The descriptor can be used with IAllocator * to allocate buffers. * * Since the buffer descriptor fully describes a buffer, any device * dependent or device independent checks must be performed here whenever * possible. Specifically, when layered buffers are not supported, this * function must return UNSUPPORTED if layerCount is great than 1. * * @param descriptorInfo specifies the attributes of the descriptor. * @return error is NONE upon success. Otherwise, * BAD_VALUE when any of the specified attributes is * invalid or conflicting. * NO_RESOURCES when the creation cannot be fullfilled at * this time. * UNSUPPORTED when any of the specified attributes is * not supported. * @return descriptor is the newly created buffer descriptor. */ createDescriptor_2_1(BufferDescriptorInfo descriptorInfo) generates (Error error, BufferDescriptor descriptor); }; graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp +66 −2 Original line number Diff line number Diff line Loading @@ -30,10 +30,27 @@ namespace V2_1 { namespace tests { namespace { using android::hardware::graphics::mapper::V2_0::BufferDescriptor; using android::hardware::graphics::mapper::V2_0::Error; using android::hardware::graphics::common::V1_0::BufferUsage; using android::hardware::graphics::common::V1_0::PixelFormat; using android::hardware::graphics::common::V1_1::BufferUsage; using android::hardware::graphics::common::V1_1::PixelFormat; // abuse VTS to check binary compatibility between BufferDescriptorInfos using OldBufferDescriptorInfo = android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo; static_assert(sizeof(OldBufferDescriptorInfo) == sizeof(IMapper::BufferDescriptorInfo) && offsetof(OldBufferDescriptorInfo, width) == offsetof(IMapper::BufferDescriptorInfo, width) && offsetof(OldBufferDescriptorInfo, height) == offsetof(IMapper::BufferDescriptorInfo, height) && offsetof(OldBufferDescriptorInfo, layerCount) == offsetof(IMapper::BufferDescriptorInfo, layerCount) && offsetof(OldBufferDescriptorInfo, format) == offsetof(IMapper::BufferDescriptorInfo, format) && offsetof(OldBufferDescriptorInfo, usage) == offsetof(IMapper::BufferDescriptorInfo, usage), ""); class Gralloc : public V2_0::tests::Gralloc { public: Loading Loading @@ -72,6 +89,32 @@ class Gralloc : public V2_0::tests::Gralloc { }); } BufferDescriptor createDescriptor(const IMapper::BufferDescriptorInfo& descriptorInfo) { BufferDescriptor descriptor; mMapper->createDescriptor_2_1( descriptorInfo, [&](const auto& tmpError, const auto& tmpDescriptor) { ASSERT_EQ(Error::NONE, tmpError) << "failed to create descriptor"; descriptor = tmpDescriptor; }); return descriptor; } const native_handle_t* allocate(const IMapper::BufferDescriptorInfo& descriptorInfo, bool import, uint32_t* outStride = nullptr) { BufferDescriptor descriptor = createDescriptor(descriptorInfo); if (::testing::Test::HasFatalFailure()) { return nullptr; } auto buffers = V2_0::tests::Gralloc::allocate(descriptor, 1, import, outStride); if (::testing::Test::HasFatalFailure()) { return nullptr; } return buffers[0]; } private: void init() { mMapper = IMapper::castFrom(V2_0::tests::Gralloc::getMapper()); Loading Loading @@ -229,6 +272,24 @@ TEST_F(GraphicsMapperHidlTest, GetTransportSizeBadBuffer) { native_handle_delete(rawBufferHandle); } /** * Test IMapper::createDescriptor with valid descriptor info. */ TEST_F(GraphicsMapperHidlTest, CreateDescriptor_2_1Basic) { ASSERT_NO_FATAL_FAILURE(mGralloc->createDescriptor(mDummyDescriptorInfo)); } /** * Test IMapper::createDescriptor with invalid descriptor info. */ TEST_F(GraphicsMapperHidlTest, CreateDescriptor_2_1Negative) { auto info = mDummyDescriptorInfo; info.width = 0; mGralloc->getMapper()->createDescriptor_2_1(info, [&](const auto& tmpError, const auto&) { EXPECT_EQ(Error::BAD_VALUE, tmpError) << "createDescriptor did not fail with BAD_VALUE"; }); } } // namespace } // namespace tests } // namespace V2_1 Loading @@ -238,7 +299,10 @@ TEST_F(GraphicsMapperHidlTest, GetTransportSizeBadBuffer) { } // namespace android int main(int argc, char** argv) { using android::hardware::graphics::mapper::V2_0::tests::GraphicsMapperHidlEnvironment; ::testing::AddGlobalTestEnvironment(GraphicsMapperHidlEnvironment::Instance()); ::testing::InitGoogleTest(&argc, argv); GraphicsMapperHidlEnvironment::Instance()->init(&argc, argv); int status = RUN_ALL_TESTS(); LOG(INFO) << "Test result = " << status; Loading Loading
graphics/mapper/2.1/IMapper.hal +66 −3 Original line number Diff line number Diff line Loading @@ -16,10 +16,47 @@ package android.hardware.graphics.mapper@2.1; import android.hardware.graphics.mapper@2.0::Error; import android.hardware.graphics.mapper@2.0::IMapper; import android.hardware.graphics.common@1.1::BufferUsage; import android.hardware.graphics.common@1.1::PixelFormat; import @2.0::BufferDescriptor; import @2.0::Error; import @2.0::IMapper; interface IMapper extends @2.0::IMapper { /** * This is the same as @2.0::IMapper::BufferDescriptorInfo except that it * accepts @1.1::PixelFormat and @1.1::BufferUsage. */ struct BufferDescriptorInfo { /** * The width specifies how many columns of pixels must be in the * allocated buffer, but does not necessarily represent the offset in * columns between the same column in adjacent rows. The rows may be * padded. */ uint32_t width; /** * The height specifies how many rows of pixels must be in the * allocated buffer. */ uint32_t height; /** * The number of image layers that must be in the allocated buffer. */ uint32_t layerCount; /** Buffer pixel format. */ PixelFormat format; /** * Buffer usage mask; valid flags can be found in the definition of * BufferUsage. */ bitfield<BufferUsage> usage; }; interface IMapper extends android.hardware.graphics.mapper@2.0::IMapper { /** * Validate that the buffer can be safely accessed by a caller who assumes * the specified descriptorInfo and stride. This must at least validate Loading Loading @@ -58,4 +95,30 @@ interface IMapper extends android.hardware.graphics.mapper@2.0::IMapper { generates (Error error, uint32_t numFds, uint32_t numInts); /** * This is the same as @2.0::IMapper::createDescriptor except that it * accepts @2.1::IMapper::BufferDescriptorInfo. * * Creates a buffer descriptor. The descriptor can be used with IAllocator * to allocate buffers. * * Since the buffer descriptor fully describes a buffer, any device * dependent or device independent checks must be performed here whenever * possible. Specifically, when layered buffers are not supported, this * function must return UNSUPPORTED if layerCount is great than 1. * * @param descriptorInfo specifies the attributes of the descriptor. * @return error is NONE upon success. Otherwise, * BAD_VALUE when any of the specified attributes is * invalid or conflicting. * NO_RESOURCES when the creation cannot be fullfilled at * this time. * UNSUPPORTED when any of the specified attributes is * not supported. * @return descriptor is the newly created buffer descriptor. */ createDescriptor_2_1(BufferDescriptorInfo descriptorInfo) generates (Error error, BufferDescriptor descriptor); };
graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp +66 −2 Original line number Diff line number Diff line Loading @@ -30,10 +30,27 @@ namespace V2_1 { namespace tests { namespace { using android::hardware::graphics::mapper::V2_0::BufferDescriptor; using android::hardware::graphics::mapper::V2_0::Error; using android::hardware::graphics::common::V1_0::BufferUsage; using android::hardware::graphics::common::V1_0::PixelFormat; using android::hardware::graphics::common::V1_1::BufferUsage; using android::hardware::graphics::common::V1_1::PixelFormat; // abuse VTS to check binary compatibility between BufferDescriptorInfos using OldBufferDescriptorInfo = android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo; static_assert(sizeof(OldBufferDescriptorInfo) == sizeof(IMapper::BufferDescriptorInfo) && offsetof(OldBufferDescriptorInfo, width) == offsetof(IMapper::BufferDescriptorInfo, width) && offsetof(OldBufferDescriptorInfo, height) == offsetof(IMapper::BufferDescriptorInfo, height) && offsetof(OldBufferDescriptorInfo, layerCount) == offsetof(IMapper::BufferDescriptorInfo, layerCount) && offsetof(OldBufferDescriptorInfo, format) == offsetof(IMapper::BufferDescriptorInfo, format) && offsetof(OldBufferDescriptorInfo, usage) == offsetof(IMapper::BufferDescriptorInfo, usage), ""); class Gralloc : public V2_0::tests::Gralloc { public: Loading Loading @@ -72,6 +89,32 @@ class Gralloc : public V2_0::tests::Gralloc { }); } BufferDescriptor createDescriptor(const IMapper::BufferDescriptorInfo& descriptorInfo) { BufferDescriptor descriptor; mMapper->createDescriptor_2_1( descriptorInfo, [&](const auto& tmpError, const auto& tmpDescriptor) { ASSERT_EQ(Error::NONE, tmpError) << "failed to create descriptor"; descriptor = tmpDescriptor; }); return descriptor; } const native_handle_t* allocate(const IMapper::BufferDescriptorInfo& descriptorInfo, bool import, uint32_t* outStride = nullptr) { BufferDescriptor descriptor = createDescriptor(descriptorInfo); if (::testing::Test::HasFatalFailure()) { return nullptr; } auto buffers = V2_0::tests::Gralloc::allocate(descriptor, 1, import, outStride); if (::testing::Test::HasFatalFailure()) { return nullptr; } return buffers[0]; } private: void init() { mMapper = IMapper::castFrom(V2_0::tests::Gralloc::getMapper()); Loading Loading @@ -229,6 +272,24 @@ TEST_F(GraphicsMapperHidlTest, GetTransportSizeBadBuffer) { native_handle_delete(rawBufferHandle); } /** * Test IMapper::createDescriptor with valid descriptor info. */ TEST_F(GraphicsMapperHidlTest, CreateDescriptor_2_1Basic) { ASSERT_NO_FATAL_FAILURE(mGralloc->createDescriptor(mDummyDescriptorInfo)); } /** * Test IMapper::createDescriptor with invalid descriptor info. */ TEST_F(GraphicsMapperHidlTest, CreateDescriptor_2_1Negative) { auto info = mDummyDescriptorInfo; info.width = 0; mGralloc->getMapper()->createDescriptor_2_1(info, [&](const auto& tmpError, const auto&) { EXPECT_EQ(Error::BAD_VALUE, tmpError) << "createDescriptor did not fail with BAD_VALUE"; }); } } // namespace } // namespace tests } // namespace V2_1 Loading @@ -238,7 +299,10 @@ TEST_F(GraphicsMapperHidlTest, GetTransportSizeBadBuffer) { } // namespace android int main(int argc, char** argv) { using android::hardware::graphics::mapper::V2_0::tests::GraphicsMapperHidlEnvironment; ::testing::AddGlobalTestEnvironment(GraphicsMapperHidlEnvironment::Instance()); ::testing::InitGoogleTest(&argc, argv); GraphicsMapperHidlEnvironment::Instance()->init(&argc, argv); int status = RUN_ALL_TESTS(); LOG(INFO) << "Test result = " << status; Loading