hwcomposer介绍
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介绍相关推荐
- Android系统性能调优工具介绍
经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评 ...
- RK3588 VOP-SPLIT分屏模式介绍
RK3588 VOP-SPLIT分屏模式介绍 文章目录 RK3588 VOP-SPLIT分屏模式介绍 RK3588 VOP介绍 vop-split功能 vop-split软件配置 RK3588 VOP ...
- Android系统源码目录及功能介绍
Android的移植按如下流程: 1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. 2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...
- android多媒体框架介绍(五)显示图形系统之SurfaceFlinger初步介绍
前面介绍了比较直观的framebuffer模块(负责把有一个内存地址ADDR的内容显示到屏上),hwc模块(叠加器,负责把surfaceFlinger送来的各种输入layer叠加到显存上),接下来开始 ...
- 简单介绍互联网领域选择与营销方法
在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...
- 常用开源协议介绍以及开源软件规范列表
1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...
- python:Json模块dumps、loads、dump、load介绍
20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...
- pytorch学习笔记(九):PyTorch结构介绍
PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...
- Python字节码介绍
了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...
最新文章
- hdu 3007【爬山算法】
- 深度学习100例-生成对抗网络(DCGAN)生成动漫人物 | 第20天
- 【网络安全】详细记录一道简单面试题的思路和方法
- 消息队列-ActiveMQ
- github迁移到gitee相关问题
- 2018-携程-春招题
- QT中三种构建菜单栏的方法
- UItabelView头部视图;
- 使用 fail2ban 防御 SSH 服务器的暴力破解
- 用Python实现简单的Web Server
- c 编程语言技术优点,十大编程语言优缺点对比
- 手机端APP接口拦截(抓包)-Charles
- Win7文件夹怎么加密
- 微信小程序对接蓝牙设备连接全过程
- HyperDAO跨链搭桥:启动万链自由交换时代
- 备份恢复Lesson 06.Performing Backups
- UEFI和Legacy是什么意思?
- html同时播放多个文件夹,ios – 如何同时播放多个音频文件
- 微型计算机认证部件,节能产品认证-微型计算机用开关电源
- 安装失败解决方法-针式PKM