Android中的FrameBuffer

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog 
作者联系方式:李先静 <xianjimli@gmail.com>

 

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

FrameBuffer相关的组件
fb 
1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。SurfaceFlinger本身比较重要而且比较复杂,以后专门写一篇吧。

2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。它加载FrameBuffer和Overlay插件,并初始化OpenGLES:

  1.     mNativeWindow <span style="color: #339933;">=</span>  
  2.  new FramebufferNativeWindow<span style="color: #009900;">(</span>  
  3. <span style="color: #009900;">)</span>  
  4. <span style="color: #339933;">;</span>  
  5.   
  6.     framebuffer_device_t <span style="color: #993333;">const</span>  
  7.  <span style="color: #339933;">*</span>  
  8.  fbDev <span style="color: #339933;">=</span>  
  9.  mNativeWindow<span style="color: #339933;">-></span>  
  10. getDevice<span style="color: #009900;">(</span>  
  11. <span style="color: #009900;">)</span>  
  12. <span style="color: #339933;">;</span>  
  13.   
  14.     <span style="color: #b1b100;">if</span>  
  15.  <span style="color: #009900;">(</span>  
  16. hw_get_module<span style="color: #009900;">(</span>  
  17. OVERLAY_HARDWARE_MODULE_ID<span style="color: #339933;">,</span>  
  18.  <span style="color: #339933;">&</span>  
  19. module<span style="color: #009900;">)</span>  
  20.  <span style="color: #339933;">==</span>  
  21.  <span style="color: #0000dd;">0</span>  
  22. <span style="color: #009900;">)</span>  
  23.  <span style="color: #009900;">{</span>  
  24.   
  25.        overlay_control_open<span style="color: #009900;">(</span>  
  26. module<span style="color: #339933;">,</span>  
  27.  <span style="color: #339933;">&</span>  
  28. mOverlayEngine<span style="color: #009900;">)</span>  
  29. <span style="color: #339933;">;</span>  
  30.   
  31.     <span style="color: #009900;">}</span>  
  32.   
  33.     surface <span style="color: #339933;">=</span>  
  34.  eglCreateWindowSurface<span style="color: #009900;">(</span>  
  35. display<span style="color: #339933;">,</span>  
  36.  config<span style="color: #339933;">,</span>  
  37.  mNativeWindow.<span style="color: #202020;">get</span>  
  38. <span style="color: #009900;">(</span>  
  39. <span style="color: #009900;">)</span>  
  40. <span style="color: #339933;">,</span>  
  41.  NULL<span style="color: #009900;">)</span>  
  42. <span style="color: #339933;">;</span>  
  43.   
  44.     eglMakeCurrent<span style="color: #009900;">(</span>  
  45. display<span style="color: #339933;">,</span>  
  46.  surface<span style="color: #339933;">,</span>  
  47.  surface<span style="color: #339933;">,</span>  
  48.  context<span style="color: #009900;">)</span>  
  49. <span style="color: #339933;">;</span>  

3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:

queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。

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

  1. egl_window_surface_v2_t<span style="color: #339933;">::</span>  
  2. <span style="color: #202020;">swapBuffers</span>  
  3. :  
  4.     nativeWindow<span style="color: #339933;">-></span>  
  5. queueBuffer<span style="color: #009900;">(</span>  
  6. nativeWindow<span style="color: #339933;">,</span>  
  7.  buffer<span style="color: #009900;">)</span>  
  8. <span style="color: #339933;">;</span>  
  9.   
  10.     nativeWindow<span style="color: #339933;">-></span>  
  11. dequeueBuffer<span style="color: #009900;">(</span>  
  12. nativeWindow<span style="color: #339933;">,</span>  
  13.  <span style="color: #339933;">&</span>  
  14. buffer<span style="color: #009900;">)</span>  
  15. <span style="color: #339933;">;</span>  

4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:

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

  1. bool OverlayControlChannel<span style="color: #339933;">::</span>  
  2. <span style="color: #202020;">setPosition</span>  
  3. <span style="color: #009900;">(</span>  
  4. <span style="color: #993333;">int</span>  
  5.  x<span style="color: #339933;">,</span>  
  6.  <span style="color: #993333;">int</span>  
  7.  y<span style="color: #339933;">,</span>  
  8.  uint32_t w<span style="color: #339933;">,</span>  
  9.  uint32_t h<span style="color: #009900;">)</span>  
  10.  <span style="color: #009900;">{</span>  
  11.   
  12.     ov.<span style="color: #202020;">dst_rect</span>  
  13. .<span style="color: #202020;">x</span>  
  14.  <span style="color: #339933;">=</span>  
  15.  x<span style="color: #339933;">;</span>  
  16.   
  17.     ov.<span style="color: #202020;">dst_rect</span>  
  18. .<span style="color: #202020;">y</span>  
  19.  <span style="color: #339933;">=</span>  
  20.  y<span style="color: #339933;">;</span>  
  21.   
  22.     ov.<span style="color: #202020;">dst_rect</span>  
  23. .<span style="color: #202020;">w</span>  
  24.  <span style="color: #339933;">=</span>  
  25.  w<span style="color: #339933;">;</span>  
  26.   
  27.     ov.<span style="color: #202020;">dst_rect</span>  
  28. .<span style="color: #202020;">h</span>  
  29.  <span style="color: #339933;">=</span>  
  30.  h<span style="color: #339933;">;</span>  
  31.   
  32.    
  33.     ioctl<span style="color: #009900;">(</span>  
  34. mFD<span style="color: #339933;">,</span>  
  35.  MSMFB_OVERLAY_SET<span style="color: #339933;">,</span>  
  36.  <span style="color: #339933;">&</span>  
  37. ov<span style="color: #009900;">)</span>  
  38. <span style="color: #339933;">;</span>  
  39.   
  40. <span style="color: #009900;">}</span>  

OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:
bool OverlayDataChannel::queueBuffer(uint32_t offset) {

  1. mOvData.<span style="color: #202020;">data</span>  
  2. .<span style="color: #202020;">offset</span>  
  3.  <span style="color: #339933;">=</span>  
  4.  offset<span style="color: #339933;">;</span>  
  5.      
  6.    
  7. ioctl<span style="color: #009900;">(</span>  
  8. mFD<span style="color: #339933;">,</span>  
  9.  MSMFB_OVERLAY_PLAY<span style="color: #339933;">,</span>  
  10.  odPtr<span style="color: #009900;">)</span>  
  11. <span style="color: #009900;">)</span>  
  12.   
  13. <span style="color: #009900;">}</span>  

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

6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:
copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。
copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。

7.pmem
misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。
board-msm7x27.c定义了物理内存的缺省大小:

  1. <span style="color: #339933;">#define MSM_PMEM_MDP_SIZE   0x1B76000</span>  
  2.   
  3. <span style="color: #339933;">#define MSM_PMEM_ADSP_SIZE  0xB71000</span>  
  4.   
  5. <span style="color: #339933;">#define MSM_PMEM_AUDIO_SIZE 0x5B000</span>  
  6.   
  7. <span style="color: #339933;">#define MSM_FB_SIZE     0x177000</span>  
  8.   
  9. <span style="color: #339933;">#define MSM_GPU_PHYS_SIZE   SZ_2M</span>  
  10.   
  11. <span style="color: #339933;">#define PMEM_KERNEL_EBI1_SIZE   0x1C000</span>  

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

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

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

10.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性能优化学习笔记 1.UI性能优化 过度渲染(overdraw) 一个视图中,视图层级越多,过度渲染就越严重。就是说一个像素点上,如果存在10个view层级,如果每个层级在onDraw中都会绘制,那么这个像素点将会被渲染十次。 在Android4.4及以上版本中,如果某个View完全被其他视图遮挡住了,那么就不会渲染这个view,这种技术叫Overdraw Avoidance。 检测视图渲染可以使用开发者选... 阅读详情

相关推荐

Android surfaceflinger学习笔记之framebuffer管理

最近由于工作的Android surfaceflinger

Plato_F的专栏 2205

Android帧缓冲区(FrameBuffer)硬件抽象层(HAL)

前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的。Android系统在硬件抽象层中提供了一个Gralloc模块,封装了对帧缓冲区的所有访问操作。本文将详细分析Gralloc模块的实现,为后续分析SurfaceFlinger服务的实现打下基础。在前面Android系统的开机画面显示过程分析一文中提到,Linux内核在启动的过程中会创建一个类别和名称分别为“graphics”和“fb0”的设备,用来描述系统中的第一个帧缓冲区,即第一个显示屏,

深入Android FrameBuffer截图技术

在当今数字化时代,截屏功能已成为智能手机和应用程序中不可或缺的一部分,为用户提供了便捷的分享和记录信息的方式。Android作为全球最受欢迎的移动操作系统之一,其截屏功能的实现途径多种多样,从简单的按键操作到复杂的程序接口调用,各有其独特的应用场景和实现机制。截屏不仅仅是一个简单的功能,它背后的实现技术涉及到了Android系统架构的多个层面。这包括但不限于Linux内核中的FrameBuffer操作、Android图形系统的处理以及用户界面层的交互设计。

weixin_42452483的博客 1020

android 下读取framebuffer的内容

android下读取framebuffer的内容 程序运行就会把framebuffer的内容保存在/sdcard/123.raw下面, 要想打开还需要在文件上插入如bitmap的文件头即可

android多媒体框架介绍(三)显示图形系统之framebuffer

FrameBuffer是linux提供的显存驱动,在android环境设备节点是/dev/graphics/fb*(支持多个屏幕显示,第一个fb0是主显示屏幕,在linux下一般是/dev/fb*)。FrameBuffer的目的就是通过对硬件的封装抽象,让上层通过设备节点文件的方式,操作硬件去显示某个内存的内容。 文章目录一、framebuffer模块定义与规格场景分析模块定义:fb的本质就是把 指定内存 的 内容显示到屏上framebuffer常见的设计规格二、framebuffer主要流程与原理分析1、

runafterhit的博客 4960

Android Framebuffer介绍及使用

作者: Aaron 主页: http://www.wxtlife.com/2017/06/07/Android-framebuffer/ 欢迎订阅我的公众号 FrameBuffer 介绍FrameBuffer中文译名为帧缓冲驱动,它是出现在2.2.xx内核中的一种驱动程序接口。主设备号为29,次设备号递增。 Linux抽象出FrameBuffer这个设备来供用户态进程实现直接

技术特工队 4700

Android12之DRM架构(一)

本篇目的:理解DRM架构。

Android系统攻城狮 3087

Android 中的 framebuffer

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

martin的专栏 669

安卓linux frambuffer,Android原生(Native)C开发之二:framebuffer

虽然现在能通过交叉环境编译程序,并push到Android上执行,但那只是console台程序,是不是有些单调呢?下面就要看如何通过Linux的framebuffer技术在Android上画图形,关于Linux的framebuffer技术,这里就不再详细讲解了,请大家google一下。操作framebuffer的主要步骤如下:1、打开一个可用的FrameBuffer设备;2、通过mmap调用把...

weixin_39842937的博客 251

Android操作framebuffer[zz]

如对Android原生(Natvie)C开发还任何疑问,请参阅《Android原生(Native)C开发之一:环境搭建篇》:http://blog.sina.com.cn/s/blog_4a0a39c30100auh9.html   虽然现在能通过交叉环境编译程序,并push到Android上执行,但那只是console台程序,是不是有些单调呢?下面就要看如何通过Linux的 framebuf

neiloid的专栏 2267

Android framebuffer

<br /> <br />关于AndroidFramebuffer使用简介 <br /> <br /> <br /> <br />来自:http://www.mask.org.tw/blog/2010/06/android-framebuffer-lcd/<br /> <br />问题:执行Android却看不到LCD的显示画面<br />原因:Android需要Double Framebuffer<br />解决方法:修改Framebuffer driver以获得2倍Framebuffer的内存空间。<

devehe的山寨 3048

android屏幕framebuffer绘图

refer: http://blog.sina.com.cn/s/blog_64b54bce0100lmxz.html           http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0403/1113.html 1.Android屏幕Framebuffer绘图机制

lxl584685501的专栏 5154

android下操作FrameBuffer

android下操作FrameBuffer 一、framebuffer使用基础: 1. Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏, Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。对于用户而言,framebuffer和/dev下面的其他设备没有 什么区别,用户可以把framebuffer 看成

martin的专栏 1325

Android P图形架构之FrameBuffer测试Demo

Android FrameBuffer测试记录。 参考资料: https://android.googlesource.com/platform/system/extras/+/donut-release/tests/framebuffer/fb_test.c 源码: framebuffer_test.c #include <unistd.h> #include <stdio...

Sunxiaolin2016的博客 1484
上一篇: Android GUI更新过程
下一篇: Micron sensor 驱动与调试小结
tigerly
博客等级 码龄18年 31粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值