zoukankan      html  css  js  c++  java
  • Android gralloc 模块实例

      本文实例为借鉴 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
    ", vaddr);
    26 
    27          err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, 1024, 600, &vaddr);
    28         LOGE("++++++++++++++++> vaddr = %p
    ", 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 设备文件要稳定很多。

  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/winfu/p/6378929.html
Copyright © 2011-2022 走看看