Android gralloc 模块实例

时间:2022-08-06 03:55:59

  本文实例为借鉴 http://www.ixueyi.com/jingyan/1865079.html 该文档后所写。主要是android的gralloc操作显存的模块实例,如有不正确的地方欢迎指出谢谢。

  Android帧缓冲区硬件抽象层模块Gralloc的实现原理。

   1. 分配一个匹配屏幕大小的图形缓冲区

     2. 将分配好的图形缓冲区注册(映射)到当前进程的地址空间来

     3. 将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去

    为了实现以上三个操作,我们还需要:

    1. 加载Gralloc模块

    2. 打开Gralloc模块中的gralloc设备和fb设备

    其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区。

  直接看源码:

  

 1 framebuffer_device_t* fbDev;
 2 alloc_device_t* grDev;
 3 
 4 hw_module_t const* module;
 5 buffer_handle_t handle;
 6 gralloc_module_t const *mAllocMod;
 7 void* vaddr;
 8 int stride;
 9 int err;
10 if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {//加载gralloc模块
11        
12         err = framebuffer_open(module, &fbDev); //打开fb设备
13         if(err) LOGE("couldn't open framebuffer HAL (%s)", strerror(-err));
14         err = gralloc_open(module, &grDev); //打开gralloc设备
15         if(err) LOGE("couldn't open gralloc HAL (%s)", strerror(-err));
16         
17         err = grDev->alloc(grDev, display.w, display.h, HAL_PIXEL_FORMAT_RGBA_8888, GRALLOC_USAGE_HW_FB/*决定申请的是系统图形内存还是普通内存*/, &handle, &stride); //分配图形缓冲区
18         // err = grDev->alloc(grDev, 1024, 600, HAL_PIXEL_FORMAT_RGBA_8888, 0/*决定申请的是系统图形内存还是普通内存*/, &handle, &stride); //分配图形缓冲区
19         
20         mAllocMod = (gralloc_module_t const *)module;
21         err = mAllocMod->registerBuffer(mAllocMod, handle); //映射内存到进程中
22         
23         
24         err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, display.w, display.h, &vaddr);
25         LOGE("++++++++++++++++> vaddr = %p\n", vaddr);
26 
27          err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, 1024, 600, &vaddr);
28         LOGE("++++++++++++++++> vaddr = %p\n", vaddr);

29 //这就绘图即可,将绘制的图的内存直接拷贝到vaddr里面即可 30 bitmap.lockPixels(); 31   canvas->drawPath(path, paint); 33   memcpy(vaddr, bitmap.getPixels(), bitmap.getSize()); 34   bitmap.unlockPixels();
35 err = mAllocMod->unlock(mAllocMod, handle); 36 37 err = fbDev->post(fbDev, handle); //图形缓冲区的渲染 38 39 err = mAllocMod->unregisterBuffer(mAllocMod, handle); //解除映射内存 40 41 grDev->free(grDev, handle);//释放图形缓冲区 42 43 gralloc_close(grDev);//关闭gralloc设备 44 framebuffer_close(fbDev);//关闭fb设备 45 }

这样就可以直接绘图显示在屏幕上了,比直接操作/dev/graphics/fb0 设备文件要稳定很多。