Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)
16lz
2021-01-23
3. fb设备的打开过程 在Gralloc模块中,fb设备的ID值定义为GRALLOC_HARDWARE_FB0。GRALLOC_HARDWARE_FB0是一个宏,定义在文件hardware/libhardware/include/hardware/gralloc.h中, 如下所示:
成员变量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设备,如下所示:
- #define GRALLOC_HARDWARE_FB0 "fb0"
- typedef struct framebuffer_device_t {
- struct hw_device_t common;
- /* flags describing some attributes of the framebuffer */
- const uint32_t flags;
- /* dimensions of the framebuffer in pixels */
- const uint32_t width;
- const uint32_t height;
- /* frambuffer stride in pixels */
- const int stride;
- /* framebuffer pixel format */
- const int format;
- /* resolution of the framebuffer's display panel in pixel per inch*/
- const float xdpi;
- const float ydpi;
- /* framebuffer's display panel refresh rate in frames per second */
- const float fps;
- /* min swap interval supported by this framebuffer */
- const int minSwapInterval;
- /* max swap interval supported by this framebuffer */
- const int maxSwapInterval;
- int reserved[8];
- int (*setSwapInterval)(struct framebuffer_device_t* window,
- int interval);
- int (*setUpdateRect)(struct framebuffer_device_t* window,
- int left, int top, int width, int height);
- int (*post)(struct framebuffer_device_t* dev, buffer_handle_t buffer);
- int (*compositionComplete)(struct framebuffer_device_t* dev);
- void* reserved_proc[8];
- } 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设备,如下所示:
- static inline int framebuffer_open(const struct hw_module_t* module,
- struct framebuffer_device_t** device) {
- return module->methods->open(module,
- GRALLOC_HARDWARE_FB0, (struct hw_device_t**)device);
- }
- int gralloc_device_open(const hw_module_t* module, const char* name,
- hw_device_t** device)
- {
- int status = -EINVAL;
- if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
- ......
- } else {
- status = fb_device_open(module, name, device);
- }
- return status;
- }
- struct fb_context_t {
- framebuffer_device_t device;
- };
- ......
- int fb_device_open(hw_module_t const* module, const char* name,
- hw_device_t** device)
- {
- int status = -EINVAL;
- if (!strcmp(name, GRALLOC_HARDWARE_FB0)) {
- alloc_device_t* gralloc_device;
- status = gralloc_open(module, &gralloc_device);
- if (status < 0)
- return status;
- /* initialize our state here */
- fb_context_t *dev = (fb_context_t*)malloc(sizeof(*dev));
- memset(dev, 0, sizeof(*dev));
- /* initialize the procs */
- dev->device.common.tag = HARDWARE_DEVICE_TAG;
- dev->device.common.version = 0;
- dev->device.common.module = const_cast
(module); - dev->device.common.close = fb_close;
- dev->device.setSwapInterval = fb_setSwapInterval;
- dev->device.post = fb_post;
- dev->device.setUpdateRect = 0;
- private_module_t* m = (private_module_t*)module;
- status = mapFrameBuffer(m);
- if (status >= 0) {
- int stride = m->finfo.line_length / (m->info.bits_per_pixel >> 3);
- int format = (m->info.bits_per_pixel == 32)
- ? HAL_PIXEL_FORMAT_RGBX_8888
- : HAL_PIXEL_FORMAT_RGB_565;
- #ifdef NO_32BPP
- format = HAL_PIXEL_FORMAT_RGB_565;
- #endif
- const_cast
(dev->device.flags) = 0; - const_cast
(dev->device.width) = m->info.xres; - const_cast
(dev->device.height) = m->info.yres; - const_cast<int&>(dev->device.stride) = stride;
- const_cast<int&>(dev->device.format) = format;
- const_cast<float&>(dev->device.xdpi) = m->xdpi;
- const_cast<float&>(dev->device.ydpi) = m->ydpi;
- const_cast<float&>(dev->device.fps) = m->fps;
- const_cast<int&>(dev->device.minSwapInterval) = 1;
- const_cast<int&>(dev->device.maxSwapInterval) = 1;
- *device = &dev->device.common;
- }
- }
- return status;
- }
更多相关文章
- Android 抽象回调函数以及接口回调更新UI
- Android 依赖注入函数库Roboguice(一)
- Android中关于外部存储的一些重要函数
- Android NDK开发——操作JNI函数以及复杂对象的传递
- Android 内部存储相关的函数(getCacheDir,getDir, getFileStreamP
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调
- 使用FlowDroid生成Android应用程序的函数调用图
- Android中关于内部存储的一些重要函数
- Android一些实用的函数