• 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 设备文件要稳定很多。

  • 相关阅读:
    NYOJ 815 三角形【海伦公式】
    HTTP Status 500
    C++继承中析构函数 构造函数的调用顺序以及虚析构函数
    Android学习JNI,使用JNI实现字符串加密
    HDU 4749 Parade Show(暴力水果)
    更换oracle 集群网卡(Changing a Network Interface)
    MongoDB数据模型和索引学习总结
    公司中午不能午休规定后的解决措施
    OC中使用UI自己定义控件实现计算器的设计(版本号1简单的加减乘除,连加,连减,连除,连乘)
    【JavaScript】——JS入门
  • 原文地址:https://www.cnblogs.com/winfu/p/6378929.html
Copyright © 2020-2023  润新知