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