Android HWC(Hardware Composer)

Android HWC(Hardware Composer) usesClientComposition usesDeviceComposition这两个标记是HWC 告诉 SurfaceFlinger这一帧画面到底该谁来合成usesClientComposition true需要 GPU 合成客户端合成SF 必须用 OpenGL 把图层先画到一张图上usesDeviceComposition true需要硬件合成设备/HWC 合成直接用 DRM Plane / 硬件 Overlay 叠加1.1state.usesClientComposition含义这一帧必须走 GPU 合成。1.1.1 什么时候会变成 true只要有任何一个图层无法用硬件 Plane 叠加HWC 就会把它设为 true。典型原因图层有旋转、大缩放有复杂混合模式、遮罩、裁剪图层数量超过硬件 Plane 数量DRM Plane 一般只有 3~4 个有特效、模糊、动画1.1.2 对 SurfaceFlinger 意味着什么SF 必须先把所有“不能硬件叠加”的图层用 GPU 合成一张大图→ 这张图叫Client Target→ 最后再交给 HWC 硬件输出1.2state.usesDeviceComposition含义这一帧可以也必须用硬件合成。只要有任何一个图层被 HWC 标记为setLayerCompositionType(LAYER_TYPE_DEVICE)那么这个标记就会变成 true。1.2.1 对 SurfaceFlinger 意味着什么这些图层完全不经过 GPU直接由显示硬件DRM Plane / Overlay叠加省电、不占 GPU、低延迟1.3 最关键的规则HWC 工作核心一帧画面里这两个标记可以同时为 true也就是一部分图层 →GPU 合成Client一部分图层 →硬件合成Device最后 HWC 把两部分合在一起输出到屏幕这就是 Android 显示系统最经典的混合合成模式。2 HWC 里的 layer**在 HWC 里layer 一个要显示的“图层”**就是SurfaceFlinger 传给 HWC 的、一个独立的画面单元。2.1 HWC 里layer 用最简单的话讲你手机屏幕上看到的每一块独立画面在 HWC 眼里都是一个layer微信界面 → 1 个 layer状态栏时间、电量→ 1 个 layer导航栏返回键→ 1 个 layer视频播放画面 → 1 个 layer壁纸 → 1 个 layerHWC 的工作就是管理一堆 layers决定谁用硬件叠加DEVICE谁用 GPU 合成CLIENT2.2 一个 layer 里面有什么HWC 里的一个 layer 包含显示一块画面需要的所有信息buffer真正的图像数据纹理/帧缓冲位置、大小(x, y, w, h)透明度(alpha)Z 序谁在上面谁在下面合成类型DEVICE硬件叠加CLIENTGPU 合成裁剪、旋转、缩放2.3 关键区分非常重要很多人搞混 3 个东西我一次性分清概念所在位置含义App SurfaceApp 里面应用画的窗口SurfaceFlinger LayerSF 里面SF 管理的窗口单元HWC LayerHWC 里面SF 传给 HWC、用于硬件合成的图层关系App Surface ↓ SF Layer ↓ HWC Layer 你问的这个HWC Layer 就是 SF 把窗口信息打包发给硬件合成器的最终格式。2.4 用 Linux DRM 类比HWC Layer DRM Plane 的“数据源”DRM Plane 硬件图层通道HWC Layer 要送到 Plane 上显示的内容HWC 做的事把一个个 layer 分配到一个个 DRM Plane2.4 最核心的作用HWC 为什么需要 layerHWC 不关心这是微信还是状态栏HWC 只看 layer这个 layer 能不能用硬件叠加这个 layer 要放在屏幕哪个位置这个 layer 要给 GPU 还是给硬件HWC 的整个工作就是处理一堆 layers。