系列文章请扫关注公众号!
Android Display Graphics系列文章-汇总
本文主要包括部分:
一、合成类型问题overview
二、合成类型决策原因分析
2.1 HWC dump 内容的解读
2.2 GPU合成的判定逻辑
2.3 Kernel HRT
三、BW能力导致的合成方式变化
四、Layer传输路径
一、合成类型问题overview
显示系统从SF开始往下至HWC->display driver做的大部分工作都是合成,合成完毕最终结果通过mipi显示在panel上。
合成需要根据场景图层的状况,系统硬件能力,以及系统执行状况来选择最佳的合成方式
实际问题中经常有针对合成方式和对比机不一样,合成方式改变相关的疑问,这篇文章将指导找出问题的原因
平台可用于合成的硬件: GPU (CLIENT)/ OverlayEngine (DEVICE)
什么时候会去合成:对SF/HWC都是同一个动作 validate
合成是由哪些代码逻辑决定的?
SurfaceFlinger -> HWComposer -> HRT(Kernel)
合成的决策过程大概是怎样的?从上到下依次介绍
1、SF
app或UI可以强制指定CLIENT合成,这部分一旦指定,即在SF中forceClientComposition, HWC和kernel都不可更改这个指定合成类型
如果没有特别指定,则SF会默认先设定所有Layer为DEVICE合成,然后通过HWC来query平台的能力,平台根据自身能力来决定接受哪些Layer为DEVICE合成,其他的视为超过平台能力,就会标记变成CLIENT合成
2、HWC
HWC是中间层,最终查询系统的能力是HWC向kernel发起的,这部分逻辑名称为HRT
在向下查询之前,HWC本身也会设定一些条件,在HAL层就检查Layer是否有一些不符合平台能力的属性,如有就直接标记为CLIENT
3、HRT(kernel)
HRT是最后一道关卡,如果Layer在以上过程都未被标记CLIENT,HRT是最后一道关卡,一些与平台真正的硬件能力强相关的查询,或需要实时查询系统能力的部分会在这里做最后的判定
二、合成类型决策原因分析
如何查看合成类型
通过 SF dump中的信息来查看,dump中分别有列出SF和HWC的Comp Type信息
adb shell dumpsys SurfaceFlinger > dumpsf.log
SF
HWC
SF的comp type和HWC的comp的第一列结果必须一致,如果有不一致那就是不正常,需要追究不一致的原因
SF (comp type)的代码来源:
高通Android13代码:
HWC (comp) 的代码来源
SF dump 推GPU合成的几种情况
如下是SF中直接相关的代码,包括但不完全限于如下几种:
1、cornerRadius ------ Layer软件圆角,可查看sfdump,这个值不为0表示有开软件圆角
2、HdrY410 ----- 如上代码,hdr的特殊格式
3、drawShadows ------ 阴影效果
4、blurRegions ------ 模糊效果
5、app/UI ------ 其他app/UI直接指定的强推
2.1 HWC dump 内容的解读
第一列
就是最终的合成结果,只有DEV/CLI 两种,请注意前一篇文章中有提过这里HWC dump类型和上面SF dump的必须一致,如果不一致一定是客制化造成的,需客户自查
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
》》》》》》》》》 文章详情,请关注公众号 》》》》》》》》》》
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
系列文章请扫关注公众号!
Android Display Graphics系列文章-汇总