乐于分享
好东西不私藏

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 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮