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