1289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza/*
2289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Copyright 2014 The Android Open Source Project
3289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
4289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
5289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * you may not use this file except in compliance with the License.
6289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * You may obtain a copy of the License at
7289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
8289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
9289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
10289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Unless required by applicable law or agreed to in writing, software
11289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
12289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * See the License for the specific language governing permissions and
14289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * limitations under the License.
15289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza */
16289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
17289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#ifndef ANDROID_GUI_BUFFERSLOT_H
18289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#define ANDROID_GUI_BUFFERSLOT_H
19289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
20289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <ui/Fence.h>
21289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <ui/GraphicBuffer.h>
22289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
23289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <EGL/egl.h>
24289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <EGL/eglext.h>
25289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
26289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <utils/StrongPointer.h>
27289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
28289ade165e60b5f71734d30e535f16eb1f4313adDan Stozanamespace android {
29289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
30289ade165e60b5f71734d30e535f16eb1f4313adDan Stozaclass Fence;
31289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
32289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastruct BufferSlot {
33289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
34289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    BufferSlot()
35289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    : mEglDisplay(EGL_NO_DISPLAY),
36289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza      mBufferState(BufferSlot::FREE),
37289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza      mRequestBufferCalled(false),
38289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza      mFrameNumber(0),
39289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza      mEglFence(EGL_NO_SYNC_KHR),
40289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza      mAcquireCalled(false),
419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza      mNeedsCleanupOnRelease(false),
429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza      mAttachedByConsumer(false) {
43289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
44289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
45289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mGraphicBuffer points to the buffer allocated for this slot or is NULL
46289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // if no buffer has been allocated.
47289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    sp<GraphicBuffer> mGraphicBuffer;
48289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
49289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mEglDisplay is the EGLDisplay used to create EGLSyncKHR objects.
50289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    EGLDisplay mEglDisplay;
51289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
52289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // BufferState represents the different states in which a buffer slot
53289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // can be.  All slots are initially FREE.
54289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    enum BufferState {
55289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // FREE indicates that the buffer is available to be dequeued
56289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // by the producer.  The buffer may be in use by the consumer for
57289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // a finite time, so the buffer must not be modified until the
58289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // associated fence is signaled.
59289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        //
60289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // The slot is "owned" by BufferQueue.  It transitions to DEQUEUED
61289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // when dequeueBuffer is called.
62289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        FREE = 0,
63289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
64289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // DEQUEUED indicates that the buffer has been dequeued by the
65289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // producer, but has not yet been queued or canceled.  The
66289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // producer may modify the buffer's contents as soon as the
67289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // associated ready fence is signaled.
68289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        //
69289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // The slot is "owned" by the producer.  It can transition to
70289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // QUEUED (via queueBuffer) or back to FREE (via cancelBuffer).
71289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        DEQUEUED = 1,
72289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
73289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // QUEUED indicates that the buffer has been filled by the
74289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // producer and queued for use by the consumer.  The buffer
75289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // contents may continue to be modified for a finite time, so
76289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // the contents must not be accessed until the associated fence
77289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // is signaled.
78289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        //
79289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // The slot is "owned" by BufferQueue.  It can transition to
80289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // ACQUIRED (via acquireBuffer) or to FREE (if another buffer is
81289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // queued in asynchronous mode).
82289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        QUEUED = 2,
83289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
84289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // ACQUIRED indicates that the buffer has been acquired by the
85289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // consumer.  As with QUEUED, the contents must not be accessed
86289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // by the consumer until the fence is signaled.
87289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        //
88289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // The slot is "owned" by the consumer.  It transitions to FREE
89289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        // when releaseBuffer is called.
90289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        ACQUIRED = 3
91289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    };
92289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
93289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    static const char* bufferStateName(BufferState state);
94289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
95289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mBufferState is the current state of this buffer slot.
96289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    BufferState mBufferState;
97289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
98289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mRequestBufferCalled is used for validating that the producer did
99289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // call requestBuffer() when told to do so. Technically this is not
100289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // needed but useful for debugging and catching producer bugs.
101289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    bool mRequestBufferCalled;
102289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
103289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mFrameNumber is the number of the queued frame for this slot.  This
104289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // is used to dequeue buffers in LRU order (useful because buffers
105289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // may be released before their release fence is signaled).
106289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    uint64_t mFrameNumber;
107289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
108289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mEglFence is the EGL sync object that must signal before the buffer
109289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // associated with this buffer slot may be dequeued. It is initialized
110289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // to EGL_NO_SYNC_KHR when the buffer is created and may be set to a
111289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // new sync object in releaseBuffer.  (This is deprecated in favor of
112289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mFence, below.)
113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    EGLSyncKHR mEglFence;
114289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
115289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // mFence is a fence which will signal when work initiated by the
116289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // previous owner of the buffer is finished. When the buffer is FREE,
117289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // the fence indicates when the consumer has finished reading
118289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // from the buffer, or when the producer has finished writing if it
119289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // called cancelBuffer after queueing some writes. When the buffer is
120289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // QUEUED, it indicates when the producer has finished filling the
121289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // buffer. When the buffer is DEQUEUED or ACQUIRED, the fence has been
122289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // passed to the consumer or producer along with ownership of the
123289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // buffer, and mFence is set to NO_FENCE.
124289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    sp<Fence> mFence;
125289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
126289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // Indicates whether this buffer has been seen by a consumer yet
127289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    bool mAcquireCalled;
128289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
129289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // Indicates whether this buffer needs to be cleaned up by the
130289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // consumer.  This is set when a buffer in ACQUIRED state is freed.
131289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // It causes releaseBuffer to return STALE_BUFFER_SLOT.
132289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    bool mNeedsCleanupOnRelease;
1339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
1349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // Indicates whether the buffer was attached on the consumer side.
1359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // If so, it needs to set the BUFFER_NEEDS_REALLOCATION flag when dequeued
1369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // to prevent the producer from using a stale cached buffer.
1379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    bool mAttachedByConsumer;
138289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza};
139289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
140289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android
141289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
142289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#endif
143