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

相关推荐
蒸蒸yyyyzwd3 分钟前
CPP选手秋招准备学习笔记day25
笔记·学习
事圆则缓19 分钟前
Kotlin 高阶工程化与 Android 深入实践
android·开发语言·kotlin
zhangphil23 分钟前
AI大模型生成maxTokens 与上下文context
android·llama
淡淡的香烟27 分钟前
Androidiot开发之猫脸识别
android·物联网
2501_9151063238 分钟前
iOS数据采集技术详解:从性能监控到崩溃分析的全链路实践
android·ios·小程序·https·uni-app·iphone·webview
摇滚侠41 分钟前
《SpringBoot 3:入门与应用实战》第 13 章 整合 MyBatis 使用 MyBatis-Plus 阅读笔记 40
spring boot·笔记·mybatis
天空之城--9 小时前
Android Koin 完全指南:从原理到实践
android
INS_KF10 小时前
【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)
前端·javascript·笔记
zhangphil11 小时前
Android main thread主线程Choreographer doFrame发生FullSuspendCheck
android
tju新生代魔迷11 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习