Android GDI之屏幕设备管理-动态链接库
  万丈高楼从地起,从最根源的硬件帧缓冲区开始。我们知道显示FrameBuffer在系统中就是一段内存,GDI的工作就是把需要输出的内容放入到该段内存的某个位置。我们从基本的点(像素点)和基本的缓冲区操作开始。
  1 基本知识1.1点的格式
  对于不同的LCD来讲,FrameBuffer的二进制格式不一样,并且可以分为两部分:
  1)点的格式:通常将Depth,即表示多少位表示一个点。
  1位表示一个点
  2位表示一个点
  16位表示一个点
  32位表示一个点(Alpha通道)
  2) 点内格式:RGB分量分布表示。
  例如对于我们常见的16位表示一个点
                     

123.jpg (10.19 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:58 上传

 

  1.2.格式之间的转换
  所以屏幕输出实际上是一个值映射的关系。我们可以有如下的点格式转换,
                 

321.jpg (20.95 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:58 上传

 

  源格式可能来自单色位图和彩色位图,对于具体的目标机来讲,我们的目标格式可能就是一种,例如16位(5/6/5)格式。其实就只存在一种格式的转换,即从目标格式都是16位格式。
                        

456.jpg (8.08 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:59 上传

 

  但是,在设计GDI时,基本要求有一个可移植性好,所以我们还是必须考虑对于不同点格式LCD之间的转换操作。所以在GDI的驱动程序中涉及到如下几类主要操作:
  区域操作(Blit):我们在显示缓冲区上做的最多的操作就是区块搬运。由此,很多的应用处理器使用了硬件图形加速器来完成区域搬运:blit.从我们的主要操作的对象来看,可以分为两个方向:
  1)内存区域到屏幕区域
  2)屏幕区域到屏幕区域
  3)屏幕区域到内存区域
  4)内存区域到内存区域
  在这里我们需要特别提出的是,由于在Linux不同进程之间的内存不能自由的访问,使得我们的每个Android应用对于内存区域和屏幕缓冲区的使用变得很复杂。在Android的设计中,在屏幕缓冲区和显示内存缓冲区的管理分类很多的层次,最上层的对象是可以在进程间自由传递,但是对于缓冲区内容则使用共享内存的机制。
  基于以上的基础知识,我们可以知道:
  (1)代码中Config及其Format的意义所在了。也就理解了兼容性的意义:采用同硬件相同的点的描述对象
  (2)所有屏幕上图形的移动都是显示缓冲区搬运的结果。
  1。2图形加速器
  应用处理器都可能带有图形加速器,对于不同的应用处理器对其图形加速器可能有不同的处理方式,对于2D加速来讲,都可归结为Blit。多为数据的搬运,放大缩小,旋转等。
  2 Android的缓冲区抽象定义
  不同的硬件有不同的硬件图形加速设备和缓冲内存实现方法。Android Gralloc动态库抽象的任务就是消除不同的设备之间的差别,在上层看来都是同样的方法和对象。在Moudle层隐藏缓冲区操作细节。Android使用了动态链接库gralloc.xxx.so,来完成底层细节的封装。
  2。1 本地定义@hardware/libhandware/modules/gralloc
  每个动态链接库都是用相同名称的调用接口:
  1)硬件图形加速器的抽象:BlitEngine,CopyBit的加速操作。
  2)硬件FrameBuffer内存管理
  3)共享缓存管理
  从数据关系上我们来考察动态链接库的抽象行为:在层次:Hardware。c@hardware/libhardware中对动态链接库中的内容作了全新的包装。/system/lib/hw/gralloc.xxx.so动态库文件。从文件Gralloc.h(handware/libhardware/include/hardware)是抽象的结果:hw_get_module从gralloc.xxx.so提取了HAL_MODULE_INFO_SYM(SYM变量)
                     

654.jpg (17.01 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:00 上传

 

  从展露在外部的数据结构,我们在@Gralloc.cpp看到到了这样的布局:
  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,
  …
  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,
  …
  };
  我们建立了什么对象来支撑缓冲区的操作?
  buffer_handle_t:外部接口。
  methods.open,registerBuffer,unregisterBuffer,lock,unlock
  下面是外部接口和内部对象的结构关系,该类型的结构充分利用C Struct的数据排列特性:基本结构体放置在最前面,本地私有放置在后面,满足了抽象的需要。
  typedef const native_handle* buffer_handle_t;
  private_module_t  HAL_MODULE_INFO_SYM 向往暴露的动态链接库接口,通过该接口,我们直接可以使用该对象。
                  

789.jpg (237.31 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:01 上传

 

  看不清楚上面图,可以偏一下头横着看:
                  

987.jpg (47.93 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:02 上传

 

  几个接口函数的解释:
  (1)fb_post
  对于帧缓冲区实际地址并不需要向上层报告,所有的操作都是通过fb_post了完成。
  fp_post的任务就是将一个Buffer的内容传递到硬件缓冲区。其实现方式有两种:
                  

147.jpg (4.03 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:02 上传

 

  (方式1)无需拷贝动作,是把Framebuffer的后buffer切为前buffer,然后通过IOCTRL机制告诉FB驱动切换DMA源地地址。这个实现方式的前提是Linux内核必须分配至少两个缓冲区大小的物理内存和实现切换的ioctrol,这个实现快速切换。
  (方式2)利用Copy的方式。不修改内核,则在适配层利用从拷贝的方式进行,但是这个是费时了。
  (2)gralloc的主要功能是要完成:
  1)打开屏幕设备 "/dev/fb0",,并映射硬件显示缓冲区。
  2)提供分配共享显示缓存的接口
  3)提供BiltEngine接口(完成硬件加速器的包装)
  (3)gralloc_alloc输出buffer_handle_t句柄。
  这个句柄是共享的基本依据,其基本原理在后面的章节有详细描述。
  3 总结
  总结一下,/system/lib/hw/gralloc.xxx.so是跟硬件体系相关的一个动态链接库,也可以叫做Android的硬件抽象层。他实现了Android的硬件抽象接口标准,提供显示内存的分配机制和CopyBit等的加速实现。而如何具体实现这些功能,则跟硬件平台的配备有关系,所以我们看到了对于与不同的硬件架构,有不同的配置关系。

Android核心分析之二十四Android GDI之显示缓冲管理的更多相关文章

  1. Android核心分析之二十八Android GDI之Surface&Canvas

    Surface&Canvas Canvas为在画布的意思.Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装.drawPaints ,drawPoi ...

  2. Android核心分析之二十六Android GDI之SurfaceFlinger

    Android GDI之SurfaceFlinger SurfaceFinger按英文翻译过来就是Surface投递者.SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构.Sufac ...

  3. Android核心分析之二十五Android GDI之共享缓冲区机制

    Androird GDI之共享缓冲区机制 1  native_handle_t对private_handle_t 的包裹     private_handle_t是gralloc.so使用的本地缓冲区 ...

  4. Android核心分析之二十二Android应用框架之Activity

    3 Activity设计框架 3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...

  5. Android核心分析之二十Android应用程序框架之无边界设计意图

    Android应用程序框架1 无边界设计理念 Android的应用框架的外特性空间的描述在SDK文档(http://androidappdocs.appspot.com/guide/topics/fu ...

  6. VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机

    VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...

  7. Android核心分析之二十一Android应用框架之AndroidApplication

    Android Application Android提供给开发程序员的概念空间中Application只是一个松散的表征概念,没有多少实质上的表征.在Android实际空间中看不到实际意义上的应用程 ...

  8. Android学习路线(二十四)ActionBar Fragment运用最佳实践

    转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...

  9. Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

    前言: 关于.jar文件: 平时我们Android项目开发中经常会用到第三方的.jar文件. 其实.jar文件就是一个类似.zip文件的压缩包,里面包含了一些源代码,注意的是.jar不包含资源文件(r ...

随机推荐

  1. 一:java概述:

    1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名为Java: Java的三种技术 ...

  2. 网络笔记02数据解析 -1-JSON解析

    1.JSON解析 1.JSON介绍 JSON是最网络传输数据最为广泛的数据格式,没有之一,出身草根,是Javascript的子集,专门负责描述数据格式.Javascript是网页开发的一种脚本语言,和 ...

  3. C#新语法特性前瞻

    今天逛微软的UserVoice site发现了几个有很有用,也很可能被添加到新版C#中的语法,当然也可能被推迟到下一版,拿出来给大家分享一下. 另外还没投票的可以去为自己最想要的新特性投票,有兴趣的可 ...

  4. 怎么将java项目打包成双击就可以运行的jar包---fatjar

    fatjar下载地址:http://pan.baidu.com/s/1cQ01o 下载fatJar插件,解压缩后是一个.../plugins/(net...)把plugins下面的(net..)文件夹 ...

  5. Linux嵌入式系统与硬件平台的关系

    一. Linux嵌入式系统 操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口.它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合 ...

  6. 【BZOJ】【1044】【HAOI2008】木棍分割

    二分/DP 真是一道好题! 第一问很简单的二分…… 第二问一开始我想成贪心了,其实应该是DP的= = 然后没有注意……又MLE又TLE的……这题要对DP进行时空两方面的优化!! 题解:(by JoeF ...

  7. 【BZOJ】【1037】【ZJOI2008】生日聚会party

    DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...

  8. 剑指offer--7题

    *题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. *句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. *例如输入“I am a student.”,则输出“st ...

  9. while小问题

    while(!m_SMque.pop(data)); 看到这个有点忘了,如果pop返回false会一直执行pop,其实这个执行的是空语句,而while每次执行都需要判断条件,所以如果pop返回fals ...

  10. 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014

    Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/ 简译 translation: 作者在2012年写 ...