platform_hardware_interfaces/graphics/mapper/stable-c
Jooyung Han 2dd88e6c8a Explain how to add service_contexts for stable-c mapper
Stable-c mapper instance should be declared in two ways:
- vintf manifest
- service_contexts

The latter part was missing.

Bug: 336010345
Change-Id: I7bd776bf7d943049ef319c90739dae10071409ab
Test: documentation
2024-04-25 18:48:51 +00:00
..
abi-dumps Move libimapper_stablec ABI dumps from prebuilts/abi-dumps 2024-04-16 20:21:56 +08:00
implutils Ensure AIMapper and underlying IMPL outlive IMapperProvider 2023-10-10 11:54:00 -07:00
include/android/hardware/graphics/mapper Fix annotation in doc 2024-03-14 01:58:19 +00:00
vts Use new API to load mapper 2024-02-13 21:37:47 +09:00
Android.bp Move libimapper_stablec ABI dumps from prebuilts/abi-dumps 2024-04-16 20:21:56 +08:00
imapper.map.txt
imapper5_abicheck.cpp
README.md Explain how to add service_contexts for stable-c mapper 2024-04-25 18:48:51 +00:00

IMapper "stable-c" HAL

Starting with gralloc version 5, IMapper is now exposed as a C API instead of through HIDL or AIDL. This is due to HIDL being deprecated, and AIDL not wanting to support a pass-through mode & pointers for just a couple of clients such as IMapper. So instead a stable C API is used to fill this gap.

Implementing

To provide an implementation a library implementing the AIMapper API interface should be provided in /vendor/lib[64]/hw/mapper.<imapper_suffix>.so. The <imapper_suffix> should be specified as the <instance> in the VINTF manifest <interface> section. For example:

<manifest version="1.0" type="device">
    <hal format="native">
        <name>mapper</name>
        <version>5.0</version>
        <interface>
            <instance>minigbm</instance>
        </interface>
    </hal>
</manifest>

defines that the IMapper 5.0 library is provided by /vendor/lib[64]/hw/mapper.minigbm.so.

ServiceManager should be able to find the instance. The instance should be labelled in service_contexts as follows:

mapper/minigbm    u:object_r:hal_graphics_mapper_service:s0

This library must export the following extern "C" symbols:

ANDROID_HAL_STABLEC_VERSION

This is a uint32_t that should simply be set to the exported AIMapper version. For example:

extern "C" uint32_t ANDROID_HAL_STABLEC_VERSION = AIMAPPER_VERSION_5;

AIMapper_loadIMapper

This is what should actually load the HAL interface. The full type signature is

extern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation)

See include/android/hardware/graphics/mapper/IMapper.h for complete documentation on what this function must return.

To make it easier to implement this C API, a header-only helper library is provided called libimapper_providerutils. This library handles mapping from the C API struct to a C++ class as well as provides helpers for encoding & decoding metadata, largely replacing the role that libgralloctypes filled with IMapper 4.

To use this library, create a class that extends from IMapperV5Impl and use IMapperProvider to implement AIMapper_loadIMapper:

// The IMapper interface itself
#include <android/hardware/graphics/mapper/IMapper.h>
// Helpers for reading & writing metadata
#include <android/hardware/graphics/mapper/utils/IMapperMetadataTypes.h>
// Helper for providing the implementation interface
#include <android/hardware/graphics/mapper/utils/IMapperProvider.h>

// Define an IMapperV5 implementation
class CrosGrallocMapperV5 final : public vendor::mapper::IMapperV5Impl {
    // Override all the methods of IMapperV5Impl
      AIMapper_Error importBuffer(const native_handle_t* _Nonnull handle,
                              buffer_handle_t _Nullable* _Nonnull outBufferHandle) override;
      [etc...]
};

// Expose the required C symbols

extern "C" uint32_t ANDROID_HAL_STABLEC_VERSION = AIMAPPER_VERSION_5;

extern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation) {
    // Define an IMapperProvider for our V5 implementation
    static vendor::mapper::IMapperProvider<CrosGrallocMapperV5> provider;
    return provider.load(outImplementation);
}

A complete example, including using IMapperMetadataTypes, can be found in the cuttlefish implementation in //external/minigbm/cros_gralloc/mapper_stablec

Testing

As with HIDL & AIDL HALs, a VTS test is provided to validate the implementation. It is found in the vts folder and may be run using $ atest VtsHalGraphicsMapperStableC_TargetTest

Using

It is strongly recommended that clients use either the AHardwareBuffer (preferred) or GraphicBufferMapper (from libui) APIs to use the mapper HAL rather than attempting to use AIMapper directly.

Version changes

Version 5

  • Initial introduction of this HAL interface
  • Largely feature-equivalent to IMapper4
  • Requires allocator-V2
  • Removes BufferDescriptorInfo;
  • IsSupported has moved to IAllocator
  • Removes validateBufferSize, validation is instead handled by clients using metadata queries
  • Getting the following StandardMetadataType is now mandatory:
    • STRIDE
  • Setting the following StandardMetadataTypes is now mandatory:
    • DATASPACE
    • SMPTE2086
    • CTA861_3
    • BLEND_MODE