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

简介:
   成员变量fd指向一个文件描述符,这个文件描述符要么指向帧缓冲区设备,要么指向一块匿名共享内存,取决于它的宿主结构体private_handle_t描述的一个图形缓冲区是在帧缓冲区分配的,还是在内存中分配的。
        成员变量magic指向一个魔数,它的值由静态成员变量sMagic来指定,用来标识一个private_handle_t结构体。
        成员变量flags用来描述一个图形缓冲区的标志,它的值要么等于0,要么等于PRIV_FLAGS_FRAMEBUFFER。当一个图形缓冲区的标志值等于PRIV_FLAGS_FRAMEBUFFER的时候,就表示它是在帧缓冲区中分配的。
       成员变量size用来描述一个图形缓冲区的大小。
       成员变量offset用来描述一个图形缓冲区的偏移地址。例如,当一个图形缓冲区是在一块内存中分块的时候,假设这块内存的地址为start,那么这个图形缓冲区的起始地址就为start + offset。
       成员变量base用来描述一个图形缓冲区的实际地址,它是通过成员变量offset来计算得到的。例如,上面计算得到的start + offset的值就保存在成员变量base中。
       成员变量pid用来描述一个图形缓冲区的创建者的PID。例如,如果一个图形缓冲区是在ID值为1000的进程中创建的,那么用来描述这个图形缓冲区的private_handle_t结构体的成员变量pid的值就等于1000。
       结构体private_handle_t的静态成员变量sMagic前面已经描述过了,另外两个静态成员变量sNumInts和sNumFds的值分别等于1和6,表示结构体private_handle_t包含有1个文件描述符和6个整数,它们是用来初始化结构体private_handle_t的父类native_handle_t的成员变量numInts和numFds的,如结构体private_handle_t的构造函数所示。从这里就可以看出,结构体private_handle_t的父类native_handle_t的成员变量data所指向的缓冲区就是由结构体private_handle_t的成员变量fds、magic、flags、size、offset、base和pid所占用的连续内存块来组成的,一共包含有7个整数。
       结构体private_handle_t还定义了一个静态成员函数validate,用来验证一个native_handle_t指针是否指向了一个private_handle_t结构体。
       至此,Gralloc模块的加载过程以及相关的数据结构体就介绍到这里,接下来我们分别分析定义在Gralloc模块中的gralloc和fb设备的打开过程。
       2. gralloc设备的打开过程
       在Gralloc模块中,gralloc设备的ID值定义为GRALLOC_HARDWARE_GPU0。GRALLOC_HARDWARE_GPU0是一个宏,定义在文件hardware/libhardware/include/hardware/gralloc.h中, 如下所示:
  1. #define GRALLOC_HARDWARE_GPU0 "gpu0"  
       gralloc设备使用结构体alloc_device_t 来描述。结构体alloc_device_t有两个成员函数alloc和free,分别用来分配和释放图形缓冲区。
 
       结构体alloc_device_t 也是定义在文件hardware/libhardware/include/hardware/gralloc.h中, 如下所示:
  1. typedef struct alloc_device_t {  
  2.     struct hw_device_t common;  
  3.   
  4.     int (*alloc)(struct alloc_device_t* dev,  
  5.             int w, int h, int format, int usage,  
  6.             buffer_handle_t* handle, int* stride);  
  7.   
  8.     int (*free)(struct alloc_device_t* dev,  
  9.             buffer_handle_t handle);  
  10.   
  11. } alloc_device_t;  
       Gralloc模块在在文件hardware/libhardware/include/hardware/gralloc.h中定义了一个帮助函数gralloc_open,用来打开gralloc设备,如下所示:
  1. static inline int gralloc_open(const struct hw_module_t* module,  
  2.         struct alloc_device_t** device) {  
  3.     return module->methods->open(module,  
  4.             GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device);  
  5. }  
       参数module指向的是一个用来描述Gralloc模块的hw_module_t结构体,它的成员变量methods所指向的一个hw_module_methods_t结构体的成员函数open指向了Gralloc模块中的函数gralloc_device_open。
 
       函数gralloc_device_open定义在文件hardware/libhardware/modules/gralloc/gralloc.cpp文件中,如下所示:
  1. struct gralloc_context_t {  
  2.     alloc_device_t  device;  
  3.     /* our private data here */  
  4. };  
  5.   
  6. ......  
  7.   
  8. int gralloc_device_open(const hw_module_t* module, const char* name,  
  9.         hw_device_t** device)  
  10. {  
  11.     int status = -EINVAL;  
  12.     if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {  
  13.         gralloc_context_t *dev;  
  14.         dev = (gralloc_context_t*)malloc(sizeof(*dev));  
  15.   
  16.         /* initialize our state here */  
  17.         memset(dev, 0, sizeof(*dev));  
  18.   
  19.         /* initialize the procs */  
  20.         dev->device.common.tag = HARDWARE_DEVICE_TAG;  
  21.         dev->device.common.version = 0;  
  22.         dev->device.common.module = const_cast<hw_module_t*>(module);  
  23.         dev->device.common.close = gralloc_close;  
  24.   
  25.         dev->device.alloc   = gralloc_alloc;  
  26.         dev->device.free    = gralloc_free;  
  27.   
  28.         *device = &dev->device.common;  
  29.         status = 0;  
  30.     }   
  31.     ......  
  32.   
  33.     return status;  
  34. }  
 
        这个函数主要是用来创建一个gralloc_context_t结构体,并且对它的成员变量device进行初始化。结构体gralloc_context_t的成员变量device的类型为gralloc_device_t,它用来描述一个gralloc设备。前面提到,gralloc设备是用来分配和释放图形缓冲区的,这是通过调用它的成员函数alloc和free来实现的。从这里可以看出,函数gralloc_device_open所打开的gralloc设备的成员函数alloc和free分别被设置为Gralloc模块中的函数gralloc_alloc和gralloc_free,后面我们再详细分析它们的实现。
        至此,gralloc设备的打开过程就分析完成了,接下来我们继续分析fb设备的打开过程。




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967071,如需转载请自行联系原作者
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
1天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
5 0
|
1天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
6 0
|
JSON 缓存 Java
Android 序列化框架 Gson 原理分析,可以优化吗?
Gson 是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。在这篇文章里,我们将讨论 Gson 的基本用法和以及主要流程的源码分析。
227 0
|
Android开发 容器
Android VSYNC (Choreographer)与UI刷新原理分析
Android VSYNC (Choreographer)与UI刷新原理分析
392 0
Android VSYNC (Choreographer)与UI刷新原理分析
|
前端开发 Android开发
Android Surface Buffer尺寸逻辑分析
在AntGraphic实现canvas画布时需要支持动态修改画布buffer尺寸,刚开始以为网上有类似的资料,但查找一圈时并无收获,因此花时间研究了下Android平台的GraphicBuffer尺寸相关逻辑,记录如下一. BufferQueueCore中Buffer尺寸BufferQueueCore仅提供default尺寸,当Producer在未指定尺寸下申请buffer时,使用default尺
1065 0
|
监控 Java 编译器
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
219 0
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
|
ARouter Java API
【Android APT】编译时技术 ( ButterKnife 原理分析 )
【Android APT】编译时技术 ( ButterKnife 原理分析 )
242 0
|
安全 API Android开发
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
【Android 高性能音频】AAudio 音频流 数据回调细节 ( 数据回调函数优先级 | 数据回调函数 | 采样率 | 采样数 | 缓冲区调整 | 线程不安全 )
370 0
|
监控 Android开发 开发者
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
390 0
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
|
Android开发
【Android 高性能音频】AAudio 缓冲区控制 ( XRun | 欠载 UnderRun | 超限 OverRun | 获取缓冲区大小 | 设置缓冲区大小 )
【Android 高性能音频】AAudio 缓冲区控制 ( XRun | 欠载 UnderRun | 超限 OverRun | 获取缓冲区大小 | 设置缓冲区大小 )
658 0