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

Commit 25416b5a authored by Chia-I Wu's avatar Chia-I Wu
Browse files

graphics: add createDescriptor_2_1 to mapper

With new formats and buffer usage bits, we need new
createDescriptor.

Test: VTS
Change-Id: I87e39297f9c1c53377fcc62fb086629779409c16
parent 8a03c92d
Loading
Loading
Loading
Loading
+66 −3
Original line number Diff line number Diff line
@@ -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
@@ -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);
};
+66 −2
Original line number Diff line number Diff line
@@ -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:
@@ -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());
@@ -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
@@ -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;