Android HWC

引用:https://www.jianshu.com/p/944d2fb9cead 

HWC是Android中进行窗口layer合成和显示的HAL层模块。HWC通常由显示设备制造商(OEM)完成,为SF服务提供硬件支持。

重要笔记:

1.surfaceflinger向HWC提供所有layer的完整列表,让HWC根据其硬件能力,决定如何处理这些layer。

2.HWC会为每个layer标注合成方式,是通过GPU合成还是通过HWC合成。

3.SurfaceFlinger负责把所有标注GPU合成的layer合成到一个输出buffer(可以使用OpenGL ES合成layer),然后把这个输出buffer和其他标注HWC合成的layer一起交给HWC,让HWC完成剩余layer的合成和显示。

 

HWC layer的合成方式:

// 显示屏类型
enum class DisplayType : int32_t {
    Invalid = HWC2_DISPLAY_TYPE_INVALID,
    // 物理显示屏,显示设备有一个主屏幕,然后可以通过热插拔添加或者删除外接显示屏
    Physical = HWC2_DISPLAY_TYPE_PHYSICAL,
    // 虚拟显示屏,内容会渲染到离屏缓冲区,Android录屏功能就是基于虚拟屏实现的
    Virtual = HWC2_DISPLAY_TYPE_VIRTUAL,
};

// Layer合成类型,HWC2_COMPOSITION_XX取自hwc2_composition_t枚举
enum class Composition : int32_t {
    Invalid = HWC2_COMPOSITION_INVALID,
    Client = HWC2_COMPOSITION_CLIENT,
    Device = HWC2_COMPOSITION_DEVICE,
    SolidColor = HWC2_COMPOSITION_SOLID_COLOR,
    Cursor = HWC2_COMPOSITION_CURSOR,
    Sideband = HWC2_COMPOSITION_SIDEBAND,
};

1.Client:这里的client是相对于HWC硬件设备来说的,即不通过HWC来合成图层,而是通过GPU先把所有的这类图层合成到client target buffer(一个离屏的图形缓冲区,buffer_handle_t表示这块显存的指针,显存有Gralloc模块分配),
然后再通过Display::setClientTarget把这块图形buffer的地址传递给HWC设备,最后由HWC设备把其他layer和这个图形buffer进一步合成,并最终展示在display上。
2.Device:通过HWC硬件来合成图层,默认情况下,SurfaceFlinger会配置每个layer都通过Device方式合成,但是HWC设备会根据硬件设备的性能改变某些图层的合成方式。
3.SolidColor:HWC设备将通过Layer::setColor设置的颜色渲染这个图层,如果HWC设备不支持这种合成方式,那么会请求SurfaceFlinger改变合成方式为client。
4.Cursor:与Device类似,但是这个图层的位置可以通过setCursorPosition异步设置。如果HWC设备不支持这种合成方式,那么将会请求SurfaceFlinger改变合成方式为client或者device。
5.Sideband:
HWC2_CAPABILITY_SIDEBAND_STREAM
SurfaceFlinger
折叠 
一个layer的合成方式的大致流程如下所示:

0110f00a7c7e4bc7b6c8d43a3bb77548.png

 

1.当Vsync信号到来时,SurfaceFlinger被唤醒,处理layer的新建,销毁和更新,并且为相应layer设置期望的合成方式。

2.所有layer更新后,SurfaceFlinger调用validateDisplay,让HWC决定每个layer的合成方式。

3.SurfaceFlinger调用getChangedCompositionTypes检查HWC是否对任何layer的合成方式做出了改变,若是,那么SurfaceFlinger则调整对应layer的合成方式,并且调用acceptDisplayChanges通知HWC。

4.SurfaceFlinger把所有client类型的layer合成到Target图形缓冲区,然后调用setClientTarget把Target Buffer设置给HWC。(如果没有Client类型的layer,则可以跳过该方法)

5.最后,SurfaceFlinger调用presentDisplay,让HWC完成剩余layer的合成,并且在显示屏上展示最终的合成结果。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值