通过前面的学习我们知道,在 SurfaceFlinger 中使用的生产者/消费者模型,Surface 做为生产者一方存在如下两个比较重要的函数:
- dequeueBuffer:获取一个缓冲区(GraphicBuffer),也就是 GraphicBuffer 生成。
- queueBuffer :把缓冲区(GraphicBuffer)放入缓冲队列中。
这里我们就先来看看 dequeueBuffer() 函数,该函数通常由生产者调用,用于从 BufferQueue 中取出一个缓冲区以供渲染。这个函数会等待直到有一个缓冲区变为可用状态,然后将其标记为“出队”,并返回给生产者。生产者随后可以在该缓冲区上绘制图像数据。
一、GraphicBuffer生成
这里我们先来看一下 Surface 的核心对象之一 mSlots,这个对象是数组 BufferSlot。
1、BufferSlot
源码位置:/frameworks/native/libs/gui/include/gui/BufferSlot.h
struct BufferSlot {
BufferSlot()
: mGraphicBuffer(nullptr),
mEglDisplay(EGL_NO_DISPLAY),
mBufferState(),
mRequestBufferCalled(false),
mFrameNumber(0),
mEglFence(EG