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,如需转载请自行联系原作者
目录
相关文章
|
28天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
3月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
64 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
3月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
145 3
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
3月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
4月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
104 17
|
3月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
52 1
|
4月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。