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

相关推荐
KhalilRuan44 分钟前
秋招笔记-8.4
笔记
星辰云-1 小时前
Nginx笔记
运维·笔记·nginx
是孑然呀2 小时前
【笔记】重学单片机(51)(下)
笔记·单片机·嵌入式硬件
zhangxiaomm2 小时前
pytorch 学习笔记(2)-实现一个线性回归模型
pytorch·笔记·学习
Yolanda_20222 小时前
k8s黑马教程笔记
笔记·容器·kubernetes
玖剹3 小时前
Linux文件操作:从C接口到系统调用
linux·服务器·c语言·c++·笔记·ubuntu
安卓开发者4 小时前
Android JUnit 测试框架详解:从基础到高级实践
android·junit·sqlserver
hcgeng4 小时前
如何在Android中创建自定义键盘布局
android·keyboard
NfN-sh4 小时前
计数组合学7.12( RSK算法的一些推论)
笔记·学习·算法
Jomurphys4 小时前
Android 优化 - 日志 Log
android