Android GUI系统之SurfaceFlinger

[转载] http://blog.csdn.net/uiop78uiop78/

目录

GUI显示系统之SurfaceFlinger---章节目录

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构造函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值