/* * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_GUI_BUFFERSLOT_H #define ANDROID_GUI_BUFFERSLOT_H #include #include #include #include #include namespace android { class Fence; struct BufferSlot { BufferSlot() : mEglDisplay(EGL_NO_DISPLAY), mBufferState(BufferSlot::FREE), mRequestBufferCalled(false), mFrameNumber(0), mEglFence(EGL_NO_SYNC_KHR), mAcquireCalled(false), mNeedsCleanupOnRelease(false), mAttachedByConsumer(false) { } // mGraphicBuffer points to the buffer allocated for this slot or is NULL // if no buffer has been allocated. sp mGraphicBuffer; // mEglDisplay is the EGLDisplay used to create EGLSyncKHR objects. EGLDisplay mEglDisplay; // BufferState represents the different states in which a buffer slot // can be. All slots are initially FREE. enum BufferState { // FREE indicates that the buffer is available to be dequeued // by the producer. The buffer may be in use by the consumer for // a finite time, so the buffer must not be modified until the // associated fence is signaled. // // The slot is "owned" by BufferQueue. It transitions to DEQUEUED // when dequeueBuffer is called. FREE = 0, // DEQUEUED indicates that the buffer has been dequeued by the // producer, but has not yet been queued or canceled. The // producer may modify the buffer's contents as soon as the // associated ready fence is signaled. // // The slot is "owned" by the producer. It can transition to // QUEUED (via queueBuffer) or back to FREE (via cancelBuffer). DEQUEUED = 1, // QUEUED indicates that the buffer has been filled by the // producer and queued for use by the consumer. The buffer // contents may continue to be modified for a finite time, so // the contents must not be accessed until the associated fence // is signaled. // // The slot is "owned" by BufferQueue. It can transition to // ACQUIRED (via acquireBuffer) or to FREE (if another buffer is // queued in asynchronous mode). QUEUED = 2, // ACQUIRED indicates that the buffer has been acquired by the // consumer. As with QUEUED, the contents must not be accessed // by the consumer until the fence is signaled. // // The slot is "owned" by the consumer. It transitions to FREE // when releaseBuffer is called. ACQUIRED = 3 }; static const char* bufferStateName(BufferState state); // mBufferState is the current state of this buffer slot. BufferState mBufferState; // mRequestBufferCalled is used for validating that the producer did // call requestBuffer() when told to do so. Technically this is not // needed but useful for debugging and catching producer bugs. bool mRequestBufferCalled; // mFrameNumber is the number of the queued frame for this slot. This // is used to dequeue buffers in LRU order (useful because buffers // may be released before their release fence is signaled). uint64_t mFrameNumber; // mEglFence is the EGL sync object that must signal before the buffer // associated with this buffer slot may be dequeued. It is initialized // to EGL_NO_SYNC_KHR when the buffer is created and may be set to a // new sync object in releaseBuffer. (This is deprecated in favor of // mFence, below.) EGLSyncKHR mEglFence; // mFence is a fence which will signal when work initiated by the // previous owner of the buffer is finished. When the buffer is FREE, // the fence indicates when the consumer has finished reading // from the buffer, or when the producer has finished writing if it // called cancelBuffer after queueing some writes. When the buffer is // QUEUED, it indicates when the producer has finished filling the // buffer. When the buffer is DEQUEUED or ACQUIRED, the fence has been // passed to the consumer or producer along with ownership of the // buffer, and mFence is set to NO_FENCE. sp mFence; // Indicates whether this buffer has been seen by a consumer yet bool mAcquireCalled; // Indicates whether this buffer needs to be cleaned up by the // consumer. This is set when a buffer in ACQUIRED state is freed. // It causes releaseBuffer to return STALE_BUFFER_SLOT. bool mNeedsCleanupOnRelease; // Indicates whether the buffer was attached on the consumer side. // If so, it needs to set the BUFFER_NEEDS_REALLOCATION flag when dequeued // to prevent the producer from using a stale cached buffer. bool mAttachedByConsumer; }; } // namespace android #endif