【Android源码 栏目提醒】:本文主要为网学会员提供“android surfaceflinger研究----显示系统 - 电子设计”,希望对需要android surfaceflinger研究----显示系统 - 电子设计网友有所帮助,学习一下!
android surfaceflinger研究----显示系统 这周抽空研究了一下SurfaceFlinger发现真正复杂的并不是SurfaceFlinger本身而是android的display显示系统网上关于这部分的介绍有不少本不打算写的但是发现还是记录一下研究代码的过程比较好一是能够帮助自己理清思路另一个原因就是以后当这块内容忘记的时候能快速的通过这个记录捡起来。
一. android显示系统的建立 我们看SurfaceFlinger的定义就知道它其实是一个Thread 因此SurfaceFlinger的初始化工作就理所当然的放在了SurfaceFlinger线程中详见readyToRunSurfaceFlinger.cpp SurfaceFlinger对于显示的管理是通过一个或多个GraphicPlane对象目前android只实现了一个来管理的 SurfaceFlinger.h cpp view plaincopy 1. GraphicPlane mGraphicPlanes1 其实GraphicPlane类只是一个wrapper层目的是当android支持多个显示系统时通过该类来管里各自的图形系统显示系统真正的初始化工作是通过DisplayHardware类来初始化底层图形系统的管理与显示的。
真正的图形显示系统的初始化在initDisplayHardware.cpp 目前android支持一个图形系统这个图形系统是全局的surfaceflinger可以访问其他不通过surfaceflinger进行图形处理的application也可以对其进行操作。
1. FrameBuffer的建立 framebuffer确切的是说是linux下的framebuffer它是linux图形显示系统中一个与图形硬件无关的抽象层user完全不用考虑我们的硬件设备而仅仅使用framebuffer就可以实现对屏幕的操作。
android的framebuffer并没有被SurfaceFlinger直接使用而是在framebuffer外做了一层包装这个包装就是FramebufferNativeWindow我们来看一下FramebufferNativeWindow的创建过程。
我们的framebuffer是由一个设备符fbDev来表示的它是FramebufferNativeWindow的一个成员我们来分析一下对fbDev的处理过程。
1.1. fbDev设备符 1.1.1 gralloc library 在这之前先介绍一下gralloc library它的形态如grallocBOARDPLATFORM.so BOARDPLATFORM可以从属性ro.board.platform中获得这篇文章中我们以Qualcommmsmx7x30为例也就是gralloc.msm7x30.so中它的源路径在hardware/msm7k/libgralloc-qsd8k。
framebuffer的初始化需要通过HAL gralloc.msm7x30.so 来完成与底层硬件驱动的适配但是gralloc library并不是平台无关的不同的vendor可能会实现自己的gralloc library因此为了保证在创建framebuffer时能够平台无关android只能是动态的判断并使用当前的gralloc libraryandroid通过从gralloc library中再抽象出一个hw_module_t结构来供使用它为framebuffer的初始化提供了需要的gralloc.msm7x30.so业务。
因此通过这个hw_module_t结构我们就不需要知道当前系统使用的到底是哪个gralloc library。
按规定所有gralloc library中的这个结构体被命名为HAL_MODULE_INFO_SYMHMI。
当前分析的系统中HAL_MODULE_INFO_SYM在hardware/msm7k/libgralloc-qsd8k/galloc.cpp。
1.1.2 打开fbDev设备符 下面看如何打开 打开fbDev设备符。
通过HAL_MODULE_INFO_SYM提供的gralloc.msm7x30.so的接口我们调用到了fb_device_openhardware/msm7k/libgralloc-qsd8kframebuffer.cpp。
cpp view plaincopy 1. int fb_device_openhw_module_tconst moduleconstchar name 2. hw_device_t device 3. 4. int status -EINVAL 5. if strcmpname GRALLOC_HARDWARE_FB0 6. alloc_device_t gralloc_device 7. status gralloc_openmodule ampgralloc_device 8. 9. / initialize our state here / 10. fb_context_t dev fb_context_tmallocsizeofdev 11. memsetdev 0 sizeofdev 12. 13. / initialize the procs / 14. dev-gtdevice.common.tag HARDWARE_DEVICE_TAG 15. 16. private_module_t m private_module_tmodule 17. status mapFrameBufferm 18. 19. 在这个函数中主要为fbDev设备符指定一个fb_context_t实例并通过函数mapFrameBuffer对设备节点/dev/graphics/fb0进行操作操作的目的有 1.获得屏幕设备的信息并将屏幕信息保存在HAL_MODULE_INFO_SYM上面代码中的module中。
2. 向/dev/graphics/fb0请求page flip模式page flip模式需要至少2个屏幕大小的bufferpage flip模式在后面介绍。
目前android系统中设置为2个屏幕大小的buffer。
当然屏幕设备可能不支持page flip模式。
mapFrameBufferLockedhardware/msm7k/libgralloc-qsd8k/framebuffer.cpp cpp view plaincopy 1. / 2. Request NUM_BUFFERS screens at lest 2 for page flipping 3. / 4. info.yres_virtual info.yres NUM_BUFFERS 5. 6. 7. uint32_t flags PAGE_FLIP 8. if ioctlfd FBIOPUT_VSCREENINFO ampinfo -1 9. info.yres_virtual info.yres 10. flags amp PAGE_FLIP 11. LOGWquotFBIOPUT_VSCREENINFO failed page flipping not supportedquot 12. 3. 映射屏幕设备缓存区给fbDev设备符。
mapFrameBufferLockedhardware/msm7k/libgralloc-qsd8k/framebuffer.cpp cpp view plaincopy 1. / 2. map the framebuffer 3. / 4. 5. int err 6. size_t fbSize roundUpToPageSizefinfo.line_length info.yres_virtual 7. module-gtframebuffer new private_handle_tdupfd fbSize 8. private_handle_t::PRIV_FLAGS_USES_PMEM 9. 10. module-gtnumBuffers info.yres_virtual / info.yres 11. module-gtbufferMask 0 12. 13. void vaddr mmap0 fbSize PROT_READPROT_WRITE MAP_SHARED fd 0 14. if vaddr MAP_FAILED 15. LOGEquotError mapping the framebuffer squot strerrorerrno 16. return -errno 17. 18. module-gtframebuffer-gtbase intptr_tvaddr 19. memsetvaddr 0 fbSize 1.2 grDev设备符 在为framebuffer也就是FramebufferNativeWindow申请内存之前我们还要介绍一个概念就是grDev设备符。
它虽然也叫设备符但是它和具体的设备没有直接关系我们看它的类型就是知道了alloc_device_t没错grDev设备符就是为了FramebufferNativeWindow管理内存使用的。
为FramebufferNativeWindow提供了申请/释放内存的接口。
1.3 FramebufferNativeWindow内存管理 FramebufferNativeWindow维护了2个buffer cpp view plaincopy 1. spltNativeBuffergt buffers2 1.3.1 屏幕设备支持page filp模式 目前的android系统默认要求屏幕设备给系统映射2个屏幕大小的缓存区以便支持page flip模式如果屏幕设备支持page flip模式那么FramebufferNativeWindow中buffers将分别指向一个屏幕大小的屏幕设备缓存区。
cpp view plaincopy 1. // create a quotfakequot handles for it 2. intptr_t vaddr intptr_tm-gtframebuffer-gtbase 3. private_handle_t hnd new private_handle_tdupm-gtframebuffer-gtfd size 4. private_handle_t::PRIV_FLAGS_USES_PMEM 5. private_handle_t::PRIV_FLAGS_FRAMEBUFFER 6. 7. // find a free slot 8. for uint32_t i0 iltnumBuffers i 9. if bufferMask amp 1LUltlti 0 10. m-gtbufferMask 1LUltlti 11. break 12. 13. vaddr bufferSize 14. 15. 16. hnd-gtbase vaddr 17. hnd-gtoffset vaddr -
上一篇:
Android高级开发实战培训
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计