• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_GUI_BUFFERSLOT_H
18 #define ANDROID_GUI_BUFFERSLOT_H
19 
20 #include <ui/Fence.h>
21 #include <ui/GraphicBuffer.h>
22 
23 #include <EGL/egl.h>
24 #include <EGL/eglext.h>
25 
26 #include <utils/StrongPointer.h>
27 
28 namespace android {
29 
30 class Fence;
31 
32 struct BufferSlot {
33 
BufferSlotBufferSlot34     BufferSlot()
35     : mEglDisplay(EGL_NO_DISPLAY),
36       mBufferState(BufferSlot::FREE),
37       mRequestBufferCalled(false),
38       mFrameNumber(0),
39       mEglFence(EGL_NO_SYNC_KHR),
40       mAcquireCalled(false),
41       mNeedsCleanupOnRelease(false),
42       mAttachedByConsumer(false) {
43     }
44 
45     // mGraphicBuffer points to the buffer allocated for this slot or is NULL
46     // if no buffer has been allocated.
47     sp<GraphicBuffer> mGraphicBuffer;
48 
49     // mEglDisplay is the EGLDisplay used to create EGLSyncKHR objects.
50     EGLDisplay mEglDisplay;
51 
52     // BufferState represents the different states in which a buffer slot
53     // can be.  All slots are initially FREE.
54     enum BufferState {
55         // FREE indicates that the buffer is available to be dequeued
56         // by the producer.  The buffer may be in use by the consumer for
57         // a finite time, so the buffer must not be modified until the
58         // associated fence is signaled.
59         //
60         // The slot is "owned" by BufferQueue.  It transitions to DEQUEUED
61         // when dequeueBuffer is called.
62         FREE = 0,
63 
64         // DEQUEUED indicates that the buffer has been dequeued by the
65         // producer, but has not yet been queued or canceled.  The
66         // producer may modify the buffer's contents as soon as the
67         // associated ready fence is signaled.
68         //
69         // The slot is "owned" by the producer.  It can transition to
70         // QUEUED (via queueBuffer) or back to FREE (via cancelBuffer).
71         DEQUEUED = 1,
72 
73         // QUEUED indicates that the buffer has been filled by the
74         // producer and queued for use by the consumer.  The buffer
75         // contents may continue to be modified for a finite time, so
76         // the contents must not be accessed until the associated fence
77         // is signaled.
78         //
79         // The slot is "owned" by BufferQueue.  It can transition to
80         // ACQUIRED (via acquireBuffer) or to FREE (if another buffer is
81         // queued in asynchronous mode).
82         QUEUED = 2,
83 
84         // ACQUIRED indicates that the buffer has been acquired by the
85         // consumer.  As with QUEUED, the contents must not be accessed
86         // by the consumer until the fence is signaled.
87         //
88         // The slot is "owned" by the consumer.  It transitions to FREE
89         // when releaseBuffer is called.
90         ACQUIRED = 3
91     };
92 
93     static const char* bufferStateName(BufferState state);
94 
95     // mBufferState is the current state of this buffer slot.
96     BufferState mBufferState;
97 
98     // mRequestBufferCalled is used for validating that the producer did
99     // call requestBuffer() when told to do so. Technically this is not
100     // needed but useful for debugging and catching producer bugs.
101     bool mRequestBufferCalled;
102 
103     // mFrameNumber is the number of the queued frame for this slot.  This
104     // is used to dequeue buffers in LRU order (useful because buffers
105     // may be released before their release fence is signaled).
106     uint64_t mFrameNumber;
107 
108     // mEglFence is the EGL sync object that must signal before the buffer
109     // associated with this buffer slot may be dequeued. It is initialized
110     // to EGL_NO_SYNC_KHR when the buffer is created and may be set to a
111     // new sync object in releaseBuffer.  (This is deprecated in favor of
112     // mFence, below.)
113     EGLSyncKHR mEglFence;
114 
115     // mFence is a fence which will signal when work initiated by the
116     // previous owner of the buffer is finished. When the buffer is FREE,
117     // the fence indicates when the consumer has finished reading
118     // from the buffer, or when the producer has finished writing if it
119     // called cancelBuffer after queueing some writes. When the buffer is
120     // QUEUED, it indicates when the producer has finished filling the
121     // buffer. When the buffer is DEQUEUED or ACQUIRED, the fence has been
122     // passed to the consumer or producer along with ownership of the
123     // buffer, and mFence is set to NO_FENCE.
124     sp<Fence> mFence;
125 
126     // Indicates whether this buffer has been seen by a consumer yet
127     bool mAcquireCalled;
128 
129     // Indicates whether this buffer needs to be cleaned up by the
130     // consumer.  This is set when a buffer in ACQUIRED state is freed.
131     // It causes releaseBuffer to return STALE_BUFFER_SLOT.
132     bool mNeedsCleanupOnRelease;
133 
134     // Indicates whether the buffer was attached on the consumer side.
135     // If so, it needs to set the BUFFER_NEEDS_REALLOCATION flag when dequeued
136     // to prevent the producer from using a stale cached buffer.
137     bool mAttachedByConsumer;
138 };
139 
140 } // namespace android
141 
142 #endif
143