xref: /aosp_15_r20/external/mesa3d/include/android_stub/hardware/gralloc.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*61046927SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*61046927SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*61046927SAndroid Build Coastguard Worker  *
8*61046927SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*61046927SAndroid Build Coastguard Worker  *
10*61046927SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*61046927SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*61046927SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*61046927SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*61046927SAndroid Build Coastguard Worker  * limitations under the License.
15*61046927SAndroid Build Coastguard Worker  */
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker #ifndef ANDROID_GRALLOC_INTERFACE_H
19*61046927SAndroid Build Coastguard Worker #define ANDROID_GRALLOC_INTERFACE_H
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker #include <system/graphics.h>
22*61046927SAndroid Build Coastguard Worker #include <hardware/hardware.h>
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <stdint.h>
25*61046927SAndroid Build Coastguard Worker #include <sys/cdefs.h>
26*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include <cutils/native_handle.h>
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include <hardware/hardware.h>
31*61046927SAndroid Build Coastguard Worker #include <hardware/fb.h>
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker __BEGIN_DECLS
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker /**
36*61046927SAndroid Build Coastguard Worker  * Module versioning information for the Gralloc hardware module, based on
37*61046927SAndroid Build Coastguard Worker  * gralloc_module_t.common.module_api_version.
38*61046927SAndroid Build Coastguard Worker  *
39*61046927SAndroid Build Coastguard Worker  * Version History:
40*61046927SAndroid Build Coastguard Worker  *
41*61046927SAndroid Build Coastguard Worker  * GRALLOC_MODULE_API_VERSION_0_1:
42*61046927SAndroid Build Coastguard Worker  * Initial Gralloc hardware module API.
43*61046927SAndroid Build Coastguard Worker  *
44*61046927SAndroid Build Coastguard Worker  * GRALLOC_MODULE_API_VERSION_0_2:
45*61046927SAndroid Build Coastguard Worker  * Add support for flexible YCbCr format with (*lock_ycbcr)() method.
46*61046927SAndroid Build Coastguard Worker  *
47*61046927SAndroid Build Coastguard Worker  * GRALLOC_MODULE_API_VERSION_0_3:
48*61046927SAndroid Build Coastguard Worker  * Add support for fence passing to/from lock/unlock.
49*61046927SAndroid Build Coastguard Worker  */
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker #define GRALLOC_MODULE_API_VERSION_0_1  HARDWARE_MODULE_API_VERSION(0, 1)
52*61046927SAndroid Build Coastguard Worker #define GRALLOC_MODULE_API_VERSION_0_2  HARDWARE_MODULE_API_VERSION(0, 2)
53*61046927SAndroid Build Coastguard Worker #define GRALLOC_MODULE_API_VERSION_0_3  HARDWARE_MODULE_API_VERSION(0, 3)
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker #define GRALLOC_DEVICE_API_VERSION_0_1  HARDWARE_DEVICE_API_VERSION(0, 1)
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker /**
58*61046927SAndroid Build Coastguard Worker  * The id of this module
59*61046927SAndroid Build Coastguard Worker  */
60*61046927SAndroid Build Coastguard Worker #define GRALLOC_HARDWARE_MODULE_ID "gralloc"
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker /**
63*61046927SAndroid Build Coastguard Worker  * Name of the graphics device to open
64*61046927SAndroid Build Coastguard Worker  */
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker #define GRALLOC_HARDWARE_GPU0 "gpu0"
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker enum {
69*61046927SAndroid Build Coastguard Worker     /* buffer is never read in software */
70*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_READ_NEVER         = 0x00000000U,
71*61046927SAndroid Build Coastguard Worker     /* buffer is rarely read in software */
72*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_READ_RARELY        = 0x00000002U,
73*61046927SAndroid Build Coastguard Worker     /* buffer is often read in software */
74*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_READ_OFTEN         = 0x00000003U,
75*61046927SAndroid Build Coastguard Worker     /* mask for the software read values */
76*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_READ_MASK          = 0x0000000FU,
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker     /* buffer is never written in software */
79*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_WRITE_NEVER        = 0x00000000U,
80*61046927SAndroid Build Coastguard Worker     /* buffer is rarely written in software */
81*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_WRITE_RARELY       = 0x00000020U,
82*61046927SAndroid Build Coastguard Worker     /* buffer is often written in software */
83*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_WRITE_OFTEN        = 0x00000030U,
84*61046927SAndroid Build Coastguard Worker     /* mask for the software write values */
85*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_SW_WRITE_MASK         = 0x000000F0U,
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker     /* buffer will be used as an OpenGL ES texture */
88*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_TEXTURE            = 0x00000100U,
89*61046927SAndroid Build Coastguard Worker     /* buffer will be used as an OpenGL ES render target */
90*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_RENDER             = 0x00000200U,
91*61046927SAndroid Build Coastguard Worker     /* buffer will be used by the 2D hardware blitter */
92*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_2D                 = 0x00000400U,
93*61046927SAndroid Build Coastguard Worker     /* buffer will be used by the HWComposer HAL module */
94*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_COMPOSER           = 0x00000800U,
95*61046927SAndroid Build Coastguard Worker     /* buffer will be used with the framebuffer device */
96*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_FB                 = 0x00001000U,
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker     /* buffer should be displayed full-screen on an external display when
99*61046927SAndroid Build Coastguard Worker      * possible */
100*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_EXTERNAL_DISP         = 0x00002000U,
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker     /* Must have a hardware-protected path to external display sink for
103*61046927SAndroid Build Coastguard Worker      * this buffer.  If a hardware-protected path is not available, then
104*61046927SAndroid Build Coastguard Worker      * either don't composite only this buffer (preferred) to the
105*61046927SAndroid Build Coastguard Worker      * external sink, or (less desirable) do not route the entire
106*61046927SAndroid Build Coastguard Worker      * composition to the external sink.  */
107*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PROTECTED             = 0x00004000U,
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker     /* buffer may be used as a cursor */
110*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_CURSOR                = 0x00008000U,
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker     /* buffer will be used with the HW video encoder */
113*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_VIDEO_ENCODER      = 0x00010000U,
114*61046927SAndroid Build Coastguard Worker     /* buffer will be written by the HW camera pipeline */
115*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_CAMERA_WRITE       = 0x00020000U,
116*61046927SAndroid Build Coastguard Worker     /* buffer will be read by the HW camera pipeline */
117*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_CAMERA_READ        = 0x00040000U,
118*61046927SAndroid Build Coastguard Worker     /* buffer will be used as part of zero-shutter-lag queue */
119*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_CAMERA_ZSL         = 0x00060000U,
120*61046927SAndroid Build Coastguard Worker     /* mask for the camera access values */
121*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_CAMERA_MASK        = 0x00060000U,
122*61046927SAndroid Build Coastguard Worker     /* mask for the software usage bit-mask */
123*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_MASK               = 0x00071F00U,
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker     /* buffer will be used as a RenderScript Allocation */
126*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_RENDERSCRIPT          = 0x00100000U,
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker     /* Set by the consumer to indicate to the producer that they may attach a
129*61046927SAndroid Build Coastguard Worker      * buffer that they did not detach from the BufferQueue. Will be filtered
130*61046927SAndroid Build Coastguard Worker      * out by GRALLOC_USAGE_ALLOC_MASK, so gralloc modules will not need to
131*61046927SAndroid Build Coastguard Worker      * handle this flag. */
132*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_FOREIGN_BUFFERS       = 0x00200000U,
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker     /* buffer will be used as input to HW HEIC image encoder */
135*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_HW_IMAGE_ENCODER      = 0x08000000U,
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker     /* Mask of all flags which could be passed to a gralloc module for buffer
138*61046927SAndroid Build Coastguard Worker      * allocation. Any flags not in this mask do not need to be handled by
139*61046927SAndroid Build Coastguard Worker      * gralloc modules. */
140*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_ALLOC_MASK            = ~(GRALLOC_USAGE_FOREIGN_BUFFERS),
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker     /* implementation-specific private usage flags */
143*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PRIVATE_0             = 0x10000000U,
144*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PRIVATE_1             = 0x20000000U,
145*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PRIVATE_2             = 0x40000000U,
146*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PRIVATE_3             = 0x80000000U,
147*61046927SAndroid Build Coastguard Worker     GRALLOC_USAGE_PRIVATE_MASK          = 0xF0000000U,
148*61046927SAndroid Build Coastguard Worker };
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker /*****************************************************************************/
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker /**
153*61046927SAndroid Build Coastguard Worker  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
154*61046927SAndroid Build Coastguard Worker  * and the fields of this data structure must begin with hw_module_t
155*61046927SAndroid Build Coastguard Worker  * followed by module specific information.
156*61046927SAndroid Build Coastguard Worker  */
157*61046927SAndroid Build Coastguard Worker typedef struct gralloc_module_t {
158*61046927SAndroid Build Coastguard Worker     struct hw_module_t common;
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker     /*
161*61046927SAndroid Build Coastguard Worker      * (*registerBuffer)() must be called before a buffer_handle_t that has not
162*61046927SAndroid Build Coastguard Worker      * been created with (*alloc_device_t::alloc)() can be used.
163*61046927SAndroid Build Coastguard Worker      *
164*61046927SAndroid Build Coastguard Worker      * This is intended to be used with buffer_handle_t's that have been
165*61046927SAndroid Build Coastguard Worker      * received in this process through IPC.
166*61046927SAndroid Build Coastguard Worker      *
167*61046927SAndroid Build Coastguard Worker      * This function checks that the handle is indeed a valid one and prepares
168*61046927SAndroid Build Coastguard Worker      * it for use with (*lock)() and (*unlock)().
169*61046927SAndroid Build Coastguard Worker      *
170*61046927SAndroid Build Coastguard Worker      * It is not necessary to call (*registerBuffer)() on a handle created
171*61046927SAndroid Build Coastguard Worker      * with (*alloc_device_t::alloc)().
172*61046927SAndroid Build Coastguard Worker      *
173*61046927SAndroid Build Coastguard Worker      * returns an error if this buffer_handle_t is not valid.
174*61046927SAndroid Build Coastguard Worker      */
175*61046927SAndroid Build Coastguard Worker     int (*registerBuffer)(struct gralloc_module_t const* module,
176*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker     /*
179*61046927SAndroid Build Coastguard Worker      * (*unregisterBuffer)() is called once this handle is no longer needed in
180*61046927SAndroid Build Coastguard Worker      * this process. After this call, it is an error to call (*lock)(),
181*61046927SAndroid Build Coastguard Worker      * (*unlock)(), or (*registerBuffer)().
182*61046927SAndroid Build Coastguard Worker      *
183*61046927SAndroid Build Coastguard Worker      * This function doesn't close or free the handle itself; this is done
184*61046927SAndroid Build Coastguard Worker      * by other means, usually through libcutils's native_handle_close() and
185*61046927SAndroid Build Coastguard Worker      * native_handle_free().
186*61046927SAndroid Build Coastguard Worker      *
187*61046927SAndroid Build Coastguard Worker      * It is an error to call (*unregisterBuffer)() on a buffer that wasn't
188*61046927SAndroid Build Coastguard Worker      * explicitly registered first.
189*61046927SAndroid Build Coastguard Worker      */
190*61046927SAndroid Build Coastguard Worker     int (*unregisterBuffer)(struct gralloc_module_t const* module,
191*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle);
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker     /*
194*61046927SAndroid Build Coastguard Worker      * The (*lock)() method is called before a buffer is accessed for the
195*61046927SAndroid Build Coastguard Worker      * specified usage. This call may block, for instance if the h/w needs
196*61046927SAndroid Build Coastguard Worker      * to finish rendering or if CPU caches need to be synchronized.
197*61046927SAndroid Build Coastguard Worker      *
198*61046927SAndroid Build Coastguard Worker      * The caller promises to modify only pixels in the area specified
199*61046927SAndroid Build Coastguard Worker      * by (l,t,w,h).
200*61046927SAndroid Build Coastguard Worker      *
201*61046927SAndroid Build Coastguard Worker      * The content of the buffer outside of the specified area is NOT modified
202*61046927SAndroid Build Coastguard Worker      * by this call.
203*61046927SAndroid Build Coastguard Worker      *
204*61046927SAndroid Build Coastguard Worker      * If usage specifies GRALLOC_USAGE_SW_*, vaddr is filled with the address
205*61046927SAndroid Build Coastguard Worker      * of the buffer in virtual memory.
206*61046927SAndroid Build Coastguard Worker      *
207*61046927SAndroid Build Coastguard Worker      * Note calling (*lock)() on HAL_PIXEL_FORMAT_YCbCr_*_888 buffers will fail
208*61046927SAndroid Build Coastguard Worker      * and return -EINVAL.  These buffers must be locked with (*lock_ycbcr)()
209*61046927SAndroid Build Coastguard Worker      * instead.
210*61046927SAndroid Build Coastguard Worker      *
211*61046927SAndroid Build Coastguard Worker      * THREADING CONSIDERATIONS:
212*61046927SAndroid Build Coastguard Worker      *
213*61046927SAndroid Build Coastguard Worker      * It is legal for several different threads to lock a buffer from
214*61046927SAndroid Build Coastguard Worker      * read access, none of the threads are blocked.
215*61046927SAndroid Build Coastguard Worker      *
216*61046927SAndroid Build Coastguard Worker      * However, locking a buffer simultaneously for write or read/write is
217*61046927SAndroid Build Coastguard Worker      * undefined, but:
218*61046927SAndroid Build Coastguard Worker      * - shall not result in termination of the process
219*61046927SAndroid Build Coastguard Worker      * - shall not block the caller
220*61046927SAndroid Build Coastguard Worker      * It is acceptable to return an error or to leave the buffer's content
221*61046927SAndroid Build Coastguard Worker      * into an indeterminate state.
222*61046927SAndroid Build Coastguard Worker      *
223*61046927SAndroid Build Coastguard Worker      * If the buffer was created with a usage mask incompatible with the
224*61046927SAndroid Build Coastguard Worker      * requested usage flags here, -EINVAL is returned.
225*61046927SAndroid Build Coastguard Worker      *
226*61046927SAndroid Build Coastguard Worker      */
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker     int (*lock)(struct gralloc_module_t const* module,
229*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle, int usage,
230*61046927SAndroid Build Coastguard Worker             int l, int t, int w, int h,
231*61046927SAndroid Build Coastguard Worker             void** vaddr);
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker     /*
235*61046927SAndroid Build Coastguard Worker      * The (*unlock)() method must be called after all changes to the buffer
236*61046927SAndroid Build Coastguard Worker      * are completed.
237*61046927SAndroid Build Coastguard Worker      */
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker     int (*unlock)(struct gralloc_module_t const* module,
240*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle);
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker     /* reserved for future use */
244*61046927SAndroid Build Coastguard Worker     int (*perform)(struct gralloc_module_t const* module,
245*61046927SAndroid Build Coastguard Worker             int operation, ... );
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker     /*
248*61046927SAndroid Build Coastguard Worker      * The (*lock_ycbcr)() method is like the (*lock)() method, with the
249*61046927SAndroid Build Coastguard Worker      * difference that it fills a struct ycbcr with a description of the buffer
250*61046927SAndroid Build Coastguard Worker      * layout, and zeroes out the reserved fields.
251*61046927SAndroid Build Coastguard Worker      *
252*61046927SAndroid Build Coastguard Worker      * If the buffer format is not compatible with a flexible YUV format (e.g.
253*61046927SAndroid Build Coastguard Worker      * the buffer layout cannot be represented with the ycbcr struct), it
254*61046927SAndroid Build Coastguard Worker      * will return -EINVAL.
255*61046927SAndroid Build Coastguard Worker      *
256*61046927SAndroid Build Coastguard Worker      * This method must work on buffers with HAL_PIXEL_FORMAT_YCbCr_*_888
257*61046927SAndroid Build Coastguard Worker      * if supported by the device, as well as with any other format that is
258*61046927SAndroid Build Coastguard Worker      * requested by the multimedia codecs when they are configured with a
259*61046927SAndroid Build Coastguard Worker      * flexible-YUV-compatible color-format with android native buffers.
260*61046927SAndroid Build Coastguard Worker      *
261*61046927SAndroid Build Coastguard Worker      * Note that this method may also be called on buffers of other formats,
262*61046927SAndroid Build Coastguard Worker      * including non-YUV formats.
263*61046927SAndroid Build Coastguard Worker      *
264*61046927SAndroid Build Coastguard Worker      * Added in GRALLOC_MODULE_API_VERSION_0_2.
265*61046927SAndroid Build Coastguard Worker      */
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker     int (*lock_ycbcr)(struct gralloc_module_t const* module,
268*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle, int usage,
269*61046927SAndroid Build Coastguard Worker             int l, int t, int w, int h,
270*61046927SAndroid Build Coastguard Worker             struct android_ycbcr *ycbcr);
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker     /*
273*61046927SAndroid Build Coastguard Worker      * The (*lockAsync)() method is like the (*lock)() method except
274*61046927SAndroid Build Coastguard Worker      * that the buffer's sync fence object is passed into the lock
275*61046927SAndroid Build Coastguard Worker      * call instead of requiring the caller to wait for completion.
276*61046927SAndroid Build Coastguard Worker      *
277*61046927SAndroid Build Coastguard Worker      * The gralloc implementation takes ownership of the fenceFd and
278*61046927SAndroid Build Coastguard Worker      * is responsible for closing it when no longer needed.
279*61046927SAndroid Build Coastguard Worker      *
280*61046927SAndroid Build Coastguard Worker      * Added in GRALLOC_MODULE_API_VERSION_0_3.
281*61046927SAndroid Build Coastguard Worker      */
282*61046927SAndroid Build Coastguard Worker     int (*lockAsync)(struct gralloc_module_t const* module,
283*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle, int usage,
284*61046927SAndroid Build Coastguard Worker             int l, int t, int w, int h,
285*61046927SAndroid Build Coastguard Worker             void** vaddr, int fenceFd);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker     /*
288*61046927SAndroid Build Coastguard Worker      * The (*unlockAsync)() method is like the (*unlock)() method
289*61046927SAndroid Build Coastguard Worker      * except that a buffer sync fence object is returned from the
290*61046927SAndroid Build Coastguard Worker      * lock call, representing the completion of any pending work
291*61046927SAndroid Build Coastguard Worker      * performed by the gralloc implementation.
292*61046927SAndroid Build Coastguard Worker      *
293*61046927SAndroid Build Coastguard Worker      * The caller takes ownership of the fenceFd and is responsible
294*61046927SAndroid Build Coastguard Worker      * for closing it when no longer needed.
295*61046927SAndroid Build Coastguard Worker      *
296*61046927SAndroid Build Coastguard Worker      * Added in GRALLOC_MODULE_API_VERSION_0_3.
297*61046927SAndroid Build Coastguard Worker      */
298*61046927SAndroid Build Coastguard Worker     int (*unlockAsync)(struct gralloc_module_t const* module,
299*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle, int* fenceFd);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker     /*
302*61046927SAndroid Build Coastguard Worker      * The (*lockAsync_ycbcr)() method is like the (*lock_ycbcr)()
303*61046927SAndroid Build Coastguard Worker      * method except that the buffer's sync fence object is passed
304*61046927SAndroid Build Coastguard Worker      * into the lock call instead of requiring the caller to wait for
305*61046927SAndroid Build Coastguard Worker      * completion.
306*61046927SAndroid Build Coastguard Worker      *
307*61046927SAndroid Build Coastguard Worker      * The gralloc implementation takes ownership of the fenceFd and
308*61046927SAndroid Build Coastguard Worker      * is responsible for closing it when no longer needed.
309*61046927SAndroid Build Coastguard Worker      *
310*61046927SAndroid Build Coastguard Worker      * Added in GRALLOC_MODULE_API_VERSION_0_3.
311*61046927SAndroid Build Coastguard Worker      */
312*61046927SAndroid Build Coastguard Worker     int (*lockAsync_ycbcr)(struct gralloc_module_t const* module,
313*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle, int usage,
314*61046927SAndroid Build Coastguard Worker             int l, int t, int w, int h,
315*61046927SAndroid Build Coastguard Worker             struct android_ycbcr *ycbcr, int fenceFd);
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker     /* getTransportSize(..., outNumFds, outNumInts)
318*61046927SAndroid Build Coastguard Worker      * This function is mandatory on devices running IMapper2.1 or higher.
319*61046927SAndroid Build Coastguard Worker      *
320*61046927SAndroid Build Coastguard Worker      * Get the transport size of a buffer. An imported buffer handle is a raw
321*61046927SAndroid Build Coastguard Worker      * buffer handle with the process-local runtime data appended. This
322*61046927SAndroid Build Coastguard Worker      * function, for example, allows a caller to omit the process-local
323*61046927SAndroid Build Coastguard Worker      * runtime data at the tail when serializing the imported buffer handle.
324*61046927SAndroid Build Coastguard Worker      *
325*61046927SAndroid Build Coastguard Worker      * Note that a client might or might not omit the process-local runtime
326*61046927SAndroid Build Coastguard Worker      * data when sending an imported buffer handle. The mapper must support
327*61046927SAndroid Build Coastguard Worker      * both cases on the receiving end.
328*61046927SAndroid Build Coastguard Worker      */
329*61046927SAndroid Build Coastguard Worker     int32_t (*getTransportSize)(
330*61046927SAndroid Build Coastguard Worker             struct gralloc_module_t const* module, buffer_handle_t handle, uint32_t *outNumFds,
331*61046927SAndroid Build Coastguard Worker             uint32_t *outNumInts);
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker     /* validateBufferSize(..., w, h, format, usage, stride)
334*61046927SAndroid Build Coastguard Worker      * This function is mandatory on devices running IMapper2.1 or higher.
335*61046927SAndroid Build Coastguard Worker      *
336*61046927SAndroid Build Coastguard Worker      * Validate that the buffer can be safely accessed by a caller who assumes
337*61046927SAndroid Build Coastguard Worker      * the specified width, height, format, usage, and stride. This must at least validate
338*61046927SAndroid Build Coastguard Worker      * that the buffer size is large enough. Validating the buffer against
339*61046927SAndroid Build Coastguard Worker      * individual buffer attributes is optional.
340*61046927SAndroid Build Coastguard Worker      */
341*61046927SAndroid Build Coastguard Worker     int32_t (*validateBufferSize)(
342*61046927SAndroid Build Coastguard Worker             struct gralloc_module_t const* device, buffer_handle_t handle,
343*61046927SAndroid Build Coastguard Worker             uint32_t w, uint32_t h, int32_t format, int usage,
344*61046927SAndroid Build Coastguard Worker             uint32_t stride);
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker     /* reserved for future use */
347*61046927SAndroid Build Coastguard Worker     void* reserved_proc[1];
348*61046927SAndroid Build Coastguard Worker 
349*61046927SAndroid Build Coastguard Worker } gralloc_module_t;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker /*****************************************************************************/
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker /**
354*61046927SAndroid Build Coastguard Worker  * Every device data structure must begin with hw_device_t
355*61046927SAndroid Build Coastguard Worker  * followed by module specific public methods and attributes.
356*61046927SAndroid Build Coastguard Worker  */
357*61046927SAndroid Build Coastguard Worker 
358*61046927SAndroid Build Coastguard Worker typedef struct alloc_device_t {
359*61046927SAndroid Build Coastguard Worker     struct hw_device_t common;
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker     /*
362*61046927SAndroid Build Coastguard Worker      * (*alloc)() Allocates a buffer in graphic memory with the requested
363*61046927SAndroid Build Coastguard Worker      * parameters and returns a buffer_handle_t and the stride in pixels to
364*61046927SAndroid Build Coastguard Worker      * allow the implementation to satisfy hardware constraints on the width
365*61046927SAndroid Build Coastguard Worker      * of a pixmap (eg: it may have to be multiple of 8 pixels).
366*61046927SAndroid Build Coastguard Worker      * The CALLER TAKES OWNERSHIP of the buffer_handle_t.
367*61046927SAndroid Build Coastguard Worker      *
368*61046927SAndroid Build Coastguard Worker      * If format is HAL_PIXEL_FORMAT_YCbCr_420_888, the returned stride must be
369*61046927SAndroid Build Coastguard Worker      * 0, since the actual strides are available from the android_ycbcr
370*61046927SAndroid Build Coastguard Worker      * structure.
371*61046927SAndroid Build Coastguard Worker      *
372*61046927SAndroid Build Coastguard Worker      * Returns 0 on success or -errno on error.
373*61046927SAndroid Build Coastguard Worker      */
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker     int (*alloc)(struct alloc_device_t* dev,
376*61046927SAndroid Build Coastguard Worker             int w, int h, int format, int usage,
377*61046927SAndroid Build Coastguard Worker             buffer_handle_t* handle, int* stride);
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker     /*
380*61046927SAndroid Build Coastguard Worker      * (*free)() Frees a previously allocated buffer.
381*61046927SAndroid Build Coastguard Worker      * Behavior is undefined if the buffer is still mapped in any process,
382*61046927SAndroid Build Coastguard Worker      * but shall not result in termination of the program or security breaches
383*61046927SAndroid Build Coastguard Worker      * (allowing a process to get access to another process' buffers).
384*61046927SAndroid Build Coastguard Worker      * THIS FUNCTION TAKES OWNERSHIP of the buffer_handle_t which becomes
385*61046927SAndroid Build Coastguard Worker      * invalid after the call.
386*61046927SAndroid Build Coastguard Worker      *
387*61046927SAndroid Build Coastguard Worker      * Returns 0 on success or -errno on error.
388*61046927SAndroid Build Coastguard Worker      */
389*61046927SAndroid Build Coastguard Worker     int (*free)(struct alloc_device_t* dev,
390*61046927SAndroid Build Coastguard Worker             buffer_handle_t handle);
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker     /* This hook is OPTIONAL.
393*61046927SAndroid Build Coastguard Worker      *
394*61046927SAndroid Build Coastguard Worker      * If non NULL it will be caused by SurfaceFlinger on dumpsys
395*61046927SAndroid Build Coastguard Worker      */
396*61046927SAndroid Build Coastguard Worker     void (*dump)(struct alloc_device_t *dev, char *buff, int buff_len);
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker     void* reserved_proc[7];
399*61046927SAndroid Build Coastguard Worker } alloc_device_t;
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker /** convenience API for opening and closing a supported device */
403*61046927SAndroid Build Coastguard Worker 
gralloc_open(const struct hw_module_t * module,struct alloc_device_t ** device)404*61046927SAndroid Build Coastguard Worker static inline int gralloc_open(const struct hw_module_t* module,
405*61046927SAndroid Build Coastguard Worker         struct alloc_device_t** device) {
406*61046927SAndroid Build Coastguard Worker     return module->methods->open(module,
407*61046927SAndroid Build Coastguard Worker             GRALLOC_HARDWARE_GPU0, TO_HW_DEVICE_T_OPEN(device));
408*61046927SAndroid Build Coastguard Worker }
409*61046927SAndroid Build Coastguard Worker 
gralloc_close(struct alloc_device_t * device)410*61046927SAndroid Build Coastguard Worker static inline int gralloc_close(struct alloc_device_t* device) {
411*61046927SAndroid Build Coastguard Worker     return device->common.close(&device->common);
412*61046927SAndroid Build Coastguard Worker }
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker /**
415*61046927SAndroid Build Coastguard Worker  * map_usage_to_memtrack should be called after allocating a gralloc buffer.
416*61046927SAndroid Build Coastguard Worker  *
417*61046927SAndroid Build Coastguard Worker  * @param usage - it is the flag used when alloc function is called.
418*61046927SAndroid Build Coastguard Worker  *
419*61046927SAndroid Build Coastguard Worker  * This function maps the gralloc usage flags to appropriate memtrack bucket.
420*61046927SAndroid Build Coastguard Worker  * GrallocHAL implementers and users should make an additional ION_IOCTL_TAG
421*61046927SAndroid Build Coastguard Worker  * call using the memtrack tag returned by this function. This will help the
422*61046927SAndroid Build Coastguard Worker  * in-kernel memtack to categorize the memory allocated by different processes
423*61046927SAndroid Build Coastguard Worker  * according to their usage.
424*61046927SAndroid Build Coastguard Worker  *
425*61046927SAndroid Build Coastguard Worker  */
map_usage_to_memtrack(uint32_t usage)426*61046927SAndroid Build Coastguard Worker static inline const char* map_usage_to_memtrack(uint32_t usage) {
427*61046927SAndroid Build Coastguard Worker     usage &= GRALLOC_USAGE_ALLOC_MASK;
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker     if ((usage & GRALLOC_USAGE_HW_CAMERA_WRITE) != 0) {
430*61046927SAndroid Build Coastguard Worker         return "camera";
431*61046927SAndroid Build Coastguard Worker     } else if ((usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) != 0 ||
432*61046927SAndroid Build Coastguard Worker             (usage & GRALLOC_USAGE_EXTERNAL_DISP) != 0) {
433*61046927SAndroid Build Coastguard Worker         return "video";
434*61046927SAndroid Build Coastguard Worker     } else if ((usage & GRALLOC_USAGE_HW_RENDER) != 0 ||
435*61046927SAndroid Build Coastguard Worker             (usage & GRALLOC_USAGE_HW_TEXTURE) != 0) {
436*61046927SAndroid Build Coastguard Worker         return "gl";
437*61046927SAndroid Build Coastguard Worker     } else if ((usage & GRALLOC_USAGE_HW_CAMERA_READ) != 0) {
438*61046927SAndroid Build Coastguard Worker         return "camera";
439*61046927SAndroid Build Coastguard Worker     } else if ((usage & GRALLOC_USAGE_SW_READ_MASK) != 0 ||
440*61046927SAndroid Build Coastguard Worker             (usage & GRALLOC_USAGE_SW_WRITE_MASK) != 0) {
441*61046927SAndroid Build Coastguard Worker         return "cpu";
442*61046927SAndroid Build Coastguard Worker     }
443*61046927SAndroid Build Coastguard Worker     return "graphics";
444*61046927SAndroid Build Coastguard Worker }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker __END_DECLS
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker #endif  // ANDROID_GRALLOC_INTERFACE_H
449