Dan Stoza | 289ade1 | 2014-02-28 11:17:17 -0800 | [diff] [blame] | 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 | |
| 34 | 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), |
Dan Stoza | 9f3053d | 2014-03-06 15:14:33 -0800 | [diff] [blame] | 41 | mNeedsCleanupOnRelease(false), |
| 42 | mAttachedByConsumer(false) { |
Dan Stoza | 289ade1 | 2014-02-28 11:17:17 -0800 | [diff] [blame] | 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; |
Dan Stoza | 9f3053d | 2014-03-06 15:14:33 -0800 | [diff] [blame] | 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; |
Dan Stoza | 289ade1 | 2014-02-28 11:17:17 -0800 | [diff] [blame] | 138 | }; |
| 139 | |
| 140 | } // namespace android |
| 141 | |
| 142 | #endif |