乐于分享
好东西不私藏

APP是如何将图像画到屏幕上的

APP是如何将图像画到屏幕上的

概要

以绘画艺术展为例,先做个概念上的映射,方便理解。

例子 抽象 (技术实体)  说明 (核心职责)
画家  App  负责画画
画布  Buffer (显存)  存放画好的画
策划人

 SurfaceFlinger (安卓)

Weston (Linux)

 决定布局:把不同画家的画(状态栏、弹窗等)叠在一起,决定谁在谁上面
物流队  DRM  负责把画发送出去
运输车  MIPI DSI  传输通道
展厅 屏幕 (Panel)  把画展览出来

参考文章:

  • Kernel Mode Setting
  • dma-buf
  • Rockchip一些参考资料
  • Xilinx一些参考资料

一 先说结论

  • App
     在自己的 Buffer(画布) 上绘制好内容后,将其提交给系统。
  • SurfaceFlinger(合成器)
     收到这个 Buffer ,但它不会直接修改这幅画,而是将其与状态栏、导航栏等其他 Buffer 进行叠加合成。
  • 随后,DRM 驱动接收到合成后的最终画面指令,控制硬件通过 MIPI DSI 通道 将数据高速发送给屏幕,最终点亮像素。

二 补充细节

0001_简图.png

2.1 名词解释

2.1.1 userspace,用户空间

  • 安卓上用的
    • HWC: Hardware Composer, Android 的硬件抽象层 (HAL) 模块。它将 SurfaceFlinger 的部分合成任务卸载 (Offload) 到显示控制器硬件 (Display Controller) 上。通过利用硬件图层 (Overlays) 直接进行合成,能显著降低功耗并释放 GPU 算力。
    • Gralloc: Graphics Allocator HAL, Android 特有的图形内存分配 HAL 层。它封装了底层的内存分配逻辑 (如 ION 或 DMA – BUF Heap),分配的缓冲区句柄 (Handle) 包含特定于硬件的元数据 (如步长 Stride、像素格式、缓存一致性策略),确保缓冲区能在不同进程和硬件间正确解析。
  • Linux 用的
    • XServer (X.Org Server): Linux / Unix 系统中传统的显示服务器实现(基于 X11 协议),负责管理输入设备并协调应用程序的绘图请求,架构庞大且包含大量遗留功能。
    • Weston: Wayland 协议的轻量级参考合成器实现,它摒弃了 XServer 的陈旧架构,将显示服务器与窗口管理器合二为一,直接利用 DRM / KMS 实现高效的图形合成。
  • 通用的
    • libdrm,一个用户空间库

2.1.2 kernel space,内核空间

  • DRM: Direct Rendering Mangager, Linux 内核的一个子系统,负责管理图像处理单元(GPU)和显示控制器。它提供了用户空间程序与图像硬件通信的接口。
    • Plane: DRM Plane, DRM 子系统中的硬件图层抽象。它代表显示控制器中独立的图像处理单元,可以直接从内存读取图像数据并进行缩放、旋转或格式转换。现代 SoC 通常支持多个 Plane (如主图层、光标层、视频层),允许硬件直接叠加图像而无需 GPU 介入。
    • CRTC: CRT Controller, DRM 子系统中的显示控制器抽象 (对应硬件如 LCDC 或 VOP)。它是显示链路的控制中心,负责把各个 Plane 的图像混合,并产生符合屏幕时序 (Timing) 的扫描信号 (如 HSYNC / VSYNC),将像素流推送到 Encoder。
    • Encoder: DRM Encoder, DRM 子系统中的编码器。负责将 CRTC 输出的并行像素数据转换成特定物理接口所需的电信号协议。例如,将 RGB 数据编码为 HDMI 的 TMDS 信号或 MIPI DSI 的数据包 (Packet)。
    • Connector: DRM Connector, DRM 子系统中的物理接口抽象。代表实际的输出端口 (如 HDMI、DP、DSI)。它负责检测显示设备的连接状态 (Hotplug),并读取屏幕的 EDID 信息 (包含分辨率、厂商等数据) 以告知驱动层屏幕的能力。
    • Panel: 显示器驱动
    • KMS: Kernel Mode Setting, DRM子系统中的一个非常重要的组件,专门负责管理显示输出配置。它负责设置屏幕的分辨率、刷新率和色彩深度,控制这从显存读出像素并输出到物理接口(如MIPI)的整个显示路径。
    • GEM: Graphics Execution Manager, DRM子系统中的内存管理器。它负责图形内存(Buffer Object)的分配、映射(Mapping)和释放。它确保GPU能够高效地访问系统内存或专用显存,并处理内存的一致性问题。
  • DMA-BUF, Direct Memory Access Buffer Sharing, Linux内核的一种缓冲区共享框架,允许不同的设备驱动(如GPU驱动、摄像头驱动、显示驱动)共享同一块物理内存。它是实现零拷贝(Zero-copy)的基础,通过传递文件描述符(fd),图像数据无需在CPU上进行memcpy,直接由硬件DMA引擎读取。

2.1.3 hardware,硬件

  • RAM: 内存,就是现在涨价涨的飞起的那个
  • LVDS/DP/MIPI/eDP/HDMI/CVBS/RGB, 就是连接屏幕的通道
  • LCD: 就是屏幕
  • LCDC: LCD Controller
    厂商 硬件模块名称 (缩写)  全称 备注
     Rockchip VOP Video Output Processor  瑞芯微特有,支持多图层硬件叠加
     NXP IPU / LCDIF Image Processing Unit i.MX6 叫 IPU (超复杂),i.MX8 叫 LCDIF / DCSS
    Xilinx AVBuf / VTC Audio/Video Buffer ZynqMP 叫 AVBuf,FPGA 逻辑通常用 VTC
    Qualcomm MDP / DPU Mobile Display Processor  现代骁龙通常叫 DPU (Display Processing Unit)
    TI DSS / DISPC Display Subsystem  工业界常用的 AM335x 系列
     Allwinner DE Display Engine  全志系列,通常分 DE1.0 / DE2.0
    Intel Pipe Display Pipeline PC 领域的叫法
    通用术语  LCDC / DC LCD Controller  最朴素的叫法,大家都能听懂
  • 硬件图层
    厂商 旗舰图层 (对应 Cluster)  经济型图层 (对应 Smart)  最简图层 (对应 Cursor)  设计逻辑
     Rockchip (瑞芯微) Cluster Esmart / Smart  高性能 vs 高能效
     Qualcomm (高通) VIG (Video/Graphics) RGB DMA  按功能细分 (视频/UI/搬运)
    ARM (Mali-DP) Rich Layer Basic Layer  功能丰富度区分
     Amlogic (晶晨) Video Layer OSD Layer  视频内容 vs UI 内容
     Allwinner (全志) Video Channel UI Channel  视频 vs UI
    Intel (PC) Primary Plane Sprite Plane Cursor Plane  主平面 vs 叠加层

2.2 合成器是怎么干活的

2.2.1 Weston

Weston 是 Wayland 协议的参考合成器实现,它作为显示服务器,负责接收所有客户端应用程序提交的 Surface (缓冲区),利用 GPU (OpenGL) 或硬件图层将它们合成为最终的一帧图像,并通过 libdrm 接口驱动 KMS 进行显示输出。

2.2.2 HWC

HWC (Hardware Composer) 是 Android 的硬件抽象层模块,它在每一帧显示前检查所有图层属性,决策哪些图层可以由显示控制器 (Display Controller) 硬件直接合成(以节省 GPU 算力和功耗),哪些必须由 GPU 先合成好,最后将配置结果提交给内核驱动。

2.3 libdrm干什么活

libdrm 是一个用户空间的 C 语言库,充当翻译官的角色,它封装了 Linux 内核 DRM 驱动复杂的 ioctl 系统调用,向上层应用程序(如 Weston 或 SurfaceFlinger)提供了一套标准的 API,用于分配图形内存、配置显示模式(Mode Setting)和提交帧数据

2.4 DRM怎么干活的

DRM 通用模型 (软件抽象层),可以把这一套理解为 “流水线上的四个工位”,数据流向是: Plane -> CRTC -> Encoder -> Connector -> Panel

0002_drm_display.png

三 总结

| 整个显示系统的核心逻辑,就是将应用程序生产的图形数据 (Buffer),经过层层搬运和翻译,最终转化为屏幕上的光信号。

这个过程可以分几层

  1. 应用层:
    • App 负责 “画”,它只关心自己的画布 (Buffer),画好后提交
  2. 中间层:
    • 合成器 (SurfaceFlinger / Weston) 负责 “拼”,它决定了谁在上面、谁在下面。
    • libdrm 作为用户空间和内核空间的 “翻译官”,将合成器的合成指令和显示请求,封装成标准的 API,并通过 ioctl 传递给内核,屏蔽了底层驱动的复杂性
  3. 内核层
    • DRM 驱动 接管控制权,启动硬件流水线,传输到屏幕上
  4. 硬件层
    • 屏幕收到数据后进行最终的展示
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » APP是如何将图像画到屏幕上的

评论 抢沙发

3 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮