# 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..so`. The `` should be specified as the `` in the VINTF manifest `` section. For example: ```xml mapper 5.0 minigbm ``` 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: ```c++ 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 ```c++ 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`: ```c++ // The IMapper interface itself #include // Helpers for reading & writing metadata #include // Helper for providing the implementation interface #include // 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 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