xref: /aosp_15_r20/hardware/interfaces/graphics/mapper/stable-c/README.md (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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