blob: 23b360a535fb83fd71ff89bab937c779cd9c9766 [file] [log] [blame]
Pawin Vongmasa95674af2018-09-06 04:40:55 -07001/*
2 * Copyright (C) 2018 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
17package android.hardware.graphics.bufferqueue@2.0;
18
19import android.hardware.graphics.common@1.2::HardwareBuffer;
20import android.hardware.graphics.common@1.2::HardwareBufferDescription;
21import android.hardware.graphics.common@1.2::Rect;
22
23import IProducerListener;
24
25/**
26 * Ref: frameworks/native/include/gui/IGraphicBufferProducer.h:
27 * IGraphicBufferProducer
28 * This is a wrapper/wrapped HAL interface for the actual binder interface.
29 */
30interface IGraphicBufferProducer {
31 /**
32 * Sets the maximum number of buffers that can be dequeued at one time. If
33 * this method succeeds, any new buffer slots shall be both unallocated and
34 * owned by the buffer queue, i.e., they are not owned by the producer or
35 * the consumer. Calling this may cause some buffer slots to be emptied. If
36 * the caller is caching the contents of the buffer slots, it must empty
37 * that cache after calling this method.
38 *
39 * @p maxDequeuedBuffers must not be less than the number of currently
40 * dequeued buffer slots; otherwise, the returned @p status shall be
41 * `BAD_VALUE`.
42 *
43 * @p maxDequeuedBuffers must be at least 1 (inclusive), but at most
44 * (`NUM_BUFFER_SLOTS` - the minimum undequeued buffer count) (exclusive).
45 * The minimum undequeued buffer count can be obtained by calling
46 * `query(ANATIVEWINDOW_QUERY_MIN_UNDEQUEUED_BUFFERS)`.
47 *
48 * Before calling setMaxDequeuedBufferCount(), the caller must make sure
49 * that
50 * - @p maxDequeuedBuffers is greater than or equal to 1.
51 * - @p maxDequeuedBuffers is greater than or equal to the number of
52 * currently dequeued buffer slots.
53 * If any of these conditions do not hold, or if the request to set the new
54 * maximum number of dequeued buffers cannot be accomplished for any other
55 * reasons, `BAD_VALUE` shall be returned in @p status.
56 *
57 * @param maxDequeuedBuffers The desired number of buffers that can be
58 * dequeued at one time.
59 * @return status Status of the call.
60 */
61 setMaxDequeuedBufferCount(
62 int32_t maxDequeuedBuffers
63 ) generates (
64 Status status
65 );
66
67 /**
68 * Assigns a newly created buffer to the given slot index. The client is
69 * expected to mirror the slot-to-buffer mapping so that it is not necessary
70 * to transfer a `HardwareBuffer` object for every dequeue operation.
71 *
72 * If @p slot is not a valid slot index corresponding to a dequeued buffer,
73 * the call shall fail with @p status set to `BAD_VALUE`.
74 *
75 * @param slot Slot index.
76 * @return status Status of the call.
77 * @return buffer New buffer associated to the given slot index.
Pawin Vongmasad80b5bb2019-03-07 04:38:57 -080078 * @return generationNumber Generation number of the buffer. If
79 * requestBuffer() is called immediately after dequeueBuffer() returns
80 * with `bufferNeedsReallocation` set to `true`, @p generationNumber must
81 * match the current generation number of the buffer queue previously
82 * set by setGenerationNumber(). Otherwise, @p generationNumber may not
83 * match the current generation number of the buffer queue.
Pawin Vongmasa95674af2018-09-06 04:40:55 -070084 */
85 requestBuffer(
86 int32_t slot
87 ) generates (
88 Status status,
Pawin Vongmasad80b5bb2019-03-07 04:38:57 -080089 HardwareBuffer buffer,
90 uint32_t generationNumber
Pawin Vongmasa95674af2018-09-06 04:40:55 -070091 );
92
93 /**
94 * Sets the async flag: whether the producer intends to asynchronously queue
95 * buffers without blocking. Typically this is used for triple-buffering
96 * and/or when the swap interval is set to zero.
97 *
98 * Enabling async mode may internally allocate an additional buffer to allow
99 * for the asynchronous behavior. If it is not enabled, queue/dequeue calls
100 * may block.
101 *
102 * Changing the async flag may affect the number of available slots. If the
103 * adjustment to the number of slots cannot be made, @p status shall be set
104 * to `BAD_VALUE`.
105 *
106 * @param async True if the asynchronous operation is desired; false
107 * otherwise.
108 * @return status Status of the call.
109 */
110 setAsyncMode(
111 bool async
112 ) generates (
113 Status status
114 );
115
116 /**
117 * Input data for dequeueBuffer() specifying desired attributes of a buffer
118 * to dequeue.
119 *
120 * This structure contains 4 fields from
121 * +llndk libnativewindow#AHardwareBuffer_Desc.
122 *
123 * The `width` and `height` parameters must be no greater than the minimum
124 * of `GL_MAX_VIEWPORT_DIMS` and `GL_MAX_TEXTURE_SIZE` (see:
125 * glGetIntegerv()). An error due to invalid dimensions may not be reported
126 * until updateTexImage() is called.
127 *
128 * If `width` and `height` are both zero, the default dimensions shall be
129 * used. If only one of `width` and `height` is zero, dequeueBuffer() shall
130 * return `BAD_VALUE` in `status`.
131 *
132 * If `format` is zero, the default format shall be used.
133 *
134 * `usage` shall be merged with the usage flags set from the consumer side.
135 *
136 * @sa +llndk libnativewindow#AHardwareBuffer_Desc.
137 */
138 struct DequeueBufferInput {
139 uint32_t width;
140 uint32_t height;
141 uint32_t format;
142 uint64_t usage;
143 };
144
145 /**
146 * Output data for dequeueBuffer().
147 *
148 * A `DequeueBufferOutput` object returned from dequeueBuffer() shall be
149 * valid if and only if `status` returned from the same call is `OK`.
150 */
151 struct DequeueBufferOutput {
152 /**
153 * The number of frames that have elapsed since the buffer was last
154 * queued.
155 */
156 uint64_t bufferAge;
157 /**
158 * Whether the client must call requestBuffer().
159 */
160 bool bufferNeedsReallocation;
161 /**
162 * Whether the client must discard the mirrored slot-to-buffer
163 * mapping.
164 */
165 bool releaseAllBuffers;
166 /**
167 * Fence associated with the buffer.
168 *
169 * If this is an empty fence, the buffer may be written immediately;
170 * otherwise, the buffer must not be written to until the fence signals.
171 */
172 Fence fence;
173 };
174
175 /**
176 * Requests a new buffer slot for the client to use. Ownership of the slot
177 * is transfered to the client, meaning that the server shall not use the
178 * contents of the buffer associated with that slot.
179 *
180 * On success, @p status shall be `OK`, and @p output shall contain valid
181 * information of the call. Otherwise, the contents of @p output are
182 * meaningless.
183 *
184 * The slot index returned in @p slot may or may not contain a buffer
185 * (client-side). If the slot is empty, the client must call
186 * requestBuffer() to assign a new buffer to that slot.
187 *
188 * Once the client is done filling this buffer, it is expected to transfer
189 * buffer ownership back to the server with either cancelBuffer() on
190 * the dequeued slot or to fill in the contents of its associated buffer
191 * contents and call queueBuffer().
192 *
193 * If dequeueBuffer() returns with `output.releaseAllBuffers` set to `true`,
194 * the client is expected to release all of the mirrored slot-to-buffer
195 * mappings.
196 *
197 * If dequeueBuffer() returns with `output.bufferNeedsReallocation` set to
198 * `true`, the client is expected to call requestBuffer() immediately.
199 *
200 * The returned `output.fence` shall be updated to hold the fence associated
201 * with the buffer. The contents of the buffer must not be overwritten until
202 * the fence signals. If the fence is an empty fence, the buffer may be
203 * written immediately.
204 *
205 * This call shall block until a buffer is available to be dequeued. If
206 * both the producer and consumer are controlled by the app, then this call
207 * can never block and shall return `WOULD_BLOCK` in @p status if no buffer
208 * is available.
209 *
210 * If a dequeue operation shall cause certain conditions on the number of
211 * buffers to be violated (such as the maximum number of dequeued buffers),
212 * @p status shall be set to `INVALID_OPERATION` to indicate failure.
213 *
214 * If a dequeue operation cannot be completed within the time period
215 * previously set by setDequeueTimeout(), the return @p status shall
216 * `TIMED_OUT`.
217 *
218 * See @ref DequeueBufferInput for more information on the @p input
219 * parameter.
220 *
221 * @param input See #DequeueBufferInput for more information.
Pawin Vongmasad80b5bb2019-03-07 04:38:57 -0800222 * @return status Status of the call.
223 * @return slot Slot index.
224 * @return output See #DequeueBufferOutput for more information.
Pawin Vongmasa95674af2018-09-06 04:40:55 -0700225 *
226 * @sa queueBuffer(), requestBuffer().
227 */
228 dequeueBuffer(
229 DequeueBufferInput input
230 ) generates (
231 Status status,
232 int32_t slot,
233 DequeueBufferOutput output
234 );
235
236 /**
237 * Attempts to remove all ownership of the buffer in the given slot from the
238 * buffer queue.
239 *
240 * If this call succeeds, the slot shall be freed, and there shall be no way
241 * to obtain the buffer from this interface. The freed slot shall remain
242 * unallocated until either it is selected to hold a freshly allocated
243 * buffer in dequeueBuffer() or a buffer is attached to the slot. The buffer
244 * must have already been dequeued, and the caller must already possesses
245 * the buffer (i.e., must have called requestBuffer()).
246 *
247 * @param slot Slot index.
248 * @return status Status of the call.
249 */
250 detachBuffer(
251 int32_t slot
252 ) generates (
253 Status status
254 );
255
256 /**
257 * Dequeues a buffer slot, requests the buffer associated to the slot, and
258 * detaches it from the buffer queue. This is equivalent to calling
259 * dequeueBuffer(), requestBuffer(), and detachBuffer() in succession except
260 * for two things:
261 * 1. It is unnecessary to provide a #DequeueBufferInput object.
262 * 2. The call shall not block, since if it cannot find an appropriate
263 * buffer to return, it shall return an error instead.
264 *
265 * Only slots that are free but still contain a buffer shall be considered,
266 * and the oldest of those shall be returned. @p buffer is equivalent to the
267 * buffer that would be returned from requestBuffer(), and @p fence is
268 * equivalent to the fence that would be returned from dequeueBuffer().
269 *
270 * @return status Status of the call.
271 * @return buffer Buffer just released from the buffer queue.
272 * @return fence Fence associated to @p buffer.
273 *
274 * @sa dequeueBuffer(), requestBuffer(), detachBuffer().
275 */
276 detachNextBuffer(
277 ) generates (
278 Status status,
279 HardwareBuffer buffer,
280 Fence fence
281 );
282
283 /**
284 * Attempts to transfer ownership of a buffer to the buffer queue.
285 *
286 * If this call succeeds, it shall be as if this buffer was dequeued from the
287 * returned slot index. As such, this call shall fail if attaching this
288 * buffer would cause too many buffers to be simultaneously dequeued.
289 *
290 * If the returned @p releaseAllBuffers is `true`, the caller is expected to
291 * release all of the mirrored slot-to-buffer mappings.
292 *
293 * See dequeueBuffer() for conditions that may cause the call to fail.
294 *
295 * @param buffer Buffer to attach to the buffer queue.
Pawin Vongmasad80b5bb2019-03-07 04:38:57 -0800296 * @param generationNumber Generation number of the buffer. If this does not
297 * match the current generation number of the buffer queue, the call
298 * must fail with @p status set to `BAD_VALUE`.
Pawin Vongmasa95674af2018-09-06 04:40:55 -0700299 * @return status Status of the call.
300 * @return slot Slot index assigned to @p buffer.
301 * @return releaseAllBuffers Whether the caller is expected to release all
302 * of the mirrored slot-to-buffer mappings.
303 *
304 * @sa dequeueBuffer().
305 */
306 attachBuffer(
Pawin Vongmasad80b5bb2019-03-07 04:38:57 -0800307 HardwareBuffer buffer,
308 uint32_t generationNumber
Pawin Vongmasa95674af2018-09-06 04:40:55 -0700309 ) generates (
310 Status status,
311 int32_t slot,
312 bool releaseAllBuffers
313 );
314
315 struct QueueBufferInput {
316 /**
317 * Timestamp in nanoseconds.
318 */
319 int64_t timestamp;
320 /**
321 * Whether the timestamp was synthesized at queue time.
322 */
323 bool isAutoTimestamp;
324 /**
325 * Dataspace of the contents.
326 *
327 * @sa +ndk libnativewindow#ADataSpace.
328 */
329 int32_t dataSpace;
330 /**
331 * Crop rectangle that is used as a hint to the consumer.
332 */
333 Rect crop;
334 /**
335 * Transformation flags.
336 *
337 * @sa +ndk libnativewindow#ANativeWindowTransform.
338 */
339 int32_t transform;
340 /**
341 * The sticky transform set in Surface (only used by the LEGACY camera
342 * mode).
343 *
344 * @sa +ndk libnativewindow#ANativeWindowTransform.
345 */
346 int32_t stickyTransform;
347 /**
348 * Fence that the consumer must wait on before reading the buffer. An
349 * empty fence indicates that the buffer is ready immediately.
350 */
351 Fence fence;
352 /**
353 * List of rectangular pieces covering the damage region.
354 */
355 vec<Rect> surfaceDamage;
356 };
357
358 /**
359 * Information about the queued buffer. `QueueBufferOutput` is used in both
360 * queueBuffer() and connect().
361 */
362 struct QueueBufferOutput {
363 /**
364 * Default width of a buffer in the buffer queue.
365 */
366 uint32_t width;
367 /**
368 * Default height of a buffer in the buffer queue.
369 */
370 uint32_t height;
371 /**
372 * The transform hint of the buffer queue.
373 *
374 * @sa +ndk libnativewindow#ANativeWindowTransform.
375 */
376 int32_t transformHint;
377 /**
378 * The number of pending buffers in the buffer queue. If this is
379 * returned from queueBuffer(), the number shall include the buffer that
380 * has just been queued.
381 */
382 uint32_t numPendingBuffers;
383 /**
384 * The frame number of the next frame. The buffer queue maintains this
385 * number and makes sure that it is increasing for every successful
386 * queueBuffer() call.
387 */
388 uint64_t nextFrameNumber;
389 /**
390 * After a successful queueBuffer() call, #bufferReplaced shall be set to
391 * true if the queued buffer replaced a previously queued buffer that
392 * has not been consumed.
393 */
394 bool bufferReplaced;
395 };
396
397 /**
398 * Indicates that the client has finished filling in the contents of the
399 * buffer associated with slot and transfers ownership of that slot back to
400 * the buffer queue.
401 *
402 * @p status may be set to `BAD_VALUE` if any of the following conditions
403 * hold:
404 * - The buffer queue is operating in the asynchronous mode, and the
405 * buffer count was smaller than the maximum number of buffers that can
406 * be allocated at once.
407 * - @p slot is an invalid slot index, i.e., the slot is not owned by the
408 * client by previously calling dequeueBuffer(), requestBuffer() or
409 * attachBuffer().
410 * - The crop rectangle is not contained in the buffer.
411 *
412 * Upon success, the output shall be filled with meaningful values
413 * (refer to the documentation of @ref QueueBufferOutput).
414 *
415 * @param slot Slot index.
416 * @param input See @ref QueueBufferInput.
417 * @return status Status of the call.
418 * @return output See @ref QueueBufferOutput.
419 *
420 * @sa #QueueBufferInput, #QueueBufferOutput, dequeueBuffer().
421 */
422 queueBuffer(
423 int32_t slot,
424 QueueBufferInput input
425 ) generates (
426 Status status,
427 QueueBufferOutput output
428 );
429
430 /**
431 * Indicates that the client does not wish to fill in the buffer associated
432 * with the slot and transfers ownership of the slot back to the server. The
433 * buffer is not queued for use by the consumer.
434 *
435 * If @p fence is not an empty fence, the buffer shall not be overwritten
436 * until the fence signals. @p fence is usually obtained from
437 * dequeueBuffer().
438 *
439 * @param slot Slot index.
440 * @param fence Fence for the canceled buffer.
441 * @return status Status of the call.
442 */
443 cancelBuffer(
444 int32_t slot,
445 Fence fence
446 ) generates (
447 Status status
448 );
449
450 /**
451 * Retrieves information for this surface.
452 *
453 * @param what What to query. @p what must be one of the values in
454 * +llndk libnativewindow#ANativeWindowQuery.
455 * @return status Status of the call.
456 * @return value The value queried. The set of possible values depends on
457 * the value of @p what.
458 *
459 * @sa +llndk libnativewindow#ANativeWindowQuery.
460 */
461 query(
462 int32_t what
463 ) generates (
464 int32_t result,
465 int32_t value
466 );
467
468 /**
469 * Attempts to connect the client as a producer of the buffer queue.
470 * This method must be called before any other methods in this interface.
471 *
472 * If the buffer queue does not have a consumer ready (connected), the
473 * return @p status shall be `NO_INIT`.
474 *
475 * If any of the following conditions hold, the error code `BAD_VALUE` shall
476 * be reported in @p status:
477 * - The producer is already connected.
478 * - The number of available slots cannot be adjusted to accommodate the
479 * supplied value of @p producerControlledByApp.
480 *
481 * @param listener An optional callback object that can be provided if the
482 * client wants to be notified when the consumer releases a buffer back
483 * to the buffer queue.
484 * @param api How the client shall write to buffers.
485 * @param producerControlledByApp `true` if the producer is hosted by an
486 * untrusted process (typically application-forked processes). If both
487 * the producer and the consumer are controlled by app, the buffer queue
488 * shall operate in the asynchronous mode regardless of the async flag
489 * set by setAsyncMode().
490 * @return status Status of the call.
491 * @return output See #QueueBufferOutput for more information.
492 *
493 * @sa #QueueBufferOutput, disconnect(), setAsyncMode().
494 */
495 connect(
496 IProducerListener listener,
497 ConnectionType api,
498 bool producerControlledByApp
499 ) generates (
500 Status status,
501 QueueBufferOutput output
502 );
503
504 /**
505 * Attempts to disconnect the client from the producer end of the buffer
506 * queue.
507 *
508 * Calling this method shall cause any subsequent calls to other
509 * @ref IGraphicBufferProducer methods apart from connect() to fail.
510 * A successful connect() call afterwards may allow other methods to succeed
511 * again.
512 *
513 * Disconnecting from an abandoned buffer queue is legal and is considered a
514 * no-op.
515 *
516 * @param api The type of connection to disconnect. Supplying the value of
517 * `CURRENTLY_CONNECTED` to @p api has the same effect as supplying the
518 * current connection type. If the producer end is not connected,
519 * supplying `CURRENTLY_CONNECTED` shall result in a successful no-op
520 * call.
521 * @return status Status of the call.
522 *
523 * @sa connect().
524 */
525 disconnect(
526 ConnectionType api
527 ) generates (
528 Status status
529 );
530
531 /**
532 * Allocates buffers based on the given dimensions, format and usage.
533 *
534 * This function shall allocate up to the maximum number of buffers
535 * permitted by the current buffer queue configuration. It shall use the
536 * given format, dimensions, and usage bits, which are interpreted in the
537 * same way as for dequeueBuffer(), and the async flag must be set the same
538 * way as for dequeueBuffer() to ensure that the correct number of buffers
539 * are allocated. This is most useful to avoid an allocation delay during
540 * dequeueBuffer(). If there are already the maximum number of buffers
541 * allocated, this function has no effect.
542 *
543 * A value of 0 in @p width, @p height or @p format indicates that the
544 * buffer queue can pick the default value.
545 *
546 * @param width Width of buffers to allocate.
547 * @param height Height of buffers to allocate.
548 * @param format Format of buffers to allocate.
549 * @param usage Usage of bufferes to allocate.
550 * @return status Status of the call.
551 */
552 allocateBuffers(
553 uint32_t width,
554 uint32_t height,
555 uint32_t format,
556 uint64_t usage
557 ) generates (
558 Status status
559 );
560
561 /**
562 * Sets whether dequeueBuffer() is allowed to allocate new buffers.
563 *
564 * Normally dequeueBuffer() does not discriminate between free slots which
565 * already have an allocated buffer and those which do not, and shall
566 * allocate a new buffer if the slot doesn't have a buffer or if the slot's
567 * buffer doesn't match the requested size, format, or usage. This method
568 * allows the producer to restrict the eligible slots to those which already
569 * have an allocated buffer of the correct size, format, and usage. If no
570 * eligible slot is available, dequeueBuffer() shall block or return an
571 * error.
572 *
573 * @param allow Whether to allow new buffers to be allocated in
574 * dequeueBuffer().
575 * @return status Status of the call.
576 */
577 allowAllocation(
578 bool allow
579 ) generates (
580 Status status
581 );
582
583 /**
584 * Sets the current generation number of the buffer queue.
585 *
586 * This generation number shall be inserted into any buffers allocated by the
587 * buffer queue, and any attempts to attach a buffer with a different
588 * generation number shall fail. Buffers already in the queue are not
589 * affected and shall retain their current generation number. The generation
590 * number defaults to 0, i.e., buffers allocated before the first call to
591 * setGenerationNumber() shall be given 0 as their generation numbers.
592 *
593 * @param generationNumber New generation number. The client must make sure
594 * that @p generationNumber is different from the previous generation
595 * number if it wants to deprecate old buffers.
596 * @return status Status of the call.
597 */
598 setGenerationNumber(
599 uint32_t generationNumber
600 ) generates (
601 Status status
602 );
603
604 /**
605 * Sets how long dequeueBuffer() shall wait for a buffer to become available
606 * before returning an error `TIMED_OUT`.
607 *
608 * This timeout also affects the attachBuffer() call, which shall block if
609 * there is not a free slot available into which the attached buffer can be
610 * placed.
611 *
612 * By default, the buffer queue shall wait forever, which is equivalent to
613 * setting @p timeoutNs equal to any negative number (such as `-1`). If
614 * @p timeoutNs is non-negative, setDequeueTimeout() shall disable
615 * non-blocking mode and its corresponding spare buffer (which is used to
616 * ensure a buffer is always available).
617 *
618 * Changing the dequeue timeout may affect the number of buffers. (See
619 * setAsyncMode().) If the adjustment to the number of buffers inside the
620 * buffer queue is not feasible, @p status shall be set to `BAD_VALUE`.
621 *
622 * @param timeoutNs Amount of time dequeueBuffer() is allowed to block
623 * before returning `TIMED_OUT`. If @p timeoutNs is negative,
624 * dequeueBuffer() shall not be able to return `TIMED_OUT`. Instead, it
625 * may block forever or return `WOULD_BLOCK`.
626 * @return status Status of the call.
627 *
628 * @sa dequeueBuffer(), setAsyncMode(), query().
629 */
630 setDequeueTimeout(
631 int64_t timeoutNs
632 ) generates (
633 Status status
634 );
635
636 /**
637 * Returns a unique id for this buffer queue.
638 *
639 * @return id System-wide unique id of the buffer queue.
640 */
641 getUniqueId(
642 ) generates (
643 uint64_t id
644 );
645
646 /**
647 * Returns the name of the connected consumer.
648 *
649 * \note This is used for debugging only.
650 *
651 * @return name Name of the consumer.
652 */
653 getConsumerName(
654 ) generates (
655 string name
656 );
657
658};
659