Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)

简介:
  3. fb设备的打开过程
        在Gralloc模块中,fb设备的ID值定义为GRALLOC_HARDWARE_FB0。GRALLOC_HARDWARE_FB0是一个宏,定义在文件hardware/libhardware/include/hardware/gralloc.h中, 如下所示:
  1. #define GRALLOC_HARDWARE_FB0 "fb0"  
 
       fb设备使用结构体framebuffer_device_t 来描述。结构体framebuffer_device_t是用来描述系统帧缓冲区的信息,它定义在文件hardware/libhardware/include/hardware/gralloc.h中, 如下所示:
  1. typedef struct framebuffer_device_t {  
  2.     struct hw_device_t common;  
  3.   
  4.     /* flags describing some attributes of the framebuffer */  
  5.     const uint32_t  flags;  
  6.   
  7.     /* dimensions of the framebuffer in pixels */  
  8.     const uint32_t  width;  
  9.     const uint32_t  height;  
  10.   
  11.     /* frambuffer stride in pixels */  
  12.     const int       stride;  
  13.   
  14.     /* framebuffer pixel format */  
  15.     const int       format;  
  16.   
  17.     /* resolution of the framebuffer's display panel in pixel per inch*/  
  18.     const float     xdpi;  
  19.     const float     ydpi;  
  20.   
  21.     /* framebuffer's display panel refresh rate in frames per second */  
  22.     const float     fps;  
  23.   
  24.     /* min swap interval supported by this framebuffer */  
  25.     const int       minSwapInterval;  
  26.   
  27.     /* max swap interval supported by this framebuffer */  
  28.     const int       maxSwapInterval;  
  29.   
  30.     int reserved[8];  
  31.   
  32.     int (*setSwapInterval)(struct framebuffer_device_t* window,  
  33.             int interval);  
  34.   
  35.     int (*setUpdateRect)(struct framebuffer_device_t* window,  
  36.             int left, int top, int width, int height);  
  37.   
  38.     int (*post)(struct framebuffer_device_t* dev, buffer_handle_t buffer);  
  39.   
  40.     int (*compositionComplete)(struct framebuffer_device_t* dev);  
  41.   
  42.     void* reserved_proc[8];  
  43.   
  44. } framebuffer_device_t;  

        成员变量flags用来记录系统帧缓冲区的标志,目前没有使用这成员变量,它的值被设置为0。
        成员变量width和height分别用来描述设备显示屏的宽度和高度,它们是以像素为单位的。
        成员变量stride用来描述设备显示屏的一行有多少个像素点。
        成员变量format用来描述系统帧缓冲区的像素格式,支持的像素格式主要有HAL_PIXEL_FORMAT_RGBX_8888和HAL_PIXEL_FORMAT_RGB_565两种。HAL_PIXEL_FORMAT_RGBX_8888表示一个像素使用32位来描述,R、G和B分别占8位,另外8位未使用。HAL_PIXEL_FORMAT_RGB_565表示一个像素使用16位来描述,R、G和B分别占5、6和5位。
        成员变量xdpi和ydpi分别用来描述设备显示屏在宽度和高度上的密度,即每英寸有多少个像素点。
        成员变量fps用来描述设备显示屏的刷新频率,它的单位是帧每秒。
        成员变量minSwapInterval和maxSwapInterval用来描述帧缓冲区交换前后两个图形缓冲区的最小和最大时间间隔。
        成员变量reserved是保留给将来使用的。
        成员函数setSwapInterval用来设置帧缓冲区交换前后两个图形缓冲区的最小和最大时间间隔。
        成员函数setUpdateRect用来设置帧缓冲区的更新区域。
        成员函数post用来将图形缓冲区buffer的内容渲染到帧缓冲区中去,即显示在设备的显示屏中去。
        成员函数compositionComplete用来通知fb设备device,图形缓冲区的组合工作已经完成,目前没有使用这个成员函数。
        成员变量reserved是一个函数指针数组,它们是保留给将来使用的。
        在结构体framebuffer_device_t的一系列成员函数中,post是最重要的一个成员函数,用户空间的应用程序通过调用这个成员函数就可以在设备的显示屏中渲染指定的画面,后面我们将详细这个函数的实现。
        Gralloc模块在在文件hardware/libhardware/include/hardware/gralloc.h中定义了一个帮助函数framebuffer_open,用来打开fb设备,如下所示:
  1. static inline int framebuffer_open(const struct hw_module_t* module,  
  2.         struct framebuffer_device_t** device) {  
  3.     return module->methods->open(module,  
  4.             GRALLOC_HARDWARE_FB0, (struct hw_device_t**)device);  
  5. }  
       参数module指向的是一个用来描述Gralloc模块的hw_module_t结构体,前面提到,它的成员变量methods所指向的一个hw_module_methods_t结构体的成员函数open指向了Gralloc模块中的函数gralloc_device_open,这个函数打开fb设备的代码段如下所示:
  1. int gralloc_device_open(const hw_module_t* module, const char* name,  
  2.         hw_device_t** device)  
  3. {  
  4.     int status = -EINVAL;  
  5.     if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {  
  6.         ......  
  7.     } else {  
  8.         status = fb_device_open(module, name, device);  
  9.     }  
  10.     return status;  
  11. }  
       参数name的值等于GRALLOC_HARDWARE_FB0,因此,函数gralloc_device_open接下来会调用另外一个函数fb_device_open来执行打开fb设备的操作。
 
       函数fb_device_open定义在文件hardware/libhardware/modules/gralloc/framebuffer.cpp中,如下所示:
  1. struct fb_context_t {  
  2.     framebuffer_device_t  device;  
  3. };  
  4.   
  5. ......  
  6.   
  7. int fb_device_open(hw_module_t const* module, const char* name,  
  8.         hw_device_t** device)  
  9. {  
  10.     int status = -EINVAL;  
  11.     if (!strcmp(name, GRALLOC_HARDWARE_FB0)) {  
  12.         alloc_device_t* gralloc_device;  
  13.         status = gralloc_open(module, &gralloc_device);  
  14.         if (status < 0)  
  15.             return status;  
  16.   
  17.         /* initialize our state here */  
  18.         fb_context_t *dev = (fb_context_t*)malloc(sizeof(*dev));  
  19.         memset(dev, 0, sizeof(*dev));  
  20.   
  21.         /* initialize the procs */  
  22.         dev->device.common.tag = HARDWARE_DEVICE_TAG;  
  23.         dev->device.common.version = 0;  
  24.         dev->device.common.module = const_cast<hw_module_t*>(module);  
  25.         dev->device.common.close = fb_close;  
  26.         dev->device.setSwapInterval = fb_setSwapInterval;  
  27.         dev->device.post            = fb_post;  
  28.         dev->device.setUpdateRect = 0;  
  29.   
  30.         private_module_t* m = (private_module_t*)module;  
  31.         status = mapFrameBuffer(m);  
  32.         if (status >= 0) {  
  33.             int stride = m->finfo.line_length / (m->info.bits_per_pixel >> 3);  
  34.             int format = (m->info.bits_per_pixel == 32)  
  35.                          ? HAL_PIXEL_FORMAT_RGBX_8888  
  36.                          : HAL_PIXEL_FORMAT_RGB_565;  
  37. #ifdef NO_32BPP  
  38.             format = HAL_PIXEL_FORMAT_RGB_565;  
  39. #endif  
  40.             const_cast<uint32_t&>(dev->device.flags) = 0;  
  41.             const_cast<uint32_t&>(dev->device.width) = m->info.xres;  
  42.             const_cast<uint32_t&>(dev->device.height) = m->info.yres;  
  43.             const_cast<int&>(dev->device.stride) = stride;  
  44.             const_cast<int&>(dev->device.format) = format;  
  45.             const_cast<float&>(dev->device.xdpi) = m->xdpi;  
  46.             const_cast<float&>(dev->device.ydpi) = m->ydpi;  
  47.             const_cast<float&>(dev->device.fps) = m->fps;  
  48.             const_cast<int&>(dev->device.minSwapInterval) = 1;  
  49.             const_cast<int&>(dev->device.maxSwapInterval) = 1;  
  50.             *device = &dev->device.common;  
  51.         }  
  52.     }  
  53.     return status;  
  54. }  
 
        这个函数主要是用来创建一个fb_context_t结构体,并且对它的成员变量device进行初始化。结构体fb_context_t的成员变量device的类型为framebuffer_device_t,前面提到,它是用来描述fb设备的。fb设备主要是用来渲染图形缓冲区的,这是通过调用它的成员函数post来实现的。从这里可以看出,函数fb_device_open所打开的fb设备的成员函数post被设置为Gralloc模块中的函数fb_post,后面我们再详细分析它的实现。




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967075,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
存储 编解码 网络协议
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
前几年,我们在做Android平台GB28181设备接入模块的时候,第一个使用场景想到的就是用在公检法应急指挥等场景下的执法记录仪,本篇blog,我们主要围绕Android平台GB28181执法记录仪的硬件选型、设备接入、音视频流配置、流媒体传输、存储和管理、控制与控制中心等方面进行设计,探讨下Android平台GB28181设备接入模块在执法记录仪行业的应用。
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
|
10月前
|
安全 Android开发
Android HAL 层
Android HAL 层
68 1
|
10月前
|
安全 编译器 API
Android HAL深入探索(5): 调试HAL报错与解决方案
Android HAL深入探索(5): 调试HAL报错与解决方案
1798 1
|
10月前
|
传感器 Java Android开发
Android HAL深入探索(1): 架构概述
Android HAL深入探索(1): 架构概述
988 1
|
10月前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
963 0
|
10月前
|
Java 物联网 Linux
Android硬件通信之 串口通信
Android硬件通信之 串口通信
150 0
|
10月前
|
Android开发 C++
Android S HAL库的编译
Android S HAL库的编译
93 0
|
10月前
|
Android开发 C++
Android P HAL层添加HIDL实例
Android P HAL层添加HIDL实例
171 0
|
10月前
|
前端开发 Java 编译器
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
1378 0
|
10月前
|
编解码 监控 API
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
1460 0

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 4
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 7
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 10
    Android实战经验之Kotlin中快速实现MVI架构
  • 1
    android FragmentManager 删除所有Fragment 重建
    18
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    31
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    36
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    145
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    47
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    59
  • 8
    Android历史版本与APK文件结构
    164
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    42