android display 笔记(十一)surfaceflinger 如何将图层传到lcd驱动的呢?

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 调度下一帧合成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那天的烟花雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值