[Android禅修之路] 解读 GraphicBuffer 开篇

2,105 阅读2分钟

[Android禅修之路] 解读 GraphicBuffer 开篇

Android禅修之路

在之前 SurfaceFlinger 的合成流程中,我们说到了生产者和消费者队列和BufferQueue 的工作原理,其中就包括几个最关键的函数

  • dequeueBuffer
  • queueBuffer
  • acquireBuffer
  • releaseBuffer 这几个函数是生产者或消费者与 BufferQueue 交互的过程,在这几个函数中,就涉及到 GraphicBuffer 的创建。

当作为生产者的应用程序需要绘制的时候,需要向 BufferQueue 中申请一个缓冲区,这个缓冲区其实就是 GraphicBuffer。当然我们在BufferQueue 的工作原理的3.4小节中说道了,如果获取 BufferSlot 的时候,拿到的标志是 BUFFER_NEEDS_REALLOCATION,那么就会创建一个 GraphicBuffer。从这一篇开始,我们就正式解读 GraphicBuffer 的创建过程,这个过程也就是系统为显示的内容分配缓冲区的过程。

那么这个 GraphicBuffer 是怎么申请的呢?

其实申请这个缓冲区的过程非常复杂,它涉及到了几个部分

  1. GraphicBuffer 在 Framework 系统中的生成 解读GraphicBuffer 之 Framework 层

  2. GraphicBuffer 在 HAL 中的生成 解读 GraphicBuffer 之 HAL 层

  3. GraphicBuffer 在 ION驱动中的内存的分配过程解读 GraphicBuffer 之 Ion 驱动层

所以接下来,我会针对这几个部分的内容逐渐深入的学习。它的调用流程大致如下图

------------------Framework层-----------------
1. GraphicBuffer()构造函数
	1. initWithSize
		1. GraphicBufferAllocator::get() - 获取单例对象 allocator
		2. allocator.allocate - 分配 GraphicBuffer 的内存空间
			1. mAllocator->allocate - mAllocator 是 GrallocAllocator 的指针,它是 GraphicBufferAllocator 中的一个成员变量,它有多个实现,其中之一就是 Gralloc3Allocator
				1. Gralloc3Allocator.allocate() - GrallocAllocator 的具体实现
					-------------------------- HAL 层 -------------------------
					1. IMapper::BufferDescriptorInfo descriptorInfo - 定义缓冲区描述符,记录传入的参数
					2. mMapper.createDescriptor - 通过 mMapper 创建一个描述信息,这个 mMapper 是一个 HIDL 的Bp 对象,完整定义是 `hardware::graphics::mapper::V3_0::IMapper`
					3. mAllocator->allocate - 通过 mAllocator 分配具体内存,这个 mAllocator 是一个 HIDL 的 Bp 对象,完整定义是 `hardware::graphics::allocator::V3_0::IAllocator`
						---------------- 硬件层具体的硬件实现(例如高通) -----------------
						1. gr_device_impl.AllocateBuffers() - AllocateBuffers 是 allocate 函数的映射
						2. gralloc1_device_t -> (GrallocImpl) dev - 将外部传入的结构体进行转换
						3. dev->buf_mgr_->AllocateBuffers - buf_mgr_ 是 GrallocImpl 的成员对象,全称 BufferManager,实现是 gr_buf_mgr.cpp
						4. allocator_.GetImplDefinedFormat()
						5. allocator_->AllocateMem() - allocator_ 是定义在 BufferManager 中的成员变量,类名是 Allocator,文件名是 gr_allocator
						6. ion_allocator_->AllocBuffer - ion_allocator_ 是定义在 Allocator 中的成员变量
							------------------- 内核层 -----------------
							1. IonAlloc::AllocBuffer
							2. ioctl(ion_dev_fd_, INT(ION_IOC_MAP), &fd_data)
		1. mBufferMapper.getTransportSize - 记录 GraphicBuffer 相关参数

(后期会改成图)