Android图形缓冲区分配过程源码分析
在上一篇文章Android图形显示之硬件抽象层Gralloc介绍了Gralloc模块的定义,Gralloc模块中的fb设备的打开过程及gpu设备的打开过程。关于Gralloc模块的加载过程在Android硬件抽象Hardware库加载过程源码分析中已经详细介绍过了,通过Android图形显示之硬件抽象层Gralloc的介绍,相信大家对Gralloc模块的设计有了大概的了解,本文在前文的基础上继续分析Android系统的图形显示内容。我们知道在Gralloc模块中定义了gpu设备来分配图形缓冲区,同时在上一篇文章中已经介绍了gpu设备的打开过程,在打开gpu设备时,注册了图形缓冲区的分配和释放函数,本文针对图形缓冲区的分配和释放过程展开分析。Android为上层定义了一个工具类GraphicBufferAllocator,该类用来访问Gralloc硬件抽象模块中的gpu设备alloc_device_t,专门负责图形缓冲区的分配与回收。
前面介绍了Gralloc模块中的gpu设备用于分配图形缓冲区,GraphicBufferAllocator打开gpu设备后,就通过该gpu设备来分配图形缓冲区,因此GraphicBufferAllocator为上层提供访问gpu设备的接口。
GraphicBufferAllocator::alloc() -->mAllocDev->alloc() -->alloc_device_t->alloc()-->gralloc_alloc() 分配图形缓冲区
图形缓冲区分配过程
GraphicBufferAllocator::free() -->mAllocDev->free() -->alloc_device_t->free()-->gralloc_free() 释放图形缓冲区
内存中分配Bufferstatic int gralloc_unmap(gralloc_module_t const* module,buffer_handle_t handle){ private_handle_t* hnd = (private_handle_t*)handle; if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) { void* base = (void*)hnd->base; size_t size = hnd->size; if (munmap(base, size) < 0) { ALOGE("Could not unmap %s", strerror(errno)); } } hnd->base = 0; return 0;}对于内存中分配的图形缓冲区buffer的释放,首先是将图形缓冲区buffer从当前进程地址空间中取消映射,然后才调用close(fd)来释放这块buffer,由于在内存中分配的buffer是一块匿名共享内存,因此当调用close(fd)时,匿名共享内存驱动函数ashmem_release自动被调用,该函数就是用来回收创建的匿名共享内存。对于从系统帧缓冲区分配的buffer,只需要清空bufferMask中的指定位就可以了。