1.为什么需要hwcomposer(hwc)接口?

在Android1.5 cupcake以前,Android的显示接口就是framebuffer接口。显示内容被直接写到framebuffer里,再调pan display ioctl就可以了。Framebuffer驱动是一个标准的linux driver接口,为什么还要实现hwcomposer接口呢?
主要原因可能是很多芯片显示接口功能很强,如果只使用framebuffer接口就有点大材小用。既然显示硬件功能强,那就尽量发挥它的功能。用hwcomposer的另外一个优点是在加入Fence机制后,hwc有利于显示,渲染,应用几方进行同步。

2. hwc可以做什么?

先看一下下面的一幅图

这个视频播放器的工具条是透明的。仔细想一下,如果只是framebuffer的话,SurfaceFlinger得把视频播放内容和工具条做合成,计算。如果不借助GPU的话,这个CPU计算量还是比较大的。如果不透明,直接把工具条层所占视频层的对应buffer数据覆盖就可以了。但对于透明工具条,需要计算工具条和视频两层个合成结果。而且,很多视频输出是YUV格式,可能还需要同时进行YUV->RGB转化。CPU忙啊。
有了hwcomposer,这个问题就简单多了。应用把要显示的layers交给SurfaceFlinger,比如对于上面视频播放的例子,应用程序交给SF一层视频,一层工具条。SF不必去合成,直接把这些layers交给hwc,hwc就可以在自己能力范围内做好合成,再把合成好的结果拿去显示。也就是说合成由显示模块硬件完成。目前主流的SOC平台显示模块都支持多层显示。

hwc的加载流程

和gralloc模块一样,hwc也是以一个.so文件用dlopen方式被加载,它们的名字也很像,hwc的名字一般是hwcomposer.名字>.so存在于/system/lib/hw/路径下。

Hwc只会被SurfaceFlinger加载。这个也是合理的,因为只有SurfaceFlinger才能真正去向显示硬件接口进行render操作。SurfaceFlinger在init初始化函数里,调用” new HWComposer”产生一个hwc的对象。这里的HWComposer是Android里标准的hwc对象,不是平台相关的实现对象。在HWComposer的构造函数里,它调用HWComposer::loadHwcModule。真正的hwc .so文件加载就在这个函数里面。HWComposer::loadHwcModule先调用” hw_get_module(HWC_HARDWARE_MODULE_ID, &module)”加载.so文件,然后再调hwc_open_1,这个函数(hwc_open_1)会调用hw_module_methods_t::open函数,open函数就是平台相关了。这个加载过程跟gralloc非常相似,区别是gralloc既可以被SF加载,又会被应用加载,而hwcomposer只会被SF加载。正常情况hwcomposer只会被加载一次。

具体调用关系如下:

SurfaceFlinger main

flinger->init

SurfaceFlinger::init

new HWComposer

HWComposer::HWComposer

HWComposer::loadHwcModule

hw_get_module(HWC_HARDWARE_MODULE_ID, &module), hwc_open_1

4.hwcomposer模块的接口

hwc API接口是google定义好的,具体可以参见hardware/libhardware/include/hardware/hwcomposer.h.

里面的主要接口说明如下:

hwc_composer_device_1:: prepare

SF把要显示的layers放在** displays参数里,主要是有几层,每层的格式,以及layers的Fences fd。如果当前芯片平台显示硬件模块可以支持layer的格式,它把相应的layer设成HWC_OVERLAY,如果显示硬件不支持其中的某个layer的格式,就把相应的layer设成HWC_FRAMEBUFFER。

hwc_composer_device_1:: set

SF告诉hwc,把里面所有layers输出到显示屏上,overlay的layer由hwc来处理,framebuffer的layer由SF调gpu的合成来完成。这个函数相当于过去framebuffer接口里的pan display。

hwc_composer_device_1::eventControl

使能/禁止vsync

hwc_composer_device_1::blank/setPowerMode

老的hwc(1.3以前)用blank控制display on/off,最新的hwc里用setPowerMode。实现的功能差不多,但setPowerMode的参数更丰富,不像blank就0/1。
hwc_procs_t:: vsync

这个也算是最重要的接口函数之一。Android在4.1里加入了对vsync的支持,这是对Android显示流畅度最大的提高措施之一。每一帧显示完毕hwc都会调用这个接口告诉SF一帧显示完成了。这个函数一般由内核里显示驱动中断出发,经过sys, proc, ioctl, uevent 或其他文件系统接口来通知hwc,再由hwc回调到SF里。

hwc_procs_t::hotplug

只有支持外接热插拔显示硬件的平台才考虑这个接口。比如hdmi。如果是一个出了显示屏不带其它接口的硬件,则不必考虑它。

hwcomposer介绍相关推荐

  1. Android系统性能调优工具介绍

    经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评 ...

  2. RK3588 VOP-SPLIT分屏模式介绍

    RK3588 VOP-SPLIT分屏模式介绍 文章目录 RK3588 VOP-SPLIT分屏模式介绍 RK3588 VOP介绍 vop-split功能 vop-split软件配置 RK3588 VOP ...

  3. Android系统源码目录及功能介绍

    Android的移植按如下流程:     1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...

  4. android多媒体框架介绍(五)显示图形系统之SurfaceFlinger初步介绍

    前面介绍了比较直观的framebuffer模块(负责把有一个内存地址ADDR的内容显示到屏上),hwc模块(叠加器,负责把surfaceFlinger送来的各种输入layer叠加到显存上),接下来开始 ...

  5. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  6. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  7. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  8. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  9. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

最新文章

  1. hdu 3007【爬山算法】
  2. 深度学习100例-生成对抗网络(DCGAN)生成动漫人物 | 第20天
  3. 【网络安全】详细记录一道简单面试题的思路和方法
  4. 消息队列-ActiveMQ
  5. github迁移到gitee相关问题
  6. 2018-携程-春招题
  7. QT中三种构建菜单栏的方法
  8. UItabelView头部视图;
  9. 使用 fail2ban 防御 SSH 服务器的暴力破解
  10. 用Python实现简单的Web Server
  11. c 编程语言技术优点,十大编程语言优缺点对比
  12. 手机端APP接口拦截(抓包)-Charles
  13. Win7文件夹怎么加密
  14. 微信小程序对接蓝牙设备连接全过程
  15. HyperDAO跨链搭桥:启动万链自由交换时代
  16. 备份恢复Lesson 06.Performing Backups
  17. UEFI和Legacy是什么意思?
  18. html同时播放多个文件夹,ios – 如何同时播放多个音频文件
  19. 微型计算机认证部件,节能产品认证-微型计算机用开关电源
  20. 安装失败解决方法-针式PKM

热门文章

  1. Spark日志,及设置日志输出级别
  2. 「 科研经验 」思考“工程解决方案”的思维
  3. 内卷老员工之三级缓存和伪共享
  4. 概率论一:样本空间1
  5. 计算机维修要学英文吗,学计算机编程需要英文吗?
  6. 数据库优化八大通用绝招
  7. Python的wheel文件安装
  8. DDoS攻击流量检测方法
  9. 机器学习——支持向量机(SVM)之超平面、间隔与支持向量
  10. valist:解决变参问题