blob: 58c0e334e681443cac0a54d66e09de78e2c443fe [file] [log] [blame]
Dan Stozaa2d5b7d2016-05-20 13:10:14 -07001/*
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
32typedef 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
42typedef 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
122typedef 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
147typedef 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
158typedef 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
243typedef void (*gralloc1_function_pointer_t)();
244
245typedef uint64_t gralloc1_backing_store_t;
246typedef uint64_t gralloc1_buffer_descriptor_t;
247
248/*
249 * Device Struct
250 */
251
252typedef 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
290static 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
296static 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 */
330typedef 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 */
352typedef 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 */
368typedef 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 */
395typedef 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 */
420typedef 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 */
439typedef 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 */
459typedef 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 */
497typedef 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 */
519typedef 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 */
541typedef 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 */
563typedef 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 */
585typedef 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 */
610typedef 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 */
661typedef 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 */
686typedef 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 */
705typedef 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
715typedef 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 */
743typedef 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 */
803typedef 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 */
852typedef 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 */
881typedef 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