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

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

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:

queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。

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:

queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。

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的拉伸、旋转和合成等操作。它有两种实现方式:

copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。

copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。

pmem

misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。

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

android surfaceflinger 代码,Android 中的framebuffer和SurFaceFlinger的关系相关推荐

  1. android surfaceflinger 代码,Android P 图形显示系统(七) SurfaceFlinger合...

    SurfaceFlinger合成流程(二) SurfaceFlinger合成流程 MessageQueue中分发两个消息,一个INVALIDATE,一个REFRESH,SurfaceFlinger对这 ...

  2. android 共享代码,Android团队成员间的代码共享!(Git+Github版)

    原创,转载请说明出处. 一. 这篇文章要解决什么问题,能学习到什么? 在android团队的开发中,少不了与队员之间的合作.为了避免我们傻瓜式地复制粘贴对方的负责的那部分功能代码,我们可以用svn或者 ...

  3. 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...

  4. android gravity 代码,android:layout_gravity和android:gravity属性的区别

    android:gravity / android:layout_gravity区别: android:gravity 是设置该view类里面的内容相对于该view的位置,例如设置button里面的t ...

  5. android滴滴打车代码,Android 端滴滴打车接口的开发

    前两天做了一个对Android端'滴滴打车'的接口开发吧! 今天来做个简单的流程, 滴滴会提供这样一个接口, http://webapp.diditaxi.com.cn/? maptype=wgs&a ...

  6. android linearlayout 代码,Android如何从代码向另一个LinearLayout添加Linearlayout

    我在main.xml中有一个LinearLayout: android:layout_width="match_parent" android:layout_height=&quo ...

  7. 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...

    本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...

  8. android扔骰子代码,Android实现掷骰子效果

    本文实例为大家分享了android实现掷骰子效果的具体代码,供大家参考,具体内容如下 利用handler接受子线程的消息完成骰子点数的不断更替 演示 start:开始游戏 stop:停止游戏 reco ...

  9. android surfaceflinger 代码,android surfaceflinger测试程序

    frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp 是个好地方. 但是我的测试应用程序版本( 来自供应商的Eclair ) 过时了, ...

最新文章

  1. Educational Codeforces Round 39 B Weird Subtraction Process
  2. NYOJ 116 士兵杀敌(二)
  3. wxWidgets:wxAuiTabArt类用法
  4. 螺旋图形Linux,Canvas 螺旋线几何图形绘制
  5. c语言指针化简带分数,c语言带分数四则运算问题!!!要求被调函数,化简.
  6. 计算机网络模拟校园,计算机网络课程设计-模拟校园网组网实验
  7. 用OKR拆解法,做产品规划
  8. 【Maven】mvn install 本地jar 或者 项目 添加到maven仓库中
  9. 每个人都有自己的一套投资方法,你买基金的投资战略方法是什么?
  10. 测试UDP端口连通性
  11. 计算机二级office题库-操作题
  12. 国内多少所高校开始博士生采用申请招生的方法了?
  13. 每日一记:win10无法设置上网代理
  14. ppt模板网站哪个好
  15. 2018年俄罗斯世界杯之Java数据爬虫(二)
  16. 小米4c怎么添加语言怎么设置在哪个文件夹,小米4c怎么插卡 小米4c插卡方法【详细步骤】...
  17. codec2中的函数命名后缀vb nb sm
  18. 零点定理的奇妙应用:平分面积的直线
  19. CMWAP和CMNET的主要区别及穿透CMWAP限制原理
  20. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述

热门文章

  1. 面试被问 Go 的map[int64]int64 在 redis 会占多少空间...
  2. 使用jmap来生成堆转储快照
  3. 当你用浏览器打开一个链接的时候,计算机做了哪些工作
  4. dubbo 异步调用
  5. SpringMVC输入验证
  6. 京东金融以支付开启出海之旅,未来或拓展至消费金融
  7. 方法调用中的别名问题
  8. DELL服务器 技术交流QQ群
  9. U大师U盘装系统——原版XP系统安装(V1.2.0版)
  10. google code托管项目svn密码获取错误的解决办法