Android6.0显示系统(三)管理图像缓冲区
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android6.0 显示系统(三)管理图像
缓冲区
一、BufferQueueCore BufferQueueProducer BufferQueueConsumer
上篇博客在Layer的onFirstRef函数中,调用了下面函数,创建了3个对象BufferQueueCore BufferQueueProducer BufferQueueConsumer。其中BufferCore是核心,把BufferQueueProducer 和BufferQueueConsumer对象连接在一起。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
void BufferQueue::createBufferQueue(sp
sp
const sp
sp
sp
sp
*outProducer = producer;
*outConsumer = consumer;
}
1.1 生产者和core的联系
IGraphicBufferProducer 的大致接口如下,BufferQueueProducer类是接口IGraphicBufferProducer 的实现,使用BufferQueueProducer之前先要调用connect函数,使用结束后调用disconnect断开连接。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
class IGraphicBufferProducer : public IInterface
{
public:
virtual status_t requestBuffer(int slot, sp
virtual status_t setBufferCount(int bufferCount) = 0;
virtual status_t dequeueBuffer(int* slot, sp
uint32_t w, uint32_t h, PixelFormat format, uint32_t usage) = 0;
virtual status_t detachBuffer(int slot) = 0;
virtual status_t detachNextBuffer(sp
sp
virtual status_t attachBuffer(int* outSlot,
const sp
virtual status_t queueBuffer(int slot,
const QueueBufferInput& input, QueueBufferOutput* output) = 0;
virtual void cancelBuffer(int slot, const sp
virtual int query(int what, int* value) = 0;
virtual status_t connect(const sp
int api, bool producerControlledByApp, QueueBufferOutput* output) = 0;
virtual status_t disconnect(int api) = 0;
virtual status_t setSidebandStream(const sp
virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
PixelFormat format, uint32_t usage) = 0;
virtual status_t allowAllocation(bool allow) = 0;
virtual status_t setGenerationNumber(uint32_t generationNumber) = 0;
virtual String8 getConsumerName() const = 0;
};
在BufferQueueCore类中定义了一个64项的数据mSlots。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
BufferQueueDefs::SlotsType mSlots;
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
typedef BufferSlot SlotsType[NUM_BUFFER_SLOTS];
每个缓冲区的类型是BufferSlot类型。它有两个重要的成员变量,mGraphicBuffer是指向图像缓冲区GraphicBuffer的指针,mBufferState表示图像缓冲区的状态。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
sp
......
BufferState mBufferState;
BufferState的状态有下面几个
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
enum BufferState {
FREE = 0,//空闲
DEQUEUED = 1,//生产状态,被生产者拥有
QUEUED = 2,//保存数据状态,被BufferQueue拥有
ACQUIRED = 3//消费状态,被消费者拥有
};
BufferQueueProducer的dequeueBuffer函数用来向BufferQueueCore申请一个空闲的slot,这个slot可能已经有缓冲区,也可能没有,如果没有缓冲区,dequeueBuffer函数会分配一块新的缓冲区。得到空闲的slot后,还需要调用requestBuffer函数来取得一块缓冲区。得到缓冲区,如果不需要了,可以使用cancelBuffer函数来释放这个slot。调用dequeueBuffer函数之后,缓冲区的拥有者是生产者,缓冲区处于DEQUEUED状态。一旦缓冲区复制数据完成,通过queueBuffer函数把缓冲区的控制权交还给BufferQueueCore,这时候缓冲区将处于QUEUED状态。
1.2 消费者和core的联系
下面是IGraphicBufferComsumer接口的几个主要函数:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
virtual status_t acquireBuffer(BufferItem* outBuffer,
nsecs_t expectedPresent, uint64_t maxFrameNumber = 0) override;
......
virtual status_t releaseBuffer(int slot, uint64_t frameNumber,
const sp
EGLSyncKHR fence);
virtual status_t connect(const sp
bool controlledByApp);
virtual status_t disconnect();
BufferQueueConsumer类是接口IGraphicBufferComsumer的实现,在使用它之前,先要调用