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

相关推荐
诺诺Okami2 小时前
Android Framework-Launcher-UI和组件
android
潘潘潘4 小时前
Android线程间通信机制Handler介绍
android
潘潘潘4 小时前
Android动态链接库So的加载
android
潘潘潘4 小时前
Android多线程机制简介
android
CYRUS_STUDIO6 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO6 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴10 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我10 小时前
flutter 之真手势冲突处理
android·flutter
法的空间10 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止10 小时前
深入解析安卓 Handle 机制
android