SurfaceFlinger->>HWC: 提交所有图层(Layer)
HWC->>DRM/KMS: 硬件合成(Overlay)或 GPU 合成
DRM/KMS->>LCD Driver: 配置显示控制器(CRTC/Encoder)
LCD Driver->>Display: 通过 MIPI-DSI/RGB 输出像素数据
详细步骤解析
步骤 1:图层收集与准备
SurfaceFlinger 从应用通过 BufferQueue 获取图层的图形缓冲区(GraphicBuffer)。
计算每个图层的属性(位置、透明度、变换矩阵等)。
步骤 2:合成策略决策(HWC 参与)
SurfaceFlinger 调用 HWC::validate(),询问 HWC 能否硬件合成每个图层:
支持硬件合成的图层:标记为 HWC2::Composition::Device(由显示控制器直接处理)。
需 GPU 合成的图层:标记为 HWC2::Composition::Client,由 SurfaceFlinger 通过 OpenGL ES/Vulkan 渲染到临时缓冲区。
步骤 3:合成执行
硬件合成路径(Overlay):
HWC 通过 DRM/KMS 驱动 配置显示控制器的 Overlay Plane:
将图层直接送入显示控制器的硬件叠加层(避免 GPU 参与)。
LCD 驱动 从显存(Framebuffer)或 Overlay 缓冲区读取像素数据,通过 MIPI-DSI/RGB 接口 输出到屏幕。
GPU 合成路径:
SurfaceFlinger 将 GPU 渲染的结果写入 Framebuffer。
DRM/KMS 驱动将该 Framebuffer 设置为 Primary Plane,由显示控制器扫描输出。
步骤 4:显示控制器(CRTC)与时序控制
DRM/KMS 驱动 负责:
配置 CRTC(显示控制器)的时序参数(VSync/HSync/像素时钟)。
通过 Mode Setting(drm_mode_setcrtc)绑定 Framebuffer 和显示管线。
LCD 驱动(如 MIPI-DSI 控制器):
将像素数据按协议(如 DSI 数据包)发送到屏幕。
处理屏幕初始化序列(通过 DSI 命令或 GPIO 控制)。
步骤 5:VSync 同步
HWC 监听 VSync 信号(来自硬件或软件模拟),确保帧在正确时机切换。
SurfaceFlinger 根据 VSync 调度下一帧合成。