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

上传人:第*** 文档编号:31309990 上传时间:2018-02-06 格式:DOC 页数:9 大小:75.50KB
返回 下载 相关 举报
android6.0 显示系统(三) 管理图像缓冲区_第1页
第1页 / 共9页
android6.0 显示系统(三) 管理图像缓冲区_第2页
第2页 / 共9页
android6.0 显示系统(三) 管理图像缓冲区_第3页
第3页 / 共9页
android6.0 显示系统(三) 管理图像缓冲区_第4页
第4页 / 共9页
android6.0 显示系统(三) 管理图像缓冲区_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《android6.0 显示系统(三) 管理图像缓冲区》由会员分享,可在线阅读,更多相关《android6.0 显示系统(三) 管理图像缓冲区(9页珍藏版)》请在金锄头文库上搜索。

1、Android6.0 显示系统(三) 管理图像缓冲区一、BufferQueueCore BufferQueueProducer BufferQueueConsumer上篇博客在 Layer 的 onFirstRef 函数中,调用了下面函数,创建了 3 个对象BufferQueueCore BufferQueueProducer BufferQueueConsumer。其中 BufferCore 是核心,把BufferQueueProducer 和 BufferQueueConsumer 对象连接在一起。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片void

2、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

3、 的大致接口如下,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 setBu

4、fferCount(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 attachBu

5、ffer(int* outSlot, const sp virtual status_t queueBuffer(int slot, const QueueBufferInput virtual void cancelBuffer(int slot, const sp virtual int query(int what, int* value) = 0; virtual status_t connect(const sp& listener, int api, bool producerControlledByApp, QueueBufferOutput* output) = 0; virt

6、ual 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 generat

7、ionNumber) = 0; virtual String8 getConsumerName() const = 0; ; 在 BufferQueueCore 类中定义了一个 64 项的数据 mSlots。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片BufferQueueDefs:SlotsType mSlots; cpp view plain copy 在 CODE 上查看代码片派生到我的代码片typedef BufferSlot SlotsTypeNUM_BUFFER_SLOTS; 每个缓冲区的类型是 BufferSlot 类型。它有两个重要的成员变

8、量,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,/保存数据状态,被 Buffe

9、rQueue 拥有 ACQUIRED = 3/消费状态,被消费者拥有 ; BufferQueueProducer 的 dequeueBuffer 函数用来向 BufferQueueCore 申请一个空闲的 slot,这个 slot 可能已经有缓冲区,也可能没有,如果没有缓冲区,dequeueBuffer 函数会分配一块新的缓冲区。得到空闲的 slot 后,还需要调用 requestBuffer 函数来取得一块缓冲区。得到缓冲区,如果不需要了,可以使用 cancelBuffer 函数来释放这个 slot。调用 dequeueBuffer函数之后,缓冲区的拥有者是生产者,缓冲区处于 DEQUEUE

10、D 状态。一旦缓冲区复制数据完成,通过 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; . vir

11、tual 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 的实现,在使用它之前,先要调用 connec

12、t 函数建立联系,这里传递的参数是 IConsumerListener 对象,是一个回调接口,如果 BufferQueue 中有数据准备好了就会调用它的 onFrameAvailable 函数来通知消费者取走数据。取走数据的时候,需要调用 acquireBuffer 函数,将缓冲区状态变成 ACQUIRED,使用完之后调用 releaseBuffer 函数可以吧缓冲区数据归还给 BufferQueueCore,这样缓冲区就变成FREE。1.3 三者联系对象 BufferQueueProducer 和 BufferQueueConsumer 好像没有直接联系,其实都是通过共同的 BufferQu

13、eueCore 对象连接在一起的,很多操作时直接使用 BufferQueueCore 对象的成员变量而不是函数来完成的。二、GraphicBuffer 对象的创建对 Surface 而言,图像缓冲区是一个重要的数据结构,它是用户进程和图像显示器之间的纽带,下面我们来看看 Surface 的图像缓冲区是如何创建的。2.1 内存缓冲区的创建前面介绍了过 dequeueBuffer 函数,图像缓冲区 GraphicBuffer 就是在这个函数中创建的,当从 BufferQueueCore 中获取到空间的 slot 时,如果这个 slot 没有缓冲区就要新建一个。下面是 dequeueBuffer 函

14、数的部分代码,在从 BufferQueueCore 中获取到 slot 的时候,如果需要重新分配图像缓冲区就会调用 mCore-mAllocator-createGraphicBuffer 函数来重新创建一个图像缓冲区。cpp view plain copy 在 CODE 上查看代码片派生到我的代码片. *outSlot = found;/found 复制到 outslot ATRACE_BUFFER_INDEX(found); attachedByConsumer = mSlotsfound.mAttachedByConsumer; mSlotsfound.mBufferState = Bu

15、fferSlot:DEQUEUED;/slot 的状态修改变成生产状态 const sp if (buffer = NULL) |/为空,或者需要重新分配 buffer-needsReallocation(width, height, format, usage) mSlotsfound.mAcquireCalled = false; mSlotsfound.mGraphicBuffer = NULL; mSlotsfound.mRequestBufferCalled = false; mSlotsfound.mEglDisplay = EGL_NO_DISPLAY; mSlotsfound.

16、mEglFence = EGL_NO_SYNC_KHR; mSlotsfound.mFence = Fence:NO_FENCE; mCore-mBufferAge = 0; returnFlags |= BUFFER_NEEDS_REALLOCATION;/需要重启分配缓冲区 else / We add 1 because that will be the frame number when this buffer / is queued mCore-mBufferAge = mCore-mFrameCounter + 1 - mSlotsfound.mFrameNumber; BQ_LOGV(d

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号