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
							 |