作者: 李先静 xianjimli@gmail.com

希望对那些在开发高通MSM7XXX平台的朋友有很大的帮助

FrameBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI的更新是通过OpenGLES来做的。所以让人很难搞清GUI更新的整个流程,最近要准备一个讲稿,所以花了一些去研究,这里做点笔记供大家参考,源代码是基于高通平台的,这些代码在网上都可以下载。

FrameBuffer 的相关组件如下图所示:

图片贴不过来,请到原地址去查看http://www.linuxgraphics.cn/android/framebuffer_arch.html

  • SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。SurfaceFlinger本身比较重要而且比较复杂,以后专门写一篇吧。
  • DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。它加载FrameBuffer和Overlay插件,并初始化OpenGLES:
    mNativeWindow = new FramebufferNativeWindow();    framebuffer_device_t const * fbDev = mNativeWindow->getDevice();    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {       overlay_control_open(module, &mOverlayEngine);    }    surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);    eglMakeCurrent(display, surface, surface, context);
  • FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:
    1. queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
    2. dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。

这两个函数由eglSwapBuffers调过来,调到:

egl_window_surface_v2_t::swapBuffers:    nativeWindow->queueBuffer(nativeWindow, buffer);    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
  • msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:

OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:

    mNativeWindow = new FramebufferNativeWindow();    framebuffer_device_t const * fbDev = mNativeWindow->getDevice();    if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {       overlay_control_open(module, &mOverlayEngine);    }    surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL);    eglMakeCurrent(display, surface, surface, context);
  • FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:
    1. queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
    2. dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。

这两个函数由eglSwapBuffers调过来,调到:

egl_window_surface_v2_t::swapBuffers:    nativeWindow->queueBuffer(nativeWindow, buffer);    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
  • msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:

OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:

bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) {
ov.dst_rect.x = x;
ov.dst_rect.y = y;
ov.dst_rect.w = w;
ov.dst_rect.h = h;

ioctl(mFD, MSMFB_OVERLAY_SET, &ov);
}

OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:

bool OverlayDataChannel::queueBuffer(uint32_t offset) {mOvData.data.offset = offset;ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr))}
  • msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。

framebuffer只是/dev/graphic/fb0的包装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。

  • msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:
    1. copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。
    2. copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。
  • pmem
  1. misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。
  2. board-msm7x27.c定义了物理内存的缺省大小:
#define MSM_PMEM_MDP_SIZE   0x1B76000#define MSM_PMEM_ADSP_SIZE  0xB71000#define MSM_PMEM_AUDIO_SIZE 0x5B000#define MSM_FB_SIZE     0x177000#define MSM_GPU_PHYS_SIZE   SZ_2M#define PMEM_KERNEL_EBI1_SIZE   0x1C000

msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。

  • KGSL

Kernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。

  • msm_hw3dm

这个我在内核中没有找到相关代码。

  • msm_fb

msm_fb.c: framebuffer, overlay和blit的用户接口。

mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式:

mdp_refresh_screen: 定时更新。

mdp_dma_pan_update: 通过pan display主动更新。

mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。

更多相关文章

  1. Android(安卓)GreenDao使用总结(包括模型生成、增删改查、修改存
  2. Android(安卓)版本检测更新
  3. 乐博Android客户端发布
  4. Android(安卓)直接显示yuv数据 通过Awesomeplayer方式直接显示(三
  5. Android--设置软键盘的显示和隐藏
  6. 【转发】Android(安卓)Metro风格的Launcher开发系列第一篇
  7. 热更新-Android与Lua相互通信
  8. 常用Android开发组件之文本类组件
  9. Android(安卓)sdcard媒体文件更新(程序控制刷新MediaStore数据库)

随机推荐

  1. html5 canvas android bug
  2. Android入门教程(五)之------第一个Andro
  3. Android(安卓)简单快捷高效的屏幕适配
  4. 一、android集成百度地图(android百度地
  5. 第七章 ARM 反汇编基础(一)(Android(安卓)与
  6. Android导入项目时Android(安卓)jar包丢
  7. Android(安卓)studio安装配置常见问题及
  8. 一种基于Android智能手机的远程视频监控
  9. 浅析Android位置权限以及数组寻找索引的
  10. Android屏幕密度(Density)和分辨率的关系