xref: /aosp_15_r20/hardware/interfaces/graphics/bufferqueue/1.0/IGraphicBufferProducer.hal (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker/*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2017 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]::Fence;
20*4d7e907cSAndroid Build Coastguard Workerimport [email protected]::AnwBuffer;
21*4d7e907cSAndroid Build Coastguard Workerimport [email protected]::Rect;
22*4d7e907cSAndroid Build Coastguard Workerimport [email protected]::Region;
23*4d7e907cSAndroid Build Coastguard Worker
24*4d7e907cSAndroid Build Coastguard Workerimport [email protected]::Dataspace;
25*4d7e907cSAndroid Build Coastguard Workerimport [email protected]::PixelFormat;
26*4d7e907cSAndroid Build Coastguard Worker
27*4d7e907cSAndroid Build Coastguard Workerimport IProducerListener;
28*4d7e907cSAndroid Build Coastguard Worker
29*4d7e907cSAndroid Build Coastguard Worker/**
30*4d7e907cSAndroid Build Coastguard Worker * Ref: frameworks/native/include/gui/IGraphicBufferProducer.h:
31*4d7e907cSAndroid Build Coastguard Worker *      IGraphicBufferProducer
32*4d7e907cSAndroid Build Coastguard Worker * This is a wrapper/wrapped HAL interface for the actual binder interface.
33*4d7e907cSAndroid Build Coastguard Worker */
34*4d7e907cSAndroid Build Coastguard Workerinterface IGraphicBufferProducer {
35*4d7e907cSAndroid Build Coastguard Worker
36*4d7e907cSAndroid Build Coastguard Worker    /**
37*4d7e907cSAndroid Build Coastguard Worker     * Type for return values of functions in IGraphicBufferProducer.
38*4d7e907cSAndroid Build Coastguard Worker     */
39*4d7e907cSAndroid Build Coastguard Worker    typedef int32_t Status;
40*4d7e907cSAndroid Build Coastguard Worker
41*4d7e907cSAndroid Build Coastguard Worker    /**
42*4d7e907cSAndroid Build Coastguard Worker     * Ref: frameworks/native/include/ui/FenceTime.h: FenceTime::Snapshot
43*4d7e907cSAndroid Build Coastguard Worker     *
44*4d7e907cSAndroid Build Coastguard Worker     * An atomic snapshot of the FenceTime that is flattenable.
45*4d7e907cSAndroid Build Coastguard Worker     */
46*4d7e907cSAndroid Build Coastguard Worker    struct FenceTimeSnapshot {
47*4d7e907cSAndroid Build Coastguard Worker        enum State : int32_t {
48*4d7e907cSAndroid Build Coastguard Worker            EMPTY,
49*4d7e907cSAndroid Build Coastguard Worker            FENCE,
50*4d7e907cSAndroid Build Coastguard Worker            SIGNAL_TIME,
51*4d7e907cSAndroid Build Coastguard Worker        };
52*4d7e907cSAndroid Build Coastguard Worker        State state;
53*4d7e907cSAndroid Build Coastguard Worker        Fence fence;
54*4d7e907cSAndroid Build Coastguard Worker        int64_t signalTimeNs;
55*4d7e907cSAndroid Build Coastguard Worker    };
56*4d7e907cSAndroid Build Coastguard Worker
57*4d7e907cSAndroid Build Coastguard Worker    /**
58*4d7e907cSAndroid Build Coastguard Worker     * Ref: frameworks/native/include/gui/FrameTimestamp.h: FrameEventsDelta
59*4d7e907cSAndroid Build Coastguard Worker     *
60*4d7e907cSAndroid Build Coastguard Worker     * A single frame update from the consumer to producer that can be sent
61*4d7e907cSAndroid Build Coastguard Worker     * through a HIDL interface. Although this may be sent multiple times for
62*4d7e907cSAndroid Build Coastguard Worker     * the same frame as new timestamps are set, Fences only need to be sent
63*4d7e907cSAndroid Build Coastguard Worker     * once.
64*4d7e907cSAndroid Build Coastguard Worker     */
65*4d7e907cSAndroid Build Coastguard Worker    struct FrameEventsDelta {
66*4d7e907cSAndroid Build Coastguard Worker        uint32_t index;
67*4d7e907cSAndroid Build Coastguard Worker        uint64_t frameNumber;
68*4d7e907cSAndroid Build Coastguard Worker        bool addPostCompositeCalled;
69*4d7e907cSAndroid Build Coastguard Worker        bool addRetireCalled;
70*4d7e907cSAndroid Build Coastguard Worker        bool addReleaseCalled;
71*4d7e907cSAndroid Build Coastguard Worker        int64_t postedTimeNs;
72*4d7e907cSAndroid Build Coastguard Worker        int64_t requestedPresentTimeNs;
73*4d7e907cSAndroid Build Coastguard Worker        int64_t latchTimeNs;
74*4d7e907cSAndroid Build Coastguard Worker        int64_t firstRefreshStartTimeNs;
75*4d7e907cSAndroid Build Coastguard Worker        int64_t lastRefreshStartTimeNs;
76*4d7e907cSAndroid Build Coastguard Worker        int64_t dequeueReadyTime;
77*4d7e907cSAndroid Build Coastguard Worker        FenceTimeSnapshot gpuCompositionDoneFence;
78*4d7e907cSAndroid Build Coastguard Worker        FenceTimeSnapshot displayPresentFence;
79*4d7e907cSAndroid Build Coastguard Worker        FenceTimeSnapshot displayRetireFence;
80*4d7e907cSAndroid Build Coastguard Worker        FenceTimeSnapshot releaseFence;
81*4d7e907cSAndroid Build Coastguard Worker    };
82*4d7e907cSAndroid Build Coastguard Worker
83*4d7e907cSAndroid Build Coastguard Worker    /**
84*4d7e907cSAndroid Build Coastguard Worker     * Ref: frameworks/native/include/gui/FrameTimestamp.h: CompositorTiming
85*4d7e907cSAndroid Build Coastguard Worker     *
86*4d7e907cSAndroid Build Coastguard Worker     * The most recent compositor timing info sent from consumer to producer
87*4d7e907cSAndroid Build Coastguard Worker     * through a HIDL interface.
88*4d7e907cSAndroid Build Coastguard Worker     */
89*4d7e907cSAndroid Build Coastguard Worker    struct CompositorTiming {
90*4d7e907cSAndroid Build Coastguard Worker        int64_t deadlineNs;
91*4d7e907cSAndroid Build Coastguard Worker        int64_t intervalNs;
92*4d7e907cSAndroid Build Coastguard Worker        int64_t presentLatencyNs;
93*4d7e907cSAndroid Build Coastguard Worker    };
94*4d7e907cSAndroid Build Coastguard Worker
95*4d7e907cSAndroid Build Coastguard Worker    /**
96*4d7e907cSAndroid Build Coastguard Worker     * Ref: frameworks/native/include/gui/FrameTimestamp.h: FrameEventHistoryDelta
97*4d7e907cSAndroid Build Coastguard Worker     *
98*4d7e907cSAndroid Build Coastguard Worker     * A collection of updates from consumer to producer that can be sent
99*4d7e907cSAndroid Build Coastguard Worker     * through a HIDL interface.
100*4d7e907cSAndroid Build Coastguard Worker     */
101*4d7e907cSAndroid Build Coastguard Worker    struct FrameEventHistoryDelta {
102*4d7e907cSAndroid Build Coastguard Worker        vec<FrameEventsDelta> deltas;
103*4d7e907cSAndroid Build Coastguard Worker        CompositorTiming compositorTiming;
104*4d7e907cSAndroid Build Coastguard Worker    };
105*4d7e907cSAndroid Build Coastguard Worker
106*4d7e907cSAndroid Build Coastguard Worker    /**
107*4d7e907cSAndroid Build Coastguard Worker     * Modes for disconnection.
108*4d7e907cSAndroid Build Coastguard Worker     */
109*4d7e907cSAndroid Build Coastguard Worker    enum DisconnectMode : int32_t {
110*4d7e907cSAndroid Build Coastguard Worker        /** Disconnect only the specified API. */
111*4d7e907cSAndroid Build Coastguard Worker        API,
112*4d7e907cSAndroid Build Coastguard Worker        /** Disconnect any API originally connected from the process calling
113*4d7e907cSAndroid Build Coastguard Worker         *  disconnect. */
114*4d7e907cSAndroid Build Coastguard Worker        ALL_LOCAL
115*4d7e907cSAndroid Build Coastguard Worker    };
116*4d7e907cSAndroid Build Coastguard Worker
117*4d7e907cSAndroid Build Coastguard Worker    struct QueueBufferInput {
118*4d7e907cSAndroid Build Coastguard Worker        /** A monotonically increasing value in nanoseconds. */
119*4d7e907cSAndroid Build Coastguard Worker        int64_t timestamp;
120*4d7e907cSAndroid Build Coastguard Worker        /** Whether the timestamp was synthesized at queue time. */
121*4d7e907cSAndroid Build Coastguard Worker        int32_t isAutoTimestamp;
122*4d7e907cSAndroid Build Coastguard Worker        /** Description of the contents, interpretation depends on format. */
123*4d7e907cSAndroid Build Coastguard Worker        Dataspace dataSpace;
124*4d7e907cSAndroid Build Coastguard Worker        /** A crop rectangle that's used as a hint to the consumer. */
125*4d7e907cSAndroid Build Coastguard Worker        Rect crop;
126*4d7e907cSAndroid Build Coastguard Worker        /** A set of flags from NATIVE_WINDOW_SCALING_* in <window.h>. */
127*4d7e907cSAndroid Build Coastguard Worker        int32_t scalingMode;
128*4d7e907cSAndroid Build Coastguard Worker        /** A set of flags from NATIVE_WINDOW_TRANSFORM_* in <window.h>. */
129*4d7e907cSAndroid Build Coastguard Worker        uint32_t transform;
130*4d7e907cSAndroid Build Coastguard Worker        /** The sticky transform set in Surface (only used by the LEGACY camera
131*4d7e907cSAndroid Build Coastguard Worker         *  mode). */
132*4d7e907cSAndroid Build Coastguard Worker        uint32_t stickyTransform;
133*4d7e907cSAndroid Build Coastguard Worker        /** A fence that the consumer must wait on before reading the buffer;
134*4d7e907cSAndroid Build Coastguard Worker         *  set this to Fence::NO_FENCE if the buffer is ready immediately. */
135*4d7e907cSAndroid Build Coastguard Worker        Fence fence;
136*4d7e907cSAndroid Build Coastguard Worker        Region surfaceDamage;
137*4d7e907cSAndroid Build Coastguard Worker        /** Whether or not the latest frame timestamps should be retrieved from
138*4d7e907cSAndroid Build Coastguard Worker         *  the consumer. */
139*4d7e907cSAndroid Build Coastguard Worker        bool getFrameTimestamps;
140*4d7e907cSAndroid Build Coastguard Worker    };
141*4d7e907cSAndroid Build Coastguard Worker
142*4d7e907cSAndroid Build Coastguard Worker    struct QueueBufferOutput {
143*4d7e907cSAndroid Build Coastguard Worker        uint32_t width;
144*4d7e907cSAndroid Build Coastguard Worker        uint32_t height;
145*4d7e907cSAndroid Build Coastguard Worker        uint32_t transformHint;
146*4d7e907cSAndroid Build Coastguard Worker        uint32_t numPendingBuffers;
147*4d7e907cSAndroid Build Coastguard Worker        uint64_t nextFrameNumber;
148*4d7e907cSAndroid Build Coastguard Worker        bool bufferReplaced;
149*4d7e907cSAndroid Build Coastguard Worker        FrameEventHistoryDelta frameTimestamps;
150*4d7e907cSAndroid Build Coastguard Worker    };
151*4d7e907cSAndroid Build Coastguard Worker
152*4d7e907cSAndroid Build Coastguard Worker    /**
153*4d7e907cSAndroid Build Coastguard Worker     * requestBuffer requests a new buffer for the given index. The server (i.e.
154*4d7e907cSAndroid Build Coastguard Worker     * the IProducerListener implementation) assigns the newly created
155*4d7e907cSAndroid Build Coastguard Worker     * buffer to the given slot index, and the client is expected to mirror the
156*4d7e907cSAndroid Build Coastguard Worker     * slot->buffer mapping so that it's not necessary to transfer an
157*4d7e907cSAndroid Build Coastguard Worker     * AnwBuffer for every dequeue operation.
158*4d7e907cSAndroid Build Coastguard Worker     *
159*4d7e907cSAndroid Build Coastguard Worker     * The slot must be in the range of [0, NUM_BUFFER_SLOTS).
160*4d7e907cSAndroid Build Coastguard Worker     *
161*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
162*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
163*4d7e907cSAndroid Build Coastguard Worker     *             connected.
164*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the two conditions occurred:
165*4d7e907cSAndroid Build Coastguard Worker     *              * slot was out of range (see above)
166*4d7e907cSAndroid Build Coastguard Worker     *              * buffer specified by the slot is not dequeued
167*4d7e907cSAndroid Build Coastguard Worker     */
168*4d7e907cSAndroid Build Coastguard Worker    requestBuffer(
169*4d7e907cSAndroid Build Coastguard Worker            int32_t slot
170*4d7e907cSAndroid Build Coastguard Worker        ) generates (
171*4d7e907cSAndroid Build Coastguard Worker            Status status,
172*4d7e907cSAndroid Build Coastguard Worker            AnwBuffer buffer
173*4d7e907cSAndroid Build Coastguard Worker        );
174*4d7e907cSAndroid Build Coastguard Worker
175*4d7e907cSAndroid Build Coastguard Worker    /**
176*4d7e907cSAndroid Build Coastguard Worker     * setMaxDequeuedBufferCount sets the maximum number of buffers that can be
177*4d7e907cSAndroid Build Coastguard Worker     * dequeued by the producer at one time. If this method succeeds, any new
178*4d7e907cSAndroid Build Coastguard Worker     * buffer slots will be both unallocated and owned by the BufferQueue object
179*4d7e907cSAndroid Build Coastguard Worker     * (i.e. they are not owned by the producer or consumer). Calling this may
180*4d7e907cSAndroid Build Coastguard Worker     * also cause some buffer slots to be emptied. If the caller is caching the
181*4d7e907cSAndroid Build Coastguard Worker     * contents of the buffer slots, it should empty that cache after calling
182*4d7e907cSAndroid Build Coastguard Worker     * this method.
183*4d7e907cSAndroid Build Coastguard Worker     *
184*4d7e907cSAndroid Build Coastguard Worker     * This function should not be called with a value of maxDequeuedBuffers
185*4d7e907cSAndroid Build Coastguard Worker     * that is less than the number of currently dequeued buffer slots. Doing so
186*4d7e907cSAndroid Build Coastguard Worker     * will result in a BAD_VALUE error.
187*4d7e907cSAndroid Build Coastguard Worker     *
188*4d7e907cSAndroid Build Coastguard Worker     * The buffer count should be at least 1 (inclusive), but at most
189*4d7e907cSAndroid Build Coastguard Worker     * (NUM_BUFFER_SLOTS - the minimum undequeued buffer count) (exclusive). The
190*4d7e907cSAndroid Build Coastguard Worker     * minimum undequeued buffer count can be obtained by calling
191*4d7e907cSAndroid Build Coastguard Worker     * query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS).
192*4d7e907cSAndroid Build Coastguard Worker     *
193*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
194*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned.
195*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the below conditions occurred:
196*4d7e907cSAndroid Build Coastguard Worker     *     * bufferCount was out of range (see above).
197*4d7e907cSAndroid Build Coastguard Worker     *     * client would have more than the requested number of dequeued
198*4d7e907cSAndroid Build Coastguard Worker     *       buffers after this call.
199*4d7e907cSAndroid Build Coastguard Worker     *     * this call would cause the maxBufferCount value to be exceeded.
200*4d7e907cSAndroid Build Coastguard Worker     *     * failure to adjust the number of available slots.
201*4d7e907cSAndroid Build Coastguard Worker     */
202*4d7e907cSAndroid Build Coastguard Worker    setMaxDequeuedBufferCount(
203*4d7e907cSAndroid Build Coastguard Worker            int32_t maxDequeuedBuffers
204*4d7e907cSAndroid Build Coastguard Worker        ) generates (
205*4d7e907cSAndroid Build Coastguard Worker            Status status
206*4d7e907cSAndroid Build Coastguard Worker        );
207*4d7e907cSAndroid Build Coastguard Worker
208*4d7e907cSAndroid Build Coastguard Worker    /**
209*4d7e907cSAndroid Build Coastguard Worker     * Set the async flag if the producer intends to asynchronously queue
210*4d7e907cSAndroid Build Coastguard Worker     * buffers without blocking. Typically this is used for triple-buffering
211*4d7e907cSAndroid Build Coastguard Worker     * and/or when the swap interval is set to zero.
212*4d7e907cSAndroid Build Coastguard Worker     *
213*4d7e907cSAndroid Build Coastguard Worker     * Enabling async mode will internally allocate an additional buffer to
214*4d7e907cSAndroid Build Coastguard Worker     * allow for the asynchronous behavior. If it is not enabled queue/dequeue
215*4d7e907cSAndroid Build Coastguard Worker     * calls may block.
216*4d7e907cSAndroid Build Coastguard Worker     *
217*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
218*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned.
219*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the following has occurred:
220*4d7e907cSAndroid Build Coastguard Worker     *             * this call would cause the maxBufferCount value to be
221*4d7e907cSAndroid Build Coastguard Worker     *               exceeded
222*4d7e907cSAndroid Build Coastguard Worker     *             * failure to adjust the number of available slots.
223*4d7e907cSAndroid Build Coastguard Worker     */
224*4d7e907cSAndroid Build Coastguard Worker    setAsyncMode(
225*4d7e907cSAndroid Build Coastguard Worker            bool async
226*4d7e907cSAndroid Build Coastguard Worker        ) generates (
227*4d7e907cSAndroid Build Coastguard Worker            Status status
228*4d7e907cSAndroid Build Coastguard Worker        );
229*4d7e907cSAndroid Build Coastguard Worker
230*4d7e907cSAndroid Build Coastguard Worker    /**
231*4d7e907cSAndroid Build Coastguard Worker     * dequeueBuffer requests a new buffer slot for the client to use. Ownership
232*4d7e907cSAndroid Build Coastguard Worker     * of the slot is transfered to the client, meaning that the server will not
233*4d7e907cSAndroid Build Coastguard Worker     * use the contents of the buffer associated with that slot.
234*4d7e907cSAndroid Build Coastguard Worker     *
235*4d7e907cSAndroid Build Coastguard Worker     * The slot index returned may or may not contain a buffer (client-side).
236*4d7e907cSAndroid Build Coastguard Worker     * If the slot is empty the client should call requestBuffer to assign a new
237*4d7e907cSAndroid Build Coastguard Worker     * buffer to that slot.
238*4d7e907cSAndroid Build Coastguard Worker     *
239*4d7e907cSAndroid Build Coastguard Worker     * Once the client is done filling this buffer, it is expected to transfer
240*4d7e907cSAndroid Build Coastguard Worker     * buffer ownership back to the server with either cancelBuffer on
241*4d7e907cSAndroid Build Coastguard Worker     * the dequeued slot or to fill in the contents of its associated buffer
242*4d7e907cSAndroid Build Coastguard Worker     * contents and call queueBuffer.
243*4d7e907cSAndroid Build Coastguard Worker     *
244*4d7e907cSAndroid Build Coastguard Worker     * If dequeueBuffer returns the BUFFER_NEEDS_REALLOCATION flag, the client is
245*4d7e907cSAndroid Build Coastguard Worker     * expected to call requestBuffer immediately.
246*4d7e907cSAndroid Build Coastguard Worker     *
247*4d7e907cSAndroid Build Coastguard Worker     * If dequeueBuffer returns the RELEASE_ALL_BUFFERS flag, the client is
248*4d7e907cSAndroid Build Coastguard Worker     * expected to release all of the mirrored slot->buffer mappings.
249*4d7e907cSAndroid Build Coastguard Worker     *
250*4d7e907cSAndroid Build Coastguard Worker     * The fence parameter will be updated to hold the fence associated with
251*4d7e907cSAndroid Build Coastguard Worker     * the buffer. The contents of the buffer must not be overwritten until the
252*4d7e907cSAndroid Build Coastguard Worker     * fence signals. If the fence is Fence::NO_FENCE, the buffer may be written
253*4d7e907cSAndroid Build Coastguard Worker     * immediately.
254*4d7e907cSAndroid Build Coastguard Worker     *
255*4d7e907cSAndroid Build Coastguard Worker     * The width and height parameters must be no greater than the minimum of
256*4d7e907cSAndroid Build Coastguard Worker     * GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see: glGetIntegerv).
257*4d7e907cSAndroid Build Coastguard Worker     * An error due to invalid dimensions might not be reported until
258*4d7e907cSAndroid Build Coastguard Worker     * updateTexImage() is called.  If width and height are both zero, the
259*4d7e907cSAndroid Build Coastguard Worker     * default values specified by setDefaultBufferSize() are used instead.
260*4d7e907cSAndroid Build Coastguard Worker     *
261*4d7e907cSAndroid Build Coastguard Worker     * If the format is 0, the default format will be used.
262*4d7e907cSAndroid Build Coastguard Worker     *
263*4d7e907cSAndroid Build Coastguard Worker     * The usage argument specifies gralloc buffer usage flags.  The values
264*4d7e907cSAndroid Build Coastguard Worker     * are enumerated in <gralloc.h>, e.g. GRALLOC_USAGE_HW_RENDER.  These
265*4d7e907cSAndroid Build Coastguard Worker     * will be merged with the usage flags specified by
266*4d7e907cSAndroid Build Coastguard Worker     * IGraphicBufferConsumer::setConsumerUsageBits.
267*4d7e907cSAndroid Build Coastguard Worker     *
268*4d7e907cSAndroid Build Coastguard Worker     * This call will block until a buffer is available to be dequeued. If
269*4d7e907cSAndroid Build Coastguard Worker     * both the producer and consumer are controlled by the app, then this call
270*4d7e907cSAndroid Build Coastguard Worker     * can never block and will return WOULD_BLOCK if no buffer is available.
271*4d7e907cSAndroid Build Coastguard Worker     *
272*4d7e907cSAndroid Build Coastguard Worker     * A non-negative value with flags set (see above) will be returned upon
273*4d7e907cSAndroid Build Coastguard Worker     * success as status.
274*4d7e907cSAndroid Build Coastguard Worker     *
275*4d7e907cSAndroid Build Coastguard Worker     * Return of a negative means an error has occurred:
276*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
277*4d7e907cSAndroid Build Coastguard Worker     *             connected.
278*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - both in async mode and buffer count was less than the
279*4d7e907cSAndroid Build Coastguard Worker     *               max numbers of buffers that can be allocated at once.
280*4d7e907cSAndroid Build Coastguard Worker     * * INVALID_OPERATION - cannot attach the buffer because it would cause
281*4d7e907cSAndroid Build Coastguard Worker     *                       too many buffers to be dequeued, either because
282*4d7e907cSAndroid Build Coastguard Worker     *                       the producer already has a single buffer dequeued
283*4d7e907cSAndroid Build Coastguard Worker     *                       and did not set a buffer count, or because a
284*4d7e907cSAndroid Build Coastguard Worker     *                       buffer count was set and this call would cause
285*4d7e907cSAndroid Build Coastguard Worker     *                       it to be exceeded.
286*4d7e907cSAndroid Build Coastguard Worker     * * WOULD_BLOCK - no buffer is currently available, and blocking is disabled
287*4d7e907cSAndroid Build Coastguard Worker     *                 since both the producer/consumer are controlled by app
288*4d7e907cSAndroid Build Coastguard Worker     * * NO_MEMORY - out of memory, cannot allocate the graphics buffer.
289*4d7e907cSAndroid Build Coastguard Worker     * * TIMED_OUT - the timeout set by setDequeueTimeout was exceeded while
290*4d7e907cSAndroid Build Coastguard Worker     *               waiting for a buffer to become available.
291*4d7e907cSAndroid Build Coastguard Worker     *
292*4d7e907cSAndroid Build Coastguard Worker     * All other negative values are an unknown error returned downstream
293*4d7e907cSAndroid Build Coastguard Worker     * from the graphics allocator (typically errno).
294*4d7e907cSAndroid Build Coastguard Worker     */
295*4d7e907cSAndroid Build Coastguard Worker    dequeueBuffer(
296*4d7e907cSAndroid Build Coastguard Worker            uint32_t width,
297*4d7e907cSAndroid Build Coastguard Worker            uint32_t height,
298*4d7e907cSAndroid Build Coastguard Worker            PixelFormat format,
299*4d7e907cSAndroid Build Coastguard Worker            uint32_t usage,
300*4d7e907cSAndroid Build Coastguard Worker            bool getFrameTimestamps
301*4d7e907cSAndroid Build Coastguard Worker        ) generates (
302*4d7e907cSAndroid Build Coastguard Worker            Status status,
303*4d7e907cSAndroid Build Coastguard Worker            int32_t slot,
304*4d7e907cSAndroid Build Coastguard Worker            Fence fence,
305*4d7e907cSAndroid Build Coastguard Worker            FrameEventHistoryDelta outTimestamps
306*4d7e907cSAndroid Build Coastguard Worker        );
307*4d7e907cSAndroid Build Coastguard Worker
308*4d7e907cSAndroid Build Coastguard Worker    /**
309*4d7e907cSAndroid Build Coastguard Worker     * detachBuffer attempts to remove all ownership of the buffer in the given
310*4d7e907cSAndroid Build Coastguard Worker     * slot from the buffer queue. If this call succeeds, the slot will be
311*4d7e907cSAndroid Build Coastguard Worker     * freed, and there will be no way to obtain the buffer from this interface.
312*4d7e907cSAndroid Build Coastguard Worker     * The freed slot will remain unallocated until either it is selected to
313*4d7e907cSAndroid Build Coastguard Worker     * hold a freshly allocated buffer in dequeueBuffer or a buffer is attached
314*4d7e907cSAndroid Build Coastguard Worker     * to the slot. The buffer must have already been dequeued, and the caller
315*4d7e907cSAndroid Build Coastguard Worker     * must already possesses the sp<AnwBuffer> (i.e., must have called
316*4d7e907cSAndroid Build Coastguard Worker     * requestBuffer).
317*4d7e907cSAndroid Build Coastguard Worker     *
318*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
319*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
320*4d7e907cSAndroid Build Coastguard Worker     *             connected.
321*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - the given slot number is invalid, either because it is
322*4d7e907cSAndroid Build Coastguard Worker     *               out of the range [0, NUM_BUFFER_SLOTS), or because the slot
323*4d7e907cSAndroid Build Coastguard Worker     *               it refers to is not currently dequeued and requested.
324*4d7e907cSAndroid Build Coastguard Worker     */
325*4d7e907cSAndroid Build Coastguard Worker    detachBuffer(
326*4d7e907cSAndroid Build Coastguard Worker            int32_t slot
327*4d7e907cSAndroid Build Coastguard Worker        ) generates (
328*4d7e907cSAndroid Build Coastguard Worker            Status status
329*4d7e907cSAndroid Build Coastguard Worker        );
330*4d7e907cSAndroid Build Coastguard Worker
331*4d7e907cSAndroid Build Coastguard Worker    /**
332*4d7e907cSAndroid Build Coastguard Worker     * detachNextBuffer is equivalent to calling dequeueBuffer, requestBuffer,
333*4d7e907cSAndroid Build Coastguard Worker     * and detachBuffer in sequence, except for two things:
334*4d7e907cSAndroid Build Coastguard Worker     *
335*4d7e907cSAndroid Build Coastguard Worker     * 1) It is unnecessary to know the dimensions, format, or usage of the
336*4d7e907cSAndroid Build Coastguard Worker     *    next buffer.
337*4d7e907cSAndroid Build Coastguard Worker     * 2) It will not block, since if it cannot find an appropriate buffer to
338*4d7e907cSAndroid Build Coastguard Worker     *    return, it will return an error instead.
339*4d7e907cSAndroid Build Coastguard Worker     *
340*4d7e907cSAndroid Build Coastguard Worker     * Only slots that are free but still contain an AnwBuffer will be
341*4d7e907cSAndroid Build Coastguard Worker     * considered, and the oldest of those will be returned. buffer is
342*4d7e907cSAndroid Build Coastguard Worker     * equivalent to buffer from the requestBuffer call, and fence is
343*4d7e907cSAndroid Build Coastguard Worker     * equivalent to fence from the dequeueBuffer call.
344*4d7e907cSAndroid Build Coastguard Worker     *
345*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
346*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
347*4d7e907cSAndroid Build Coastguard Worker     *             connected.
348*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - either outBuffer or outFence were NULL.
349*4d7e907cSAndroid Build Coastguard Worker     * * NO_MEMORY - no slots were found that were both free and contained a
350*4d7e907cSAndroid Build Coastguard Worker     *               AnwBuffer.
351*4d7e907cSAndroid Build Coastguard Worker     */
352*4d7e907cSAndroid Build Coastguard Worker    detachNextBuffer(
353*4d7e907cSAndroid Build Coastguard Worker        ) generates (
354*4d7e907cSAndroid Build Coastguard Worker            Status status,
355*4d7e907cSAndroid Build Coastguard Worker            AnwBuffer buffer,
356*4d7e907cSAndroid Build Coastguard Worker            Fence fence
357*4d7e907cSAndroid Build Coastguard Worker        );
358*4d7e907cSAndroid Build Coastguard Worker
359*4d7e907cSAndroid Build Coastguard Worker    /**
360*4d7e907cSAndroid Build Coastguard Worker     * attachBuffer attempts to transfer ownership of a buffer to the buffer
361*4d7e907cSAndroid Build Coastguard Worker     * queue. If this call succeeds, it will be as if this buffer was dequeued
362*4d7e907cSAndroid Build Coastguard Worker     * from the returned slot number. As such, this call will fail if attaching
363*4d7e907cSAndroid Build Coastguard Worker     * this buffer would cause too many buffers to be simultaneously dequeued.
364*4d7e907cSAndroid Build Coastguard Worker     *
365*4d7e907cSAndroid Build Coastguard Worker     * If attachBuffer returns the RELEASE_ALL_BUFFERS flag, the caller is
366*4d7e907cSAndroid Build Coastguard Worker     * expected to release all of the mirrored slot->buffer mappings.
367*4d7e907cSAndroid Build Coastguard Worker     *
368*4d7e907cSAndroid Build Coastguard Worker     * A non-negative value with flags set (see above) will be returned upon
369*4d7e907cSAndroid Build Coastguard Worker     * success.
370*4d7e907cSAndroid Build Coastguard Worker     *
371*4d7e907cSAndroid Build Coastguard Worker     * Return of a negative value means an error has occurred:
372*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
373*4d7e907cSAndroid Build Coastguard Worker     *             connected.
374*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - outSlot or buffer were NULL, invalid combination of
375*4d7e907cSAndroid Build Coastguard Worker     *               async mode and buffer count override, or the generation
376*4d7e907cSAndroid Build Coastguard Worker     *               number of the buffer did not match the buffer queue.
377*4d7e907cSAndroid Build Coastguard Worker     * * INVALID_OPERATION - cannot attach the buffer because it would cause
378*4d7e907cSAndroid Build Coastguard Worker     *                       too many buffers to be dequeued, either because
379*4d7e907cSAndroid Build Coastguard Worker     *                       the producer already has a single buffer dequeued
380*4d7e907cSAndroid Build Coastguard Worker     *                       and did not set a buffer count, or because a
381*4d7e907cSAndroid Build Coastguard Worker     *                       buffer count was set and this call would cause
382*4d7e907cSAndroid Build Coastguard Worker     *                       it to be exceeded.
383*4d7e907cSAndroid Build Coastguard Worker     * * WOULD_BLOCK - no buffer slot is currently available, and blocking is
384*4d7e907cSAndroid Build Coastguard Worker     *                 disabled since both the producer/consumer are
385*4d7e907cSAndroid Build Coastguard Worker     *                 controlled by the app.
386*4d7e907cSAndroid Build Coastguard Worker     * * TIMED_OUT - the timeout set by setDequeueTimeout was exceeded while
387*4d7e907cSAndroid Build Coastguard Worker     *               waiting for a slot to become available.
388*4d7e907cSAndroid Build Coastguard Worker     */
389*4d7e907cSAndroid Build Coastguard Worker    attachBuffer(
390*4d7e907cSAndroid Build Coastguard Worker            AnwBuffer buffer
391*4d7e907cSAndroid Build Coastguard Worker        ) generates (
392*4d7e907cSAndroid Build Coastguard Worker            Status status,
393*4d7e907cSAndroid Build Coastguard Worker            int32_t slot
394*4d7e907cSAndroid Build Coastguard Worker        );
395*4d7e907cSAndroid Build Coastguard Worker
396*4d7e907cSAndroid Build Coastguard Worker    /**
397*4d7e907cSAndroid Build Coastguard Worker     * queueBuffer indicates that the client has finished filling in the
398*4d7e907cSAndroid Build Coastguard Worker     * contents of the buffer associated with slot and transfers ownership of
399*4d7e907cSAndroid Build Coastguard Worker     * that slot back to the server.
400*4d7e907cSAndroid Build Coastguard Worker     *
401*4d7e907cSAndroid Build Coastguard Worker     * It is not valid to call queueBuffer on a slot that is not owned
402*4d7e907cSAndroid Build Coastguard Worker     * by the client or one for which a buffer associated via requestBuffer
403*4d7e907cSAndroid Build Coastguard Worker     * (an attempt to do so will fail with a return value of BAD_VALUE).
404*4d7e907cSAndroid Build Coastguard Worker     *
405*4d7e907cSAndroid Build Coastguard Worker     * In addition, the input must be described by the client (as documented
406*4d7e907cSAndroid Build Coastguard Worker     * below). Any other properties (zero point, etc)
407*4d7e907cSAndroid Build Coastguard Worker     * are client-dependent, and should be documented by the client.
408*4d7e907cSAndroid Build Coastguard Worker     *
409*4d7e907cSAndroid Build Coastguard Worker     * The slot must be in the range of [0, NUM_BUFFER_SLOTS).
410*4d7e907cSAndroid Build Coastguard Worker     *
411*4d7e907cSAndroid Build Coastguard Worker     * Upon success, the output will be filled with meaningful values
412*4d7e907cSAndroid Build Coastguard Worker     * (refer to the documentation below).
413*4d7e907cSAndroid Build Coastguard Worker     *
414*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
415*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
416*4d7e907cSAndroid Build Coastguard Worker     *             connected.
417*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the below conditions occurred:
418*4d7e907cSAndroid Build Coastguard Worker     *              * fence was NULL
419*4d7e907cSAndroid Build Coastguard Worker     *              * scaling mode was unknown
420*4d7e907cSAndroid Build Coastguard Worker     *              * both in async mode and buffer count was less than the
421*4d7e907cSAndroid Build Coastguard Worker     *                max numbers of buffers that can be allocated at once
422*4d7e907cSAndroid Build Coastguard Worker     *              * slot index was out of range (see above).
423*4d7e907cSAndroid Build Coastguard Worker     *              * the slot was not in the dequeued state
424*4d7e907cSAndroid Build Coastguard Worker     *              * the slot was enqueued without requesting a buffer
425*4d7e907cSAndroid Build Coastguard Worker     *              * crop rect is out of bounds of the buffer dimensions
426*4d7e907cSAndroid Build Coastguard Worker     */
427*4d7e907cSAndroid Build Coastguard Worker    queueBuffer(
428*4d7e907cSAndroid Build Coastguard Worker            int32_t slot,
429*4d7e907cSAndroid Build Coastguard Worker            QueueBufferInput input
430*4d7e907cSAndroid Build Coastguard Worker        ) generates (
431*4d7e907cSAndroid Build Coastguard Worker            Status status,
432*4d7e907cSAndroid Build Coastguard Worker            QueueBufferOutput output
433*4d7e907cSAndroid Build Coastguard Worker        );
434*4d7e907cSAndroid Build Coastguard Worker
435*4d7e907cSAndroid Build Coastguard Worker    /**
436*4d7e907cSAndroid Build Coastguard Worker     * cancelBuffer indicates that the client does not wish to fill in the
437*4d7e907cSAndroid Build Coastguard Worker     * buffer associated with slot and transfers ownership of the slot back to
438*4d7e907cSAndroid Build Coastguard Worker     * the server.
439*4d7e907cSAndroid Build Coastguard Worker     *
440*4d7e907cSAndroid Build Coastguard Worker     * The buffer is not queued for use by the consumer.
441*4d7e907cSAndroid Build Coastguard Worker     *
442*4d7e907cSAndroid Build Coastguard Worker     * The slot must be in the range of [0, NUM_BUFFER_SLOTS).
443*4d7e907cSAndroid Build Coastguard Worker     *
444*4d7e907cSAndroid Build Coastguard Worker     * The buffer will not be overwritten until the fence signals.  The fence
445*4d7e907cSAndroid Build Coastguard Worker     * will usually be the one obtained from dequeueBuffer.
446*4d7e907cSAndroid Build Coastguard Worker     *
447*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
448*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned or the producer is not
449*4d7e907cSAndroid Build Coastguard Worker     *             connected.
450*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the below conditions occurred:
451*4d7e907cSAndroid Build Coastguard Worker     *              * fence was NULL
452*4d7e907cSAndroid Build Coastguard Worker     *              * slot index was out of range (see above).
453*4d7e907cSAndroid Build Coastguard Worker     *              * the slot was not in the dequeued state
454*4d7e907cSAndroid Build Coastguard Worker     */
455*4d7e907cSAndroid Build Coastguard Worker    cancelBuffer(
456*4d7e907cSAndroid Build Coastguard Worker            int32_t slot,
457*4d7e907cSAndroid Build Coastguard Worker            Fence fence
458*4d7e907cSAndroid Build Coastguard Worker        ) generates (
459*4d7e907cSAndroid Build Coastguard Worker            Status status
460*4d7e907cSAndroid Build Coastguard Worker        );
461*4d7e907cSAndroid Build Coastguard Worker
462*4d7e907cSAndroid Build Coastguard Worker    /**
463*4d7e907cSAndroid Build Coastguard Worker     * query retrieves some information for this surface
464*4d7e907cSAndroid Build Coastguard Worker     * 'what' tokens allowed are that of NATIVE_WINDOW_* in <window.h>
465*4d7e907cSAndroid Build Coastguard Worker     *
466*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
467*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - the buffer queue has been abandoned.
468*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - what was out of range
469*4d7e907cSAndroid Build Coastguard Worker     */
470*4d7e907cSAndroid Build Coastguard Worker    query(
471*4d7e907cSAndroid Build Coastguard Worker            int32_t what
472*4d7e907cSAndroid Build Coastguard Worker        ) generates (
473*4d7e907cSAndroid Build Coastguard Worker            int32_t result,
474*4d7e907cSAndroid Build Coastguard Worker            int32_t value
475*4d7e907cSAndroid Build Coastguard Worker        );
476*4d7e907cSAndroid Build Coastguard Worker
477*4d7e907cSAndroid Build Coastguard Worker    /**
478*4d7e907cSAndroid Build Coastguard Worker     * connect attempts to connect a client API to the IGraphicBufferProducer.
479*4d7e907cSAndroid Build Coastguard Worker     * This must be called before any other IGraphicBufferProducer methods are
480*4d7e907cSAndroid Build Coastguard Worker     * called except for getAllocator. A consumer must be already connected.
481*4d7e907cSAndroid Build Coastguard Worker     *
482*4d7e907cSAndroid Build Coastguard Worker     * This method will fail if the connect was previously called on the
483*4d7e907cSAndroid Build Coastguard Worker     * IGraphicBufferProducer and no corresponding disconnect call was made.
484*4d7e907cSAndroid Build Coastguard Worker     *
485*4d7e907cSAndroid Build Coastguard Worker     * The listener is an optional binder callback object that can be used if
486*4d7e907cSAndroid Build Coastguard Worker     * the producer wants to be notified when the consumer releases a buffer
487*4d7e907cSAndroid Build Coastguard Worker     * back to the BufferQueue. It is also used to detect the death of the
488*4d7e907cSAndroid Build Coastguard Worker     * producer. If only the latter functionality is desired, there is a
489*4d7e907cSAndroid Build Coastguard Worker     * DummyProducerListener class in IProducerListener.h that can be used.
490*4d7e907cSAndroid Build Coastguard Worker     *
491*4d7e907cSAndroid Build Coastguard Worker     * The api should be one of the NATIVE_WINDOW_API_* values in <window.h>
492*4d7e907cSAndroid Build Coastguard Worker     *
493*4d7e907cSAndroid Build Coastguard Worker     * The producerControlledByApp should be set to true if the producer is hosted
494*4d7e907cSAndroid Build Coastguard Worker     * by an untrusted process (typically app_process-forked processes). If both
495*4d7e907cSAndroid Build Coastguard Worker     * the producer and the consumer are app-controlled then all buffer queues
496*4d7e907cSAndroid Build Coastguard Worker     * will operate in async mode regardless of the async flag.
497*4d7e907cSAndroid Build Coastguard Worker     *
498*4d7e907cSAndroid Build Coastguard Worker     * Upon success, the output will be filled with meaningful data
499*4d7e907cSAndroid Build Coastguard Worker     * (refer to QueueBufferOutput documentation above).
500*4d7e907cSAndroid Build Coastguard Worker     *
501*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
502*4d7e907cSAndroid Build Coastguard Worker     * * NO_INIT - one of the following occurred:
503*4d7e907cSAndroid Build Coastguard Worker     *             * the buffer queue was abandoned
504*4d7e907cSAndroid Build Coastguard Worker     *             * no consumer has yet connected
505*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the following has occurred:
506*4d7e907cSAndroid Build Coastguard Worker     *             * the producer is already connected
507*4d7e907cSAndroid Build Coastguard Worker     *             * api was out of range (see above).
508*4d7e907cSAndroid Build Coastguard Worker     *             * output was NULL.
509*4d7e907cSAndroid Build Coastguard Worker     *             * Failure to adjust the number of available slots. This can
510*4d7e907cSAndroid Build Coastguard Worker     *               happen because of trying to allocate/deallocate the async
511*4d7e907cSAndroid Build Coastguard Worker     *               buffer in response to the value of producerControlledByApp.
512*4d7e907cSAndroid Build Coastguard Worker     * * DEAD_OBJECT - the token is hosted by an already-dead process
513*4d7e907cSAndroid Build Coastguard Worker     *
514*4d7e907cSAndroid Build Coastguard Worker     * Additional negative errors may be returned by the internals, they
515*4d7e907cSAndroid Build Coastguard Worker     * should be treated as opaque fatal unrecoverable errors.
516*4d7e907cSAndroid Build Coastguard Worker     */
517*4d7e907cSAndroid Build Coastguard Worker    connect(
518*4d7e907cSAndroid Build Coastguard Worker            IProducerListener listener,
519*4d7e907cSAndroid Build Coastguard Worker            int32_t api,
520*4d7e907cSAndroid Build Coastguard Worker            bool producerControlledByApp
521*4d7e907cSAndroid Build Coastguard Worker        ) generates (
522*4d7e907cSAndroid Build Coastguard Worker            Status status,
523*4d7e907cSAndroid Build Coastguard Worker            QueueBufferOutput output
524*4d7e907cSAndroid Build Coastguard Worker        );
525*4d7e907cSAndroid Build Coastguard Worker
526*4d7e907cSAndroid Build Coastguard Worker    /**
527*4d7e907cSAndroid Build Coastguard Worker     * disconnect attempts to disconnect a client API from the
528*4d7e907cSAndroid Build Coastguard Worker     * IGraphicBufferProducer.  Calling this method will cause any subsequent
529*4d7e907cSAndroid Build Coastguard Worker     * calls to other IGraphicBufferProducer methods to fail except for
530*4d7e907cSAndroid Build Coastguard Worker     * getAllocator and connect.  Successfully calling connect after this will
531*4d7e907cSAndroid Build Coastguard Worker     * allow the other methods to succeed again.
532*4d7e907cSAndroid Build Coastguard Worker     *
533*4d7e907cSAndroid Build Coastguard Worker     * The api should be one of the NATIVE_WINDOW_API_* values in <window.h>
534*4d7e907cSAndroid Build Coastguard Worker     *
535*4d7e907cSAndroid Build Coastguard Worker     * Alternatively if mode is AllLocal, then the API value is ignored, and any API
536*4d7e907cSAndroid Build Coastguard Worker     * connected from the same PID calling disconnect will be disconnected.
537*4d7e907cSAndroid Build Coastguard Worker     *
538*4d7e907cSAndroid Build Coastguard Worker     * Disconnecting from an abandoned IGraphicBufferProducer is legal and
539*4d7e907cSAndroid Build Coastguard Worker     * is considered a no-op.
540*4d7e907cSAndroid Build Coastguard Worker     *
541*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
542*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - one of the following has occurred:
543*4d7e907cSAndroid Build Coastguard Worker     *             * the api specified does not match the one that was connected
544*4d7e907cSAndroid Build Coastguard Worker     *             * api was out of range (see above).
545*4d7e907cSAndroid Build Coastguard Worker     * * DEAD_OBJECT - the token is hosted by an already-dead process
546*4d7e907cSAndroid Build Coastguard Worker     */
547*4d7e907cSAndroid Build Coastguard Worker    disconnect(
548*4d7e907cSAndroid Build Coastguard Worker            int32_t api,
549*4d7e907cSAndroid Build Coastguard Worker            DisconnectMode mode
550*4d7e907cSAndroid Build Coastguard Worker        ) generates (
551*4d7e907cSAndroid Build Coastguard Worker            Status status
552*4d7e907cSAndroid Build Coastguard Worker        );
553*4d7e907cSAndroid Build Coastguard Worker
554*4d7e907cSAndroid Build Coastguard Worker    /**
555*4d7e907cSAndroid Build Coastguard Worker     * Attaches a sideband buffer stream to the IGraphicBufferProducer.
556*4d7e907cSAndroid Build Coastguard Worker     *
557*4d7e907cSAndroid Build Coastguard Worker     * A sideband stream is a device-specific mechanism for passing buffers
558*4d7e907cSAndroid Build Coastguard Worker     * from the producer to the consumer without using dequeueBuffer/
559*4d7e907cSAndroid Build Coastguard Worker     * queueBuffer. If a sideband stream is present, the consumer can choose
560*4d7e907cSAndroid Build Coastguard Worker     * whether to acquire buffers from the sideband stream or from the queued
561*4d7e907cSAndroid Build Coastguard Worker     * buffers.
562*4d7e907cSAndroid Build Coastguard Worker     *
563*4d7e907cSAndroid Build Coastguard Worker     * Passing NULL or a different stream handle will detach the previous
564*4d7e907cSAndroid Build Coastguard Worker     * handle if any.
565*4d7e907cSAndroid Build Coastguard Worker     */
566*4d7e907cSAndroid Build Coastguard Worker    setSidebandStream(
567*4d7e907cSAndroid Build Coastguard Worker            handle stream
568*4d7e907cSAndroid Build Coastguard Worker        ) generates (
569*4d7e907cSAndroid Build Coastguard Worker            Status status
570*4d7e907cSAndroid Build Coastguard Worker        );
571*4d7e907cSAndroid Build Coastguard Worker
572*4d7e907cSAndroid Build Coastguard Worker    /**
573*4d7e907cSAndroid Build Coastguard Worker     * Allocates buffers based on the given dimensions/format.
574*4d7e907cSAndroid Build Coastguard Worker     *
575*4d7e907cSAndroid Build Coastguard Worker     * This function will allocate up to the maximum number of buffers
576*4d7e907cSAndroid Build Coastguard Worker     * permitted by the current BufferQueue configuration. It will use the
577*4d7e907cSAndroid Build Coastguard Worker     * given format, dimensions, and usage bits, which are interpreted in the
578*4d7e907cSAndroid Build Coastguard Worker     * same way as for dequeueBuffer, and the async flag must be set the same
579*4d7e907cSAndroid Build Coastguard Worker     * way as for dequeueBuffer to ensure that the correct number of buffers are
580*4d7e907cSAndroid Build Coastguard Worker     * allocated. This is most useful to avoid an allocation delay during
581*4d7e907cSAndroid Build Coastguard Worker     * dequeueBuffer. If there are already the maximum number of buffers
582*4d7e907cSAndroid Build Coastguard Worker     * allocated, this function has no effect.
583*4d7e907cSAndroid Build Coastguard Worker     */
584*4d7e907cSAndroid Build Coastguard Worker    allocateBuffers(
585*4d7e907cSAndroid Build Coastguard Worker            uint32_t width,
586*4d7e907cSAndroid Build Coastguard Worker            uint32_t height,
587*4d7e907cSAndroid Build Coastguard Worker            PixelFormat format,
588*4d7e907cSAndroid Build Coastguard Worker            uint32_t usage
589*4d7e907cSAndroid Build Coastguard Worker        );
590*4d7e907cSAndroid Build Coastguard Worker
591*4d7e907cSAndroid Build Coastguard Worker    /**
592*4d7e907cSAndroid Build Coastguard Worker     * Sets whether dequeueBuffer is allowed to allocate new buffers.
593*4d7e907cSAndroid Build Coastguard Worker     *
594*4d7e907cSAndroid Build Coastguard Worker     * Normally dequeueBuffer does not discriminate between free slots which
595*4d7e907cSAndroid Build Coastguard Worker     * already have an allocated buffer and those which do not, and will
596*4d7e907cSAndroid Build Coastguard Worker     * allocate a new buffer if the slot doesn't have a buffer or if the slot's
597*4d7e907cSAndroid Build Coastguard Worker     * buffer doesn't match the requested size, format, or usage. This method
598*4d7e907cSAndroid Build Coastguard Worker     * allows the producer to restrict the eligible slots to those which already
599*4d7e907cSAndroid Build Coastguard Worker     * have an allocated buffer of the correct size, format, and usage. If no
600*4d7e907cSAndroid Build Coastguard Worker     * eligible slot is available, dequeueBuffer will block or return an error
601*4d7e907cSAndroid Build Coastguard Worker     * as usual.
602*4d7e907cSAndroid Build Coastguard Worker     */
603*4d7e907cSAndroid Build Coastguard Worker    allowAllocation(
604*4d7e907cSAndroid Build Coastguard Worker            bool allow
605*4d7e907cSAndroid Build Coastguard Worker        ) generates (
606*4d7e907cSAndroid Build Coastguard Worker            Status status
607*4d7e907cSAndroid Build Coastguard Worker        );
608*4d7e907cSAndroid Build Coastguard Worker
609*4d7e907cSAndroid Build Coastguard Worker    /**
610*4d7e907cSAndroid Build Coastguard Worker     * Sets the current generation number of the BufferQueue.
611*4d7e907cSAndroid Build Coastguard Worker     *
612*4d7e907cSAndroid Build Coastguard Worker     * This generation number will be inserted into any buffers allocated by the
613*4d7e907cSAndroid Build Coastguard Worker     * BufferQueue, and any attempts to attach a buffer with a different
614*4d7e907cSAndroid Build Coastguard Worker     * generation number will fail. Buffers already in the queue are not
615*4d7e907cSAndroid Build Coastguard Worker     * affected and will retain their current generation number. The generation
616*4d7e907cSAndroid Build Coastguard Worker     * number defaults to 0.
617*4d7e907cSAndroid Build Coastguard Worker     */
618*4d7e907cSAndroid Build Coastguard Worker    setGenerationNumber(
619*4d7e907cSAndroid Build Coastguard Worker            uint32_t generationNumber
620*4d7e907cSAndroid Build Coastguard Worker        ) generates (
621*4d7e907cSAndroid Build Coastguard Worker            Status status
622*4d7e907cSAndroid Build Coastguard Worker        );
623*4d7e907cSAndroid Build Coastguard Worker
624*4d7e907cSAndroid Build Coastguard Worker    /**
625*4d7e907cSAndroid Build Coastguard Worker     * Returns the name of the connected consumer.
626*4d7e907cSAndroid Build Coastguard Worker     */
627*4d7e907cSAndroid Build Coastguard Worker    getConsumerName(
628*4d7e907cSAndroid Build Coastguard Worker        ) generates (
629*4d7e907cSAndroid Build Coastguard Worker            string name
630*4d7e907cSAndroid Build Coastguard Worker        );
631*4d7e907cSAndroid Build Coastguard Worker
632*4d7e907cSAndroid Build Coastguard Worker    /**
633*4d7e907cSAndroid Build Coastguard Worker     * Used to enable/disable shared buffer mode.
634*4d7e907cSAndroid Build Coastguard Worker     *
635*4d7e907cSAndroid Build Coastguard Worker     * When shared buffer mode is enabled the first buffer that is queued or
636*4d7e907cSAndroid Build Coastguard Worker     * dequeued will be cached and returned to all subsequent calls to
637*4d7e907cSAndroid Build Coastguard Worker     * dequeueBuffer and acquireBuffer. This allows the producer and consumer to
638*4d7e907cSAndroid Build Coastguard Worker     * simultaneously access the same buffer.
639*4d7e907cSAndroid Build Coastguard Worker     */
640*4d7e907cSAndroid Build Coastguard Worker    setSharedBufferMode(
641*4d7e907cSAndroid Build Coastguard Worker            bool sharedBufferMode
642*4d7e907cSAndroid Build Coastguard Worker        ) generates (
643*4d7e907cSAndroid Build Coastguard Worker            Status status
644*4d7e907cSAndroid Build Coastguard Worker        );
645*4d7e907cSAndroid Build Coastguard Worker
646*4d7e907cSAndroid Build Coastguard Worker    /**
647*4d7e907cSAndroid Build Coastguard Worker     * Used to enable/disable auto-refresh.
648*4d7e907cSAndroid Build Coastguard Worker     *
649*4d7e907cSAndroid Build Coastguard Worker     * Auto refresh has no effect outside of shared buffer mode. In shared
650*4d7e907cSAndroid Build Coastguard Worker     * buffer mode, when enabled, it indicates to the consumer that it should
651*4d7e907cSAndroid Build Coastguard Worker     * attempt to acquire buffers even if it is not aware of any being
652*4d7e907cSAndroid Build Coastguard Worker     * available.
653*4d7e907cSAndroid Build Coastguard Worker     */
654*4d7e907cSAndroid Build Coastguard Worker    setAutoRefresh(
655*4d7e907cSAndroid Build Coastguard Worker            bool autoRefresh
656*4d7e907cSAndroid Build Coastguard Worker        ) generates (
657*4d7e907cSAndroid Build Coastguard Worker            Status status
658*4d7e907cSAndroid Build Coastguard Worker        );
659*4d7e907cSAndroid Build Coastguard Worker
660*4d7e907cSAndroid Build Coastguard Worker    /**
661*4d7e907cSAndroid Build Coastguard Worker     * Sets how long dequeueBuffer will wait for a buffer to become available
662*4d7e907cSAndroid Build Coastguard Worker     * before returning an error (TIMED_OUT).
663*4d7e907cSAndroid Build Coastguard Worker     *
664*4d7e907cSAndroid Build Coastguard Worker     * This timeout also affects the attachBuffer call, which will block if
665*4d7e907cSAndroid Build Coastguard Worker     * there is not a free slot available into which the attached buffer can be
666*4d7e907cSAndroid Build Coastguard Worker     * placed.
667*4d7e907cSAndroid Build Coastguard Worker     *
668*4d7e907cSAndroid Build Coastguard Worker     * By default, the BufferQueue will wait forever, which is indicated by a
669*4d7e907cSAndroid Build Coastguard Worker     * timeout of -1. If set (to a value other than -1), this will disable
670*4d7e907cSAndroid Build Coastguard Worker     * non-blocking mode and its corresponding spare buffer (which is used to
671*4d7e907cSAndroid Build Coastguard Worker     * ensure a buffer is always available).
672*4d7e907cSAndroid Build Coastguard Worker     *
673*4d7e907cSAndroid Build Coastguard Worker     * Return of a value other than NO_ERROR means an error has occurred:
674*4d7e907cSAndroid Build Coastguard Worker     * * BAD_VALUE - Failure to adjust the number of available slots. This can
675*4d7e907cSAndroid Build Coastguard Worker     *               happen because of trying to allocate/deallocate the async
676*4d7e907cSAndroid Build Coastguard Worker     *               buffer.
677*4d7e907cSAndroid Build Coastguard Worker     */
678*4d7e907cSAndroid Build Coastguard Worker    setDequeueTimeout(
679*4d7e907cSAndroid Build Coastguard Worker            int64_t timeoutNs
680*4d7e907cSAndroid Build Coastguard Worker        ) generates (
681*4d7e907cSAndroid Build Coastguard Worker            Status status
682*4d7e907cSAndroid Build Coastguard Worker        );
683*4d7e907cSAndroid Build Coastguard Worker
684*4d7e907cSAndroid Build Coastguard Worker    /**
685*4d7e907cSAndroid Build Coastguard Worker     * Returns the last queued buffer along with a fence which must signal
686*4d7e907cSAndroid Build Coastguard Worker     * before the contents of the buffer are read. If there are no buffers in
687*4d7e907cSAndroid Build Coastguard Worker     * the queue, buffer.nativeHandle and fence will be null handles.
688*4d7e907cSAndroid Build Coastguard Worker     *
689*4d7e907cSAndroid Build Coastguard Worker     * transformMatrix is meaningless if buffer.nativeHandle is null.
690*4d7e907cSAndroid Build Coastguard Worker     */
691*4d7e907cSAndroid Build Coastguard Worker    getLastQueuedBuffer(
692*4d7e907cSAndroid Build Coastguard Worker        ) generates (
693*4d7e907cSAndroid Build Coastguard Worker            Status status,
694*4d7e907cSAndroid Build Coastguard Worker            AnwBuffer buffer,
695*4d7e907cSAndroid Build Coastguard Worker            Fence fence,
696*4d7e907cSAndroid Build Coastguard Worker            float[16] transformMatrix
697*4d7e907cSAndroid Build Coastguard Worker        );
698*4d7e907cSAndroid Build Coastguard Worker
699*4d7e907cSAndroid Build Coastguard Worker    /**
700*4d7e907cSAndroid Build Coastguard Worker     * Gets the frame events that haven't already been retrieved.
701*4d7e907cSAndroid Build Coastguard Worker     */
702*4d7e907cSAndroid Build Coastguard Worker    getFrameTimestamps(
703*4d7e907cSAndroid Build Coastguard Worker        ) generates (
704*4d7e907cSAndroid Build Coastguard Worker            FrameEventHistoryDelta timeStamps
705*4d7e907cSAndroid Build Coastguard Worker        );
706*4d7e907cSAndroid Build Coastguard Worker
707*4d7e907cSAndroid Build Coastguard Worker    /**
708*4d7e907cSAndroid Build Coastguard Worker     * Returns a unique id for this BufferQueue.
709*4d7e907cSAndroid Build Coastguard Worker     */
710*4d7e907cSAndroid Build Coastguard Worker    getUniqueId(
711*4d7e907cSAndroid Build Coastguard Worker        ) generates (
712*4d7e907cSAndroid Build Coastguard Worker            Status status,
713*4d7e907cSAndroid Build Coastguard Worker            uint64_t outId
714*4d7e907cSAndroid Build Coastguard Worker        );
715*4d7e907cSAndroid Build Coastguard Worker
716*4d7e907cSAndroid Build Coastguard Worker};
717*4d7e907cSAndroid Build Coastguard Worker
718*4d7e907cSAndroid Build Coastguard Worker
719