[转载] http://blog.csdn.net/uiop78uiop78/
目录
GUI系统之SurfaceFlinger(1)OpenGLES与EGL
GUI系统之SurfaceFlinger(2)Gralloc与Framebuffer
GUI系统之SurfaceFlinger(1)OpenGLES与EGL
图 11‑1 SurfaceFlinger与OpenGLES等模块关系
1、 Linux内核提供/dev/graphics/fb*或者/dev/fb* framebuffer显示驱动
2、Android的HAL层提供了Gralloc,分为fb和gralloc两个设备。
3、OpenGL ES是一个通用的函数库,需要被“本地化”----FramebufferNativeWindow等
4、 OpenGL或者OpenGL ES 更多的只是一个接口协议,实现上既可以采用软件,也能依托于硬件。
GUI系统之SurfaceFlinger(2)Gralloc与Framebuffer
1、framebuffer提供的设备文件节点是/dev/graphics/fb* ,/dev/fb*
2、Android中各子系统通常不会直接基于Linux驱动来实现,而是由HAL层间接引用底层架构--Gralloc
3、Gralloc模块实现源码位于
hardware/libhardware/modules/gralloc
├── Android.mk
├── framebuffer.cpp
├── gralloc.cpp
├── gralloc_priv.h
├── gr.h
└── mapper.cpp
Gralloc模块ID定义为:
#define GRALLOC_HARDWARE_MODULE_ID "gralloc"
定义HAL_MODULE_INFO_SYM:
static struct hw_module_methods_t gralloc_module_methods = {
open: gralloc_device_open
};
struct private_module_t HAL_MODULE_INFO_SYM = {
base: {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: GRALLOC_HARDWARE_MODULE_ID,
name: "Graphics Memory Allocator Module",
author: "The Android Open Source Project",
methods: &gralloc_module_methods
},
registerBuffer: gralloc_register_buffer,
unregisterBuffer: gralloc_unregister_buffer,
lock: gralloc_lock,
unlock: gralloc_unlock,
},
framebuffer: 0,
flags: 0,
numBuffers: 0,
bufferMask: 0,
lock: PTHREAD_MUTEX_INITIALIZER,
currentBuffer: 0,
};
<1> Gralloc的加载
Gralloc对应的模块是由FramebufferNativeWindow在构造时加载:
hw_get_module(GRALLOC_HARDWARE_MODULE_ID , &mModule);
hw_get_module会在下面路径搜索Gralloc对应的库:
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
<2> Gralloc提供的接口
gralloc_device_open @gralloc.cpp 根据设备名来判断是打开fb或者gralloc
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)) {
gralloc_context_t *dev;
dev = (gralloc_context_t*)malloc(sizeof(*dev));
/* initialize our state here */
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<hw_module_t*>(module);
dev->device.common.close = gralloc_close;
dev->device.alloc = gralloc_alloc;
dev->device.free = gralloc_free;
*device = &dev->device.common;
status = 0;
} else {
status = fb_device_open(module, name, device);
}
return status;
}
open接口可以帮助上层打开两个设备:
#defineGRALLOC_HARDWARE_FB0 "fb0"
#define GRALLOC_HARDWARE_GPU0 "gpu0"
fb0”就是主屏幕,gpu0负责图形缓冲区的分配和释放。这两个设备将由FramebufferNativeWindow中的fbDev和grDev成员变量来管理。
GUI系统之SurfaceFlinger(3)Android中的本地窗口FramebufferNativewindow
Android 中的本地窗口----FramebufferNativeWindow
首先,EGL创建一个Window Surface的函数原型:
EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config,
NativeWindowType window, const EGLint *attrib_list);
不论是哪一种本地窗口都必须是NativeWindowType类型,由于OpenGL ES并不是只针对某一个操作系统平台设计,不同的操作系统平台下EGLNativeWindowType所对应的具体数据类型:比如Android中就指的是ANativeWindow指针
typedef EGLNativeWindowType NativeWindowType;
typedef HWND EGLNativeWindowType;//win32\wince
typedef void * EGLNativeWindowType;//symbian
typedef struct ANativeWindow* EGLNativeWindowType;//android
typedef Window EGLNativeWindowType //unix
(1) FramebufferNativeWindow构造函数