1*4d7e907cSAndroid Build Coastguard Worker# IMapper "stable-c" HAL 2*4d7e907cSAndroid Build Coastguard Worker 3*4d7e907cSAndroid Build Coastguard WorkerStarting with gralloc version 5, IMapper is now exposed as a C API instead of through HIDL or AIDL. 4*4d7e907cSAndroid Build Coastguard WorkerThis is due to HIDL being deprecated, and AIDL not wanting to support a pass-through mode & pointers 5*4d7e907cSAndroid Build Coastguard Workerfor just a couple of clients such as IMapper. So instead a stable C API is used to fill this gap. 6*4d7e907cSAndroid Build Coastguard Worker 7*4d7e907cSAndroid Build Coastguard Worker## Implementing 8*4d7e907cSAndroid Build Coastguard Worker 9*4d7e907cSAndroid Build Coastguard WorkerTo provide an implementation a library implementing the AIMapper API interface should be provided 10*4d7e907cSAndroid Build Coastguard Workerin `/vendor/lib[64]/hw/mapper.<imapper_suffix>.so`. The `<imapper_suffix>` should be specified 11*4d7e907cSAndroid Build Coastguard Workeras the `<instance>` in the VINTF manifest `<interface>` section. For example: 12*4d7e907cSAndroid Build Coastguard Worker```xml 13*4d7e907cSAndroid Build Coastguard Worker<manifest version="1.0" type="device"> 14*4d7e907cSAndroid Build Coastguard Worker <hal format="native"> 15*4d7e907cSAndroid Build Coastguard Worker <name>mapper</name> 16*4d7e907cSAndroid Build Coastguard Worker <version>5.0</version> 17*4d7e907cSAndroid Build Coastguard Worker <interface> 18*4d7e907cSAndroid Build Coastguard Worker <instance>minigbm</instance> 19*4d7e907cSAndroid Build Coastguard Worker </interface> 20*4d7e907cSAndroid Build Coastguard Worker </hal> 21*4d7e907cSAndroid Build Coastguard Worker</manifest> 22*4d7e907cSAndroid Build Coastguard Worker``` 23*4d7e907cSAndroid Build Coastguard Workerdefines that the IMapper 5.0 library is provided by `/vendor/lib[64]/hw/mapper.minigbm.so`. 24*4d7e907cSAndroid Build Coastguard Worker 25*4d7e907cSAndroid Build Coastguard WorkerServiceManager should be able to `find` the instance. The instance should be labelled in 26*4d7e907cSAndroid Build Coastguard Worker`service_contexts` as follows: 27*4d7e907cSAndroid Build Coastguard Worker``` 28*4d7e907cSAndroid Build Coastguard Workermapper/minigbm u:object_r:hal_graphics_mapper_service:s0 29*4d7e907cSAndroid Build Coastguard Worker``` 30*4d7e907cSAndroid Build Coastguard Worker 31*4d7e907cSAndroid Build Coastguard WorkerThis library must export the following `extern "C"` symbols: 32*4d7e907cSAndroid Build Coastguard Worker 33*4d7e907cSAndroid Build Coastguard Worker### `ANDROID_HAL_STABLEC_VERSION` 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard WorkerThis is a uint32_t that should simply be set to the exported AIMapper version. For example: 36*4d7e907cSAndroid Build Coastguard Worker```c++ 37*4d7e907cSAndroid Build Coastguard Workerextern "C" uint32_t ANDROID_HAL_STABLEC_VERSION = AIMAPPER_VERSION_5; 38*4d7e907cSAndroid Build Coastguard Worker``` 39*4d7e907cSAndroid Build Coastguard Worker 40*4d7e907cSAndroid Build Coastguard Worker### `AIMapper_loadIMapper` 41*4d7e907cSAndroid Build Coastguard Worker 42*4d7e907cSAndroid Build Coastguard WorkerThis is what should actually load the HAL interface. The full type signature is 43*4d7e907cSAndroid Build Coastguard Worker```c++ 44*4d7e907cSAndroid Build Coastguard Workerextern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation) 45*4d7e907cSAndroid Build Coastguard Worker``` 46*4d7e907cSAndroid Build Coastguard Worker 47*4d7e907cSAndroid Build Coastguard WorkerSee `include/android/hardware/graphics/mapper/IMapper.h` for complete documentation on what 48*4d7e907cSAndroid Build Coastguard Workerthis function must return. 49*4d7e907cSAndroid Build Coastguard Worker 50*4d7e907cSAndroid Build Coastguard WorkerTo make it easier to implement this C API, a header-only helper library is provided called 51*4d7e907cSAndroid Build Coastguard Worker`libimapper_providerutils`. This library handles mapping from the C API struct to a C++ class 52*4d7e907cSAndroid Build Coastguard Workeras well as provides helpers for encoding & decoding metadata, largely replacing the role that 53*4d7e907cSAndroid Build Coastguard Worker`libgralloctypes` filled with IMapper 4. 54*4d7e907cSAndroid Build Coastguard Worker 55*4d7e907cSAndroid Build Coastguard WorkerTo use this library, create a class that extends from `IMapperV5Impl` and use `IMapperProvider` to 56*4d7e907cSAndroid Build Coastguard Workerimplement `AIMapper_loadIMapper`: 57*4d7e907cSAndroid Build Coastguard Worker 58*4d7e907cSAndroid Build Coastguard Worker```c++ 59*4d7e907cSAndroid Build Coastguard Worker// The IMapper interface itself 60*4d7e907cSAndroid Build Coastguard Worker#include <android/hardware/graphics/mapper/IMapper.h> 61*4d7e907cSAndroid Build Coastguard Worker// Helpers for reading & writing metadata 62*4d7e907cSAndroid Build Coastguard Worker#include <android/hardware/graphics/mapper/utils/IMapperMetadataTypes.h> 63*4d7e907cSAndroid Build Coastguard Worker// Helper for providing the implementation interface 64*4d7e907cSAndroid Build Coastguard Worker#include <android/hardware/graphics/mapper/utils/IMapperProvider.h> 65*4d7e907cSAndroid Build Coastguard Worker 66*4d7e907cSAndroid Build Coastguard Worker// Define an IMapperV5 implementation 67*4d7e907cSAndroid Build Coastguard Workerclass CrosGrallocMapperV5 final : public vendor::mapper::IMapperV5Impl { 68*4d7e907cSAndroid Build Coastguard Worker // Override all the methods of IMapperV5Impl 69*4d7e907cSAndroid Build Coastguard Worker AIMapper_Error importBuffer(const native_handle_t* _Nonnull handle, 70*4d7e907cSAndroid Build Coastguard Worker buffer_handle_t _Nullable* _Nonnull outBufferHandle) override; 71*4d7e907cSAndroid Build Coastguard Worker [etc...] 72*4d7e907cSAndroid Build Coastguard Worker}; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker// Expose the required C symbols 75*4d7e907cSAndroid Build Coastguard Worker 76*4d7e907cSAndroid Build Coastguard Workerextern "C" uint32_t ANDROID_HAL_STABLEC_VERSION = AIMAPPER_VERSION_5; 77*4d7e907cSAndroid Build Coastguard Worker 78*4d7e907cSAndroid Build Coastguard Workerextern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation) { 79*4d7e907cSAndroid Build Coastguard Worker // Define an IMapperProvider for our V5 implementation 80*4d7e907cSAndroid Build Coastguard Worker static vendor::mapper::IMapperProvider<CrosGrallocMapperV5> provider; 81*4d7e907cSAndroid Build Coastguard Worker return provider.load(outImplementation); 82*4d7e907cSAndroid Build Coastguard Worker} 83*4d7e907cSAndroid Build Coastguard Worker``` 84*4d7e907cSAndroid Build Coastguard Worker 85*4d7e907cSAndroid Build Coastguard WorkerA complete example, including using IMapperMetadataTypes, can be found in the cuttlefish 86*4d7e907cSAndroid Build Coastguard Workerimplementation in `//external/minigbm/cros_gralloc/mapper_stablec` 87*4d7e907cSAndroid Build Coastguard Worker 88*4d7e907cSAndroid Build Coastguard Worker### Testing 89*4d7e907cSAndroid Build Coastguard Worker 90*4d7e907cSAndroid Build Coastguard WorkerAs with HIDL & AIDL HALs, a VTS test is provided to validate the implementation. It is found in the 91*4d7e907cSAndroid Build Coastguard Worker`vts` folder and may be run using `$ atest VtsHalGraphicsMapperStableC_TargetTest` 92*4d7e907cSAndroid Build Coastguard Worker 93*4d7e907cSAndroid Build Coastguard Worker## Using 94*4d7e907cSAndroid Build Coastguard Worker 95*4d7e907cSAndroid Build Coastguard WorkerIt is strongly recommended that clients use either the `AHardwareBuffer` (preferred) or 96*4d7e907cSAndroid Build Coastguard Worker`GraphicBufferMapper` (from libui) APIs to use the mapper HAL rather than attempting to use 97*4d7e907cSAndroid Build Coastguard Worker`AIMapper` directly. 98*4d7e907cSAndroid Build Coastguard Worker 99*4d7e907cSAndroid Build Coastguard Worker## Version changes 100*4d7e907cSAndroid Build Coastguard Worker 101*4d7e907cSAndroid Build Coastguard Worker### Version 5 102*4d7e907cSAndroid Build Coastguard Worker 103*4d7e907cSAndroid Build Coastguard Worker* Initial introduction of this HAL interface 104*4d7e907cSAndroid Build Coastguard Worker* Largely feature-equivalent to IMapper4 105*4d7e907cSAndroid Build Coastguard Worker* Requires allocator-V2 106*4d7e907cSAndroid Build Coastguard Worker* Removes `BufferDescriptorInfo`; 107*4d7e907cSAndroid Build Coastguard Worker* IsSupported has moved to IAllocator 108*4d7e907cSAndroid Build Coastguard Worker* Removes `validateBufferSize`, validation is instead handled by clients using metadata queries 109*4d7e907cSAndroid Build Coastguard Worker* Getting the following StandardMetadataType is now mandatory: 110*4d7e907cSAndroid Build Coastguard Worker * STRIDE 111*4d7e907cSAndroid Build Coastguard Worker* Setting the following StandardMetadataTypes is now mandatory: 112*4d7e907cSAndroid Build Coastguard Worker * DATASPACE 113*4d7e907cSAndroid Build Coastguard Worker * SMPTE2086 114*4d7e907cSAndroid Build Coastguard Worker * CTA861_3 115*4d7e907cSAndroid Build Coastguard Worker * BLEND_MODE 116