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