137 lines
5.1 KiB
C
137 lines
5.1 KiB
C
|
/*
|
||
|
* 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) {
|
||
|
}
|
||
|
|
||
|
// 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;
|
||
|
};
|
||
|
|
||
|
} // namespace android
|
||
|
|
||
|
#endif
|