Android6.0显示系统(三)管理图像缓冲区

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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* outProducer,

sp* outConsumer,

const sp& allocator) {

sp core(new BufferQueueCore(allocator));

sp producer(new BufferQueueProducer(core));

sp consumer(new BufferQueueConsumer(core));

*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* buf) = 0;

virtual status_t setBufferCount(int bufferCount) = 0;

virtual status_t dequeueBuffer(int* slot, sp* fence, bool async,

uint32_t w, uint32_t h, PixelFormat format, uint32_t usage) = 0;

virtual status_t detachBuffer(int slot) = 0;

virtual status_t detachNextBuffer(sp* outBuffer,

sp* outFence) = 0;

virtual status_t attachBuffer(int* outSlot,

const sp& buffer) = 0;

virtual status_t queueBuffer(int slot,

const QueueBufferInput& input, QueueBufferOutput* output) = 0;

virtual void cancelBuffer(int slot, const sp& fence) = 0;

virtual int query(int what, int* value) = 0;

virtual status_t connect(const sp& listener,

int api, bool producerControlledByApp, QueueBufferOutput* output) = 0;

virtual status_t disconnect(int api) = 0;

virtual status_t setSidebandStream(const sp& stream) = 0;

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 mGraphicBuffer;

......

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& releaseFence, EGLDisplay display,

EGLSyncKHR fence);

virtual status_t connect(const sp& consumerListener,

bool controlledByApp);

virtual status_t disconnect();

BufferQueueConsumer类是接口IGraphicBufferComsumer的实现,在使用它之前,先要调用

相关文档
最新文档