首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

Android图形缓冲区分配进程源码分析

2013-10-08 
Android图形缓冲区分配过程源码分析在上一篇文章Android图形显示之硬件抽象层Gralloc介绍了Gralloc模块的

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()   释放图形缓冲区

图形缓冲区分配过程

内存中分配Buffer
static 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中的指定位就可以了。

热点排行