• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_HARDWARE_GRALLOC1_H
18 #define ANDROID_HARDWARE_GRALLOC1_H
19 
20 #include <hardware/hardware.h>
21 #include <system/window.h>
22 
23 __BEGIN_DECLS
24 
25 #define GRALLOC_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(1, 0)
26 #define GRALLOC_HARDWARE_MODULE_ID "gralloc"
27 
28 /*
29  * Enums
30  */
31 
32 typedef enum {
33     GRALLOC1_CAPABILITY_INVALID = 0,
34 
35     /* If this capability is supported, then the outBuffers parameter to
36      * allocate may be NULL, which instructs the device to report whether the
37      * given allocation is possible or not. */
38     GRALLOC1_CAPABILITY_TEST_ALLOCATE = 1,
39     GRALLOC1_LAST_CAPABILITY = 1,
40 } gralloc1_capability_t;
41 
42 typedef enum {
43     GRALLOC1_CONSUMER_USAGE_NONE = 0,
44     GRALLOC1_CONSUMER_USAGE_CPU_READ_NEVER = 0,
45     /* 1ULL << 0 */
46     GRALLOC1_CONSUMER_USAGE_CPU_READ = 1ULL << 1,
47     GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN = 1ULL << 2 |
48             GRALLOC1_CONSUMER_USAGE_CPU_READ,
49     /* 1ULL << 3 */
50     /* 1ULL << 4 */
51     /* 1ULL << 5 */
52     /* 1ULL << 6 */
53     /* 1ULL << 7 */
54     GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE = 1ULL << 8,
55     /* 1ULL << 9 */
56     /* 1ULL << 10 */
57     GRALLOC1_CONSUMER_USAGE_HWCOMPOSER = 1ULL << 11,
58     GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET = 1ULL << 12,
59     /* 1ULL << 13 */
60     /* 1ULL << 14 */
61     GRALLOC1_CONSUMER_USAGE_CURSOR = 1ULL << 15,
62     GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER = 1ULL << 16,
63     /* 1ULL << 17 */
64     GRALLOC1_CONSUMER_USAGE_CAMERA = 1ULL << 18,
65     /* 1ULL << 19 */
66     GRALLOC1_CONSUMER_USAGE_RENDERSCRIPT = 1ULL << 20,
67 
68     /* Indicates that the consumer may attach buffers to their end of the
69      * BufferQueue, which means that the producer may never have seen a given
70      * dequeued buffer before. May be ignored by the gralloc device. */
71     GRALLOC1_CONSUMER_USAGE_FOREIGN_BUFFERS = 1ULL << 21,
72 
73     /* 1ULL << 22 */
74     /* 1ULL << 23 */
75     /* 1ULL << 24 */
76     /* 1ULL << 25 */
77     /* 1ULL << 26 */
78     /* 1ULL << 27 */
79 
80     /* Bits reserved for implementation-specific usage flags */
81     GRALLOC1_CONSUMER_USAGE_PRIVATE_0 = 1ULL << 28,
82     GRALLOC1_CONSUMER_USAGE_PRIVATE_1 = 1ULL << 29,
83     GRALLOC1_CONSUMER_USAGE_PRIVATE_2 = 1ULL << 30,
84     GRALLOC1_CONSUMER_USAGE_PRIVATE_3 = 1ULL << 31,
85 
86     /* 1ULL << 32 */
87     /* 1ULL << 33 */
88     /* 1ULL << 34 */
89     /* 1ULL << 35 */
90     /* 1ULL << 36 */
91     /* 1ULL << 37 */
92     /* 1ULL << 38 */
93     /* 1ULL << 39 */
94     /* 1ULL << 40 */
95     /* 1ULL << 41 */
96     /* 1ULL << 42 */
97     /* 1ULL << 43 */
98     /* 1ULL << 44 */
99     /* 1ULL << 45 */
100     /* 1ULL << 46 */
101     /* 1ULL << 47 */
102 
103     /* Bits reserved for implementation-specific usage flags */
104     GRALLOC1_CONSUMER_USAGE_PRIVATE_19 = 1ULL << 48,
105     GRALLOC1_CONSUMER_USAGE_PRIVATE_18 = 1ULL << 49,
106     GRALLOC1_CONSUMER_USAGE_PRIVATE_17 = 1ULL << 50,
107     GRALLOC1_CONSUMER_USAGE_PRIVATE_16 = 1ULL << 51,
108     GRALLOC1_CONSUMER_USAGE_PRIVATE_15 = 1ULL << 52,
109     GRALLOC1_CONSUMER_USAGE_PRIVATE_14 = 1ULL << 53,
110     GRALLOC1_CONSUMER_USAGE_PRIVATE_13 = 1ULL << 54,
111     GRALLOC1_CONSUMER_USAGE_PRIVATE_12 = 1ULL << 55,
112     GRALLOC1_CONSUMER_USAGE_PRIVATE_11 = 1ULL << 56,
113     GRALLOC1_CONSUMER_USAGE_PRIVATE_10 = 1ULL << 57,
114     GRALLOC1_CONSUMER_USAGE_PRIVATE_9 = 1ULL << 58,
115     GRALLOC1_CONSUMER_USAGE_PRIVATE_8 = 1ULL << 59,
116     GRALLOC1_CONSUMER_USAGE_PRIVATE_7 = 1ULL << 60,
117     GRALLOC1_CONSUMER_USAGE_PRIVATE_6 = 1ULL << 61,
118     GRALLOC1_CONSUMER_USAGE_PRIVATE_5 = 1ULL << 62,
119     GRALLOC1_CONSUMER_USAGE_PRIVATE_4 = 1ULL << 63,
120 } gralloc1_consumer_usage_t;
121 
122 typedef enum {
123     GRALLOC1_FUNCTION_INVALID = 0,
124     GRALLOC1_FUNCTION_DUMP = 1,
125     GRALLOC1_FUNCTION_CREATE_DESCRIPTOR = 2,
126     GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR = 3,
127     GRALLOC1_FUNCTION_SET_CONSUMER_USAGE = 4,
128     GRALLOC1_FUNCTION_SET_DIMENSIONS = 5,
129     GRALLOC1_FUNCTION_SET_FORMAT = 6,
130     GRALLOC1_FUNCTION_SET_PRODUCER_USAGE = 7,
131     GRALLOC1_FUNCTION_GET_BACKING_STORE = 8,
132     GRALLOC1_FUNCTION_GET_CONSUMER_USAGE = 9,
133     GRALLOC1_FUNCTION_GET_DIMENSIONS = 10,
134     GRALLOC1_FUNCTION_GET_FORMAT = 11,
135     GRALLOC1_FUNCTION_GET_PRODUCER_USAGE = 12,
136     GRALLOC1_FUNCTION_GET_STRIDE = 13,
137     GRALLOC1_FUNCTION_ALLOCATE = 14,
138     GRALLOC1_FUNCTION_RETAIN = 15,
139     GRALLOC1_FUNCTION_RELEASE = 16,
140     GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES = 17,
141     GRALLOC1_FUNCTION_LOCK = 18,
142     GRALLOC1_FUNCTION_LOCK_FLEX = 19,
143     GRALLOC1_FUNCTION_UNLOCK = 20,
144     GRALLOC1_LAST_FUNCTION = 20,
145 } gralloc1_function_descriptor_t;
146 
147 typedef enum {
148     GRALLOC1_ERROR_NONE = 0,
149     GRALLOC1_ERROR_BAD_DESCRIPTOR = 1,
150     GRALLOC1_ERROR_BAD_HANDLE = 2,
151     GRALLOC1_ERROR_BAD_VALUE = 3,
152     GRALLOC1_ERROR_NOT_SHARED = 4,
153     GRALLOC1_ERROR_NO_RESOURCES = 5,
154     GRALLOC1_ERROR_UNDEFINED = 6,
155     GRALLOC1_ERROR_UNSUPPORTED = 7,
156 } gralloc1_error_t;
157 
158 typedef enum {
159     GRALLOC1_PRODUCER_USAGE_NONE = 0,
160     GRALLOC1_PRODUCER_USAGE_CPU_WRITE_NEVER = 0,
161     /* 1ULL << 0 */
162     GRALLOC1_PRODUCER_USAGE_CPU_READ = 1ULL << 1,
163     GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN = 1ULL << 2 |
164             GRALLOC1_PRODUCER_USAGE_CPU_READ,
165     /* 1ULL << 3 */
166     /* 1ULL << 4 */
167     GRALLOC1_PRODUCER_USAGE_CPU_WRITE = 1ULL << 5,
168     GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN = 1ULL << 6 |
169             GRALLOC1_PRODUCER_USAGE_CPU_WRITE,
170     /* 1ULL << 7 */
171     /* 1ULL << 8 */
172     GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET = 1ULL << 9,
173     /* 1ULL << 10 */
174     /* 1ULL << 11 */
175     /* 1ULL << 12 */
176     /* 1ULL << 13 */
177 
178     /* The consumer must have a hardware-protected path to an external display
179      * sink for this buffer. If a hardware-protected path is not available, then
180      * do not attempt to display this buffer. */
181     GRALLOC1_PRODUCER_USAGE_PROTECTED = 1ULL << 14,
182 
183     /* 1ULL << 15 */
184     /* 1ULL << 16 */
185     GRALLOC1_PRODUCER_USAGE_CAMERA = 1ULL << 17,
186     /* 1ULL << 18 */
187     /* 1ULL << 19 */
188     /* 1ULL << 20 */
189     /* 1ULL << 21 */
190     GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER = 1ULL << 22,
191     /* 1ULL << 23 */
192     /* 1ULL << 24 */
193     /* 1ULL << 25 */
194     /* 1ULL << 26 */
195     /* 1ULL << 27 */
196 
197     /* Bits reserved for implementation-specific usage flags */
198     GRALLOC1_PRODUCER_USAGE_PRIVATE_0 = 1ULL << 28,
199     GRALLOC1_PRODUCER_USAGE_PRIVATE_1 = 1ULL << 29,
200     GRALLOC1_PRODUCER_USAGE_PRIVATE_2 = 1ULL << 30,
201     GRALLOC1_PRODUCER_USAGE_PRIVATE_3 = 1ULL << 31,
202 
203     /* 1ULL << 32 */
204     /* 1ULL << 33 */
205     /* 1ULL << 34 */
206     /* 1ULL << 35 */
207     /* 1ULL << 36 */
208     /* 1ULL << 37 */
209     /* 1ULL << 38 */
210     /* 1ULL << 39 */
211     /* 1ULL << 40 */
212     /* 1ULL << 41 */
213     /* 1ULL << 42 */
214     /* 1ULL << 43 */
215     /* 1ULL << 44 */
216     /* 1ULL << 45 */
217     /* 1ULL << 46 */
218     /* 1ULL << 47 */
219 
220     /* Bits reserved for implementation-specific usage flags */
221     GRALLOC1_PRODUCER_USAGE_PRIVATE_19 = 1ULL << 48,
222     GRALLOC1_PRODUCER_USAGE_PRIVATE_18 = 1ULL << 49,
223     GRALLOC1_PRODUCER_USAGE_PRIVATE_17 = 1ULL << 50,
224     GRALLOC1_PRODUCER_USAGE_PRIVATE_16 = 1ULL << 51,
225     GRALLOC1_PRODUCER_USAGE_PRIVATE_15 = 1ULL << 52,
226     GRALLOC1_PRODUCER_USAGE_PRIVATE_14 = 1ULL << 53,
227     GRALLOC1_PRODUCER_USAGE_PRIVATE_13 = 1ULL << 54,
228     GRALLOC1_PRODUCER_USAGE_PRIVATE_12 = 1ULL << 55,
229     GRALLOC1_PRODUCER_USAGE_PRIVATE_11 = 1ULL << 56,
230     GRALLOC1_PRODUCER_USAGE_PRIVATE_10 = 1ULL << 57,
231     GRALLOC1_PRODUCER_USAGE_PRIVATE_9 = 1ULL << 58,
232     GRALLOC1_PRODUCER_USAGE_PRIVATE_8 = 1ULL << 59,
233     GRALLOC1_PRODUCER_USAGE_PRIVATE_7 = 1ULL << 60,
234     GRALLOC1_PRODUCER_USAGE_PRIVATE_6 = 1ULL << 61,
235     GRALLOC1_PRODUCER_USAGE_PRIVATE_5 = 1ULL << 62,
236     GRALLOC1_PRODUCER_USAGE_PRIVATE_4 = 1ULL << 63,
237 } gralloc1_producer_usage_t;
238 
239 /*
240  * Typedefs
241  */
242 
243 typedef void (*gralloc1_function_pointer_t)();
244 
245 typedef uint64_t gralloc1_backing_store_t;
246 typedef uint64_t gralloc1_buffer_descriptor_t;
247 
248 /*
249  * Device Struct
250  */
251 
252 typedef struct gralloc1_device {
253     /* Must be the first member of this struct, since a pointer to this struct
254      * will be generated by casting from a hw_device_t* */
255     struct hw_device_t common;
256 
257     /* getCapabilities(..., outCount, outCapabilities)
258      *
259      * Provides a list of capabilities (described in the definition of
260      * gralloc1_capability_t above) supported by this device. This list must not
261      * change after the device has been loaded.
262      *
263      * Parameters:
264      *   outCount - if outCapabilities was NULL, the number of capabilities
265      *       which would have been returned; if outCapabilities was not NULL,
266      *       the number of capabilities returned, which must not exceed the
267      *       value stored in outCount prior to the call
268      *   outCapabilities - a list of capabilities supported by this device; may
269      *       be NULL, in which case this function must write into outCount the
270      *       number of capabilities which would have been written into
271      *       outCapabilities
272      */
273     void (*getCapabilities)(struct gralloc1_device* device, uint32_t* outCount,
274             int32_t* /*gralloc1_capability_t*/ outCapabilities);
275 
276     /* getFunction(..., descriptor)
277      *
278      * Returns a function pointer which implements the requested description.
279      *
280      * Parameters:
281      *   descriptor - the function to return
282      *
283      * Returns either a function pointer implementing the requested descriptor
284      *   or NULL if the described function is not supported by this device.
285      */
286     gralloc1_function_pointer_t (*getFunction)(struct gralloc1_device* device,
287             int32_t /*gralloc1_function_descriptor_t*/ descriptor);
288 } gralloc1_device_t;
289 
gralloc1_open(const struct hw_module_t * module,gralloc1_device_t ** device)290 static inline int gralloc1_open(const struct hw_module_t* module,
291         gralloc1_device_t** device) {
292     return module->methods->open(module, GRALLOC_HARDWARE_MODULE_ID,
293             (struct hw_device_t**) device);
294 }
295 
gralloc1_close(gralloc1_device_t * device)296 static inline int gralloc1_close(gralloc1_device_t* device) {
297     return device->common.close(&device->common);
298 }
299 
300 /* dump(..., outSize, outBuffer)
301  * Function descriptor: GRALLOC1_FUNCTION_DUMP
302  * Must be provided by all gralloc1 devices
303  *
304  * Retrieves implementation-defined debug information, which will be displayed
305  * during, for example, `dumpsys SurfaceFlinger`.
306  *
307  * If called with outBuffer == NULL, the device should store a copy of the
308  * desired output and return its length in bytes in outSize. If the device
309  * already has a stored copy, that copy should be purged and replaced with a
310  * fresh copy.
311  *
312  * If called with outBuffer != NULL, the device should copy its stored version
313  * of the output into outBuffer and store how many bytes of data it copied into
314  * outSize. Prior to this call, the client will have populated outSize with the
315  * maximum number of bytes outBuffer can hold. The device must not write more
316  * than this amount into outBuffer. If the device does not currently have a
317  * stored copy, then it should return 0 in outSize.
318  *
319  * Any data written into outBuffer need not be null-terminated.
320  *
321  * Parameters:
322  *   outSize - if outBuffer was NULL, the number of bytes needed to copy the
323  *       device's stored output; if outBuffer was not NULL, the number of bytes
324  *       written into it, which must not exceed the value stored in outSize
325  *       prior to the call; pointer will be non-NULL
326  *   outBuffer - the buffer to write the dump output into; may be NULL as
327  *       described above; data written into this buffer need not be
328  *       null-terminated
329  */
330 typedef void (*GRALLOC1_PFN_DUMP)(gralloc1_device_t* device, uint32_t* outSize,
331         char* outBuffer);
332 
333 /*
334  * Buffer descriptor lifecycle functions
335  *
336  * All of these functions take as their first parameter a device pointer, so
337  * this parameter is omitted from the described parameter lists.
338  */
339 
340 /* createDescriptor(..., outDescriptor)
341  * Function descriptor: GRALLOC1_FUNCTION_CREATE_DESCRIPTOR
342  * Must be provided by all gralloc1 devices
343  *
344  * Creates a new, empty buffer descriptor.
345  *
346  * Parameters:
347  *   outDescriptor - the new buffer descriptor
348  *
349  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
350  *   GRALLOC1_ERROR_NO_RESOURCES - no more descriptors can currently be created
351  */
352 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_CREATE_DESCRIPTOR)(
353         gralloc1_device_t* device, gralloc1_buffer_descriptor_t* outDescriptor);
354 
355 /* destroyDescriptor(..., descriptor)
356  * Function descriptor: GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR
357  * Must be provided by all gralloc1 devices
358  *
359  * Destroys an existing buffer descriptor.
360  *
361  * Parameters:
362  *   descriptor - the buffer descriptor to destroy
363  *
364  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
365  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - descriptor does not refer to a valid
366  *       buffer descriptor
367  */
368 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_DESTROY_DESCRIPTOR)(
369         gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor);
370 
371 /*
372  * Buffer descriptor modification functions
373  *
374  * All of these functions take as their first two parameters a device pointer
375  * and a buffer descriptor, so these parameters are omitted from the described
376  * parameter lists.
377  */
378 
379 /* setConsumerUsage(..., usage)
380  * Function descriptor: GRALLOC1_FUNCTION_SET_CONSUMER_USAGE
381  * Must be provided by all gralloc1 devices
382  *
383  * Sets the desired consumer usage flags of the buffer.
384  *
385  * Valid usage flags can be found in the definition of gralloc1_consumer_usage_t
386  * above.
387  *
388  * Parameters:
389  *   usage - the desired consumer usage flags
390  *
391  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
392  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - the buffer descriptor is invalid
393  *   GRALLOC1_ERROR_BAD_VALUE - an invalid usage flag was passed in
394  */
395 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_SET_CONSUMER_USAGE)(
396         gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor,
397         uint64_t /*gralloc1_consumer_usage_t*/ usage);
398 
399 /* setDimensions(..., width, height)
400  * Function descriptor: GRALLOC1_FUNCTION_SET_DIMENSIONS
401  * Must be provided by all gralloc1 devices
402  *
403  * Sets the desired width and height of the buffer in pixels.
404  *
405  * The width specifies how many columns of pixels should be in the allocated
406  * buffer, but does not necessarily represent the offset in columns between the
407  * same column in adjacent rows. If this offset is required, consult getStride
408  * below.
409  *
410  * The height specifies how many rows of pixels should be in the allocated
411  * buffer.
412  *
413  * Parameters:
414  *   width - the desired width in pixels
415  *   height - the desired height in pixels
416  *
417  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
418  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - the buffer descriptor is invalid
419  */
420 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_SET_DIMENSIONS)(
421         gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor,
422         uint32_t width, uint32_t height);
423 
424 /* setFormat(..., format)
425  * Function descriptor: GRALLOC1_FUNCTION_SET_FORMAT
426  * Must be provided by all gralloc1 devices
427  *
428  * Sets the desired format of the buffer.
429  *
430  * The valid formats can be found in <system/graphics.h>.
431  *
432  * Parameters:
433  *   format - the desired format
434  *
435  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
436  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - the buffer descriptor is invalid
437  *   GRALLOC1_ERROR_BAD_VALUE - format is invalid
438  */
439 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_SET_FORMAT)(
440         gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor,
441         int32_t /*android_pixel_format_t*/ format);
442 
443 /* setProducerUsage(..., usage)
444  * Function descriptor: GRALLOC1_FUNCTION_SET_PRODUCER_USAGE
445  * Must be provided by all gralloc1 devices
446  *
447  * Sets the desired producer usage flags of the buffer.
448  *
449  * Valid usage flags can be found in the definition of gralloc1_producer_usage_t
450  * above.
451  *
452  * Parameters:
453  *   usage - the desired producer usage flags
454  *
455  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
456  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - the buffer descriptor is invalid
457  *   GRALLOC1_ERROR_BAD_VALUE - an invalid usage flag was passed in
458  */
459 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_SET_PRODUCER_USAGE)(
460         gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor,
461         uint64_t /*gralloc1_producer_usage_t*/ usage);
462 
463 /*
464  * Buffer handle query functions
465  *
466  * All of these functions take as their first two parameters a device pointer
467  * and a buffer handle, so these parameters are omitted from the described
468  * parameter lists.
469  *
470  * [1] Currently many of these functions may return GRALLOC1_ERROR_UNSUPPORTED,
471  * which means that the device is not able to retrieve the requested information
472  * from the buffer. This is necessary to enable a smooth transition from earlier
473  * versions of the gralloc HAL, but gralloc1 implementers are strongly
474  * discouraged from returning this value, as future versions of the platform
475  * code will require all of these functions to succeed given a valid handle.
476  */
477 
478 /* getBackingStore(..., outStore)
479  * Function descriptor: GRALLOC1_FUNCTION_GET_BACKING_STORE
480  * Must be provided by all gralloc1 devices
481  *
482  * Gets a value that uniquely identifies the backing store of the given buffer.
483  *
484  * Buffers which share a backing store should return the same value from this
485  * function. If the buffer is present in more than one process, the backing
486  * store value for that buffer is not required to be the same in every process.
487  *
488  * Parameters:
489  *   outStore - the backing store identifier for this buffer
490  *
491  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
492  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
493  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the
494  *       backing store identifier from the buffer; see note [1] in this
495  *       section's header for more information
496  */
497 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_BACKING_STORE)(
498         gralloc1_device_t* device, buffer_handle_t buffer,
499         gralloc1_backing_store_t* outStore);
500 
501 /* getConsumerUsage(..., outUsage)
502  * Function descriptor: GRALLOC1_FUNCTION_GET_CONSUMER_USAGE
503  * Must be provided by all gralloc1 devices
504  *
505  * Gets the consumer usage flags which were used to allocate this buffer.
506  *
507  * Usage flags can be found in the definition of gralloc1_consumer_usage_t above
508  *
509  * Parameters:
510  *   outUsage - the consumer usage flags used to allocate this buffer; must be
511  *       non-NULL
512  *
513  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
514  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
515  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the
516  *       dimensions from the buffer; see note [1] in this section's header for
517  *       more information
518  */
519 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_CONSUMER_USAGE)(
520         gralloc1_device_t* device, buffer_handle_t buffer,
521         uint64_t* /*gralloc1_consumer_usage_t*/ outUsage);
522 
523 /* getDimensions(..., outWidth, outHeight)
524  * Function descriptor: GRALLOC1_FUNCTION_GET_DIMENSIONS
525  * Must be provided by all gralloc1 devices
526  *
527  * Gets the width and height of the buffer in pixels.
528  *
529  * See setDimensions for more information about these values.
530  *
531  * Parameters:
532  *   outWidth - the width of the buffer in pixels, must be non-NULL
533  *   outHeight - the height of the buffer in pixels, must be non-NULL
534  *
535  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
536  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
537  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the
538  *       dimensions from the buffer; see note [1] in this section's header for
539  *       more information
540  */
541 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_DIMENSIONS)(
542         gralloc1_device_t* device, buffer_handle_t buffer, uint32_t* outWidth,
543         uint32_t* outHeight);
544 
545 /* getFormat(..., outFormat)
546  * Function descriptor: GRALLOC1_FUNCTION_GET_FORMAT
547  * Must be provided by all gralloc1 devices
548  *
549  * Gets the format of the buffer.
550  *
551  * The valid formats can be found in the HAL_PIXEL_FORMAT_* enum in
552  * system/graphics.h.
553  *
554  * Parameters:
555  *   outFormat - the format of the buffer; must be non-NULL
556  *
557  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
558  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
559  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the format
560  *       from the buffer; see note [1] in this section's header for more
561  *       information
562  */
563 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_FORMAT)(
564         gralloc1_device_t* device, buffer_handle_t descriptor,
565         int32_t* outFormat);
566 
567 /* getProducerUsage(..., outUsage)
568  * Function descriptor: GRALLOC1_FUNCTION_GET_PRODUCER_USAGE
569  * Must be provided by all gralloc1 devices
570  *
571  * Gets the producer usage flags which were used to allocate this buffer.
572  *
573  * Usage flags can be found in the definition of gralloc1_producer_usage_t above
574  *
575  * Parameters:
576  *   outUsage - the producer usage flags used to allocate this buffer; must be
577  *       non-NULL
578  *
579  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
580  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
581  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the usage
582  *       from the buffer; see note [1] in this section's header for more
583  *       information
584  */
585 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_PRODUCER_USAGE)(
586         gralloc1_device_t* device, buffer_handle_t buffer,
587         uint64_t* /*gralloc1_producer_usage_t*/ outUsage);
588 
589 /* getStride(..., outStride)
590  * Function descriptor: GRALLOC1_FUNCTION_GET_STRIDE
591  * Must be provided by all gralloc1 devices
592  *
593  * Gets the stride of the buffer in pixels.
594  *
595  * The stride is the offset in pixel-sized elements between the same column in
596  * two adjacent rows of pixels. This may not be equal to the width of the
597  * buffer.
598  *
599  * Parameters:
600  *   outStride - the stride in pixels; must be non-NULL
601  *
602  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
603  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
604  *   GRALLOC1_ERROR_UNDEFINED - the notion of a stride is not meaningful for
605  *       this format
606  *   GRALLOC1_ERROR_UNSUPPORTED - the device is unable to retrieve the stride
607  *       from the descriptor; see note [1] in this section's header for more
608  *       information
609  */
610 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_STRIDE)(
611         gralloc1_device_t* device, buffer_handle_t buffer, uint32_t* outStride);
612 
613 /*
614  * Buffer management functions
615  */
616 
617 /* allocate(..., numDescriptors, descriptors, outBuffers)
618  * Function descriptor: GRALLOC1_FUNCTION_ALLOCATE
619  * Must be provided by all gralloc1 devices
620  *
621  * Attempts to allocate a number of buffers sharing a backing store.
622  *
623  * Each buffer will correspond to one of the descriptors passed into the
624  * function. If the device is unable to share the backing store between the
625  * buffers, it should attempt to allocate the buffers with different backing
626  * stores and return GRALLOC1_ERROR_NOT_SHARED if it is successful.
627  *
628  * If this call is successful, the client is responsible for freeing the
629  * buffer_handle_t using release() when it is finished with the buffer. It is
630  * not necessary to call retain() on the returned buffers, as they must have a
631  * reference added by the device before returning.
632  *
633  * If GRALLOC1_CAPABILITY_TEST_ALLOCATE is supported by this device, outBuffers
634  * may be NULL. In this case, the device must not attempt to allocate any
635  * buffers, but instead must return either GRALLOC1_ERROR_NONE if such an
636  * allocation is possible (ignoring potential resource contention which might
637  * lead to a GRALLOC1_ERROR_NO_RESOURCES error), GRALLOC1_ERROR_NOT_SHARED if
638  * the buffers can be allocated, but cannot share a backing store, or
639  * GRALLOC1_ERROR_UNSUPPORTED if one or more of the descriptors can never be
640  * allocated by the device.
641  *
642  * Parameters:
643  *   numDescriptors - the number of buffer descriptors, which must also be equal
644  *       to the size of the outBuffers array
645  *   descriptors - the buffer descriptors to attempt to allocate
646  *   outBuffers - the allocated buffers; must be non-NULL unless the device
647  *       supports GRALLOC1_CAPABILITY_TEST_ALLOCATE (see above), and must not be
648  *       modified by the device if allocation is unsuccessful
649  *
650  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
651  *   GRALLOC1_ERROR_BAD_DESCRIPTOR - one of the descriptors does not refer to a
652  *      valid buffer descriptor
653  *   GRALLOC1_ERROR_NOT_SHARED - allocation was successful, but required more
654  *       than one backing store to satisfy all of the buffer descriptors
655  *   GRALLOC1_ERROR_NO_RESOURCES - allocation failed because one or more of the
656  *       backing stores could not be created at this time (but this allocation
657  *       might succeed at a future time)
658  *   GRALLOC1_ERROR_UNSUPPORTED - one or more of the descriptors can never be
659  *       satisfied by the device
660  */
661 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_ALLOCATE)(
662         gralloc1_device_t* device, uint32_t numDescriptors,
663         const gralloc1_buffer_descriptor_t* descriptors,
664         buffer_handle_t* outBuffers);
665 
666 /* retain(..., buffer)
667  * Function descriptor: GRALLOC1_FUNCTION_RETAIN
668  * Must be provided by all gralloc1 devices
669  *
670  * Adds a reference to the given buffer.
671  *
672  * This function must be called when a buffer_handle_t is received from a remote
673  * process to prevent the buffer's data from being freed when the remote process
674  * releases the buffer. It may also be called to increase the reference count if
675  * two components in the same process want to interact with the buffer
676  * independently.
677  *
678  * Parameters:
679  *   buffer - the buffer to which a reference should be added
680  *
681  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
682  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
683  *   GRALLOC1_ERROR_NO_RESOURCES - it is not possible to add a reference to this
684  *       buffer at this time
685  */
686 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_RETAIN)(
687         gralloc1_device_t* device, buffer_handle_t buffer);
688 
689 /* release(..., buffer)
690  * Function descriptor: GRALLOC1_FUNCTION_RELEASE
691  * Must be provided by all gralloc1 devices
692  *
693  * Removes a reference from the given buffer.
694  *
695  * If no references remain, the buffer should be freed. When the last buffer
696  * referring to a particular backing store is freed, that backing store should
697  * also be freed.
698  *
699  * Parameters:
700  *   buffer - the buffer from which a reference should be removed
701  *
702  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
703  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
704  */
705 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_RELEASE)(
706         gralloc1_device_t* device, buffer_handle_t buffer);
707 
708 /*
709  * Buffer access functions
710  *
711  * All of these functions take as their first parameter a device pointer, so
712  * this parameter is omitted from the described parameter lists.
713  */
714 
715 typedef struct gralloc1_rect {
716     int32_t left;
717     int32_t top;
718     int32_t width;
719     int32_t height;
720 } gralloc1_rect_t;
721 
722 /* getNumFlexPlanes(..., buffer, outNumPlanes)
723  * Function descriptor: GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES
724  * Must be provided by all gralloc1 devices
725  *
726  * Returns the number of flex layout planes which are needed to represent the
727  * given buffer. This may be used to efficiently allocate only as many plane
728  * structures as necessary before calling into lockFlex.
729  *
730  * If the given buffer cannot be locked as a flex format, this function may
731  * return GRALLOC1_ERROR_UNSUPPORTED (as lockFlex would).
732  *
733  * Parameters:
734  *   buffer - the buffers for which the number of planes should be queried
735  *   outNumPlanes - the number of flex planes required to describe the given
736  *       buffer; must be non-NULL
737  *
738  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
739  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
740  *   GRALLOC1_ERROR_UNSUPPORTED - the buffer's format cannot be represented in a
741  *       flex layout
742  */
743 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_GET_NUM_FLEX_PLANES)(
744         gralloc1_device_t* device, buffer_handle_t buffer,
745         uint32_t* outNumPlanes);
746 
747 /* lock(..., buffer, producerUsage, consumerUsage, accessRegion, outData,
748  *     acquireFence)
749  * Function descriptor: GRALLOC1_FUNCTION_LOCK
750  * Must be provided by all gralloc1 devices
751  *
752  * Locks the given buffer for the specified CPU usage.
753  *
754  * Exactly one of producerUsage and consumerUsage must be *_USAGE_NONE. The
755  * usage which is not *_USAGE_NONE must be one of the *_USAGE_CPU_* values, as
756  * applicable. Locking a buffer for a non-CPU usage is not supported.
757  *
758  * Locking the same buffer simultaneously from multiple threads is permitted,
759  * but if any of the threads attempt to lock the buffer for writing, the
760  * behavior is undefined, except that it must not cause process termination or
761  * block the client indefinitely. Leaving the buffer content in an indeterminate
762  * state or returning an error are both acceptable.
763  *
764  * The client must not modify the content of the buffer outside of accessRegion,
765  * and the device need not guarantee that content outside of accessRegion is
766  * valid for reading. The result of reading or writing outside of accessRegion
767  * is undefined, except that it must not cause process termination.
768  *
769  * outData must be a non-NULL pointer, the contents of which which will be
770  * filled with a pointer to the locked buffer memory. This address will
771  * represent the top-left corner of the entire buffer, even if accessRegion does
772  * not begin at the top-left corner.
773  *
774  * acquireFence is a file descriptor referring to a acquire sync fence object,
775  * which will be signaled when it is safe for the device to access the contents
776  * of the buffer (prior to locking). If it is already safe to access the buffer
777  * contents, -1 may be passed instead.
778  *
779  * Parameters:
780  *   buffer - the buffer to lock
781  *   producerUsage - the producer usage flags to request; either this or
782  *       consumerUsage must be GRALLOC1_*_USAGE_NONE, and the other must be a
783  *       CPU usage
784  *   consumerUsage - the consumer usage flags to request; either this or
785  *       producerUsage must be GRALLOC1_*_USAGE_NONE, and the other must be a
786  *       CPU usage
787  *   accessRegion - the portion of the buffer that the client intends to access;
788  *       must be non-NULL
789  *   outData - will be filled with a CPU-accessible pointer to the buffer data;
790  *       must be non-NULL
791  *   acquireFence - a sync fence file descriptor as described above
792  *
793  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
794  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
795  *   GRALLOC1_ERROR_BAD_VALUE - neither or both of producerUsage and
796  *       consumerUsage were GRALLOC1_*_USAGE_NONE, or the usage which was not
797  *       *_USAGE_NONE was not a CPU usage
798  *   GRALLOC1_ERROR_NO_RESOURCES - the buffer cannot be locked at this time, but
799  *       locking may succeed at a future time
800  *   GRALLOC1_ERROR_UNSUPPORTED - the buffer cannot be locked with the given
801  *       usage, and any future attempts at locking will also fail
802  */
803 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_LOCK)(
804         gralloc1_device_t* device, buffer_handle_t buffer,
805         uint64_t /*gralloc1_producer_usage_t*/ producerUsage,
806         uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage,
807         const gralloc1_rect_t* accessRegion, void** outData,
808         int32_t acquireFence);
809 
810 /* lockFlex(..., buffer, producerUsage, consumerUsage, accessRegion,
811  *     outFlexLayout, outAcquireFence)
812  * Function descriptor: GRALLOC1_FUNCTION_LOCK_FLEX
813  * Must be provided by all gralloc1 devices
814  *
815  * This is largely the same as lock(), except that instead of returning a
816  * pointer directly to the buffer data, it returns an android_flex_layout
817  * struct describing how to access the data planes.
818  *
819  * This function must work on buffers with HAL_PIXEL_FORMAT_YCbCr_*_888 if
820  * supported by the device, as well as with any other formats requested by
821  * multimedia codecs when they are configured with a flexible-YUV-compatible
822  * color format.
823  *
824  * This function may also be called on buffers of other formats, including
825  * non-YUV formats, but if the buffer format is not compatible with a flexible
826  * representation, it may return GRALLOC1_ERROR_UNSUPPORTED.
827  *
828  * Parameters:
829  *   buffer - the buffer to lock
830  *   producerUsage - the producer usage flags to request; either this or
831  *       consumerUsage must be GRALLOC1_*_USAGE_NONE, and the other must be a
832  *       CPU usage
833  *   consumerUsage - the consumer usage flags to request; either this or
834  *       producerUsage must be GRALLOC1_*_USAGE_NONE, and the other must be a
835  *       CPU usage
836  *   accessRegion - the portion of the buffer that the client intends to access;
837  *      must be non-NULL
838  *   outFlexLayout - will be filled with the description of the planes in the
839  *       buffer
840  *   acquireFence - a sync fence file descriptor as described in lock()
841  *
842  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
843  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
844  *   GRALLOC1_ERROR_BAD_VALUE - neither or both of producerUsage and
845  *       consumerUsage were *_USAGE_NONE, or the usage which was not
846  *       *_USAGE_NONE was not a CPU usage
847  *   GRALLOC1_ERROR_NO_RESOURCES - the buffer cannot be locked at this time, but
848  *       locking may succeed at a future time
849  *   GRALLOC1_ERROR_UNSUPPORTED - the buffer cannot be locked with the given
850  *       usage, and any future attempts at locking will also fail
851  */
852 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_LOCK_FLEX)(
853         gralloc1_device_t* device, buffer_handle_t buffer,
854         uint64_t /*gralloc1_producer_usage_t*/ producerUsage,
855         uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage,
856         const gralloc1_rect_t* accessRegion,
857         struct android_flex_layout* outFlexLayout, int32_t acquireFence);
858 
859 /* unlock(..., buffer, releaseFence)
860  * Function descriptor: GRALLOC1_FUNCTION_UNLOCK
861  * Must be provided by all gralloc1 devices
862  *
863  * This function indicates to the device that the client will be done with the
864  * buffer when releaseFence signals.
865  *
866  * outReleaseFence will be filled with a file descriptor referring to a release
867  * sync fence object, which will be signaled when it is safe to access the
868  * contents of the buffer (after the buffer has been unlocked). If it is already
869  * safe to access the buffer contents, then -1 may be returned instead.
870  *
871  * This function is used to unlock both buffers locked by lock() and those
872  * locked by lockFlex().
873  *
874  * Parameters:
875  *   buffer - the buffer to unlock
876  *   outReleaseFence - a sync fence file descriptor as described above
877  *
878  * Returns GRALLOC1_ERROR_NONE or one of the following errors:
879  *   GRALLOC1_ERROR_BAD_HANDLE - the buffer handle is invalid
880  */
881 typedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_UNLOCK)(
882         gralloc1_device_t* device, buffer_handle_t buffer,
883         int32_t* outReleaseFence);
884 
885 __END_DECLS
886 
887 #endif
888