You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					143 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					143 lines
				
				5.4 KiB
			| 
											6 years ago
										 | /*
 | ||
|  |  * 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 <ui/Fence.h>
 | ||
|  | #include <ui/GraphicBuffer.h>
 | ||
|  | 
 | ||
|  | #include <EGL/egl.h>
 | ||
|  | #include <EGL/eglext.h>
 | ||
|  | 
 | ||
|  | #include <utils/StrongPointer.h>
 | ||
|  | 
 | ||
|  | 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<GraphicBuffer> 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<Fence> 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
 |