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