Android 图形系统(3)---- DRM 显示框架初步

2021-11-06  本文已影响0人  特立独行的佩奇
DRM框架简介

DRM 是目前主流的图形显示框架,Linux 内核中已经有Framebuffer 驱动用于管理显示设备的 Framebuffer, Framebuffer 框架也可以实现Linux 系统的显示功能,但是缺点如下:

下面是Linux graphic system 的框架,基于Wayland的Windowing system,在DRI框架下,通过两条路径(DRM和KMS),分别实现Rendering和送显两个显示步骤,注意观察 DRM 框架在其中的作用


Linux Wayland DRI 显示框架.png
  1. Application(如3D game)根据用户动作,需要重绘界面,此时它会通过OpenGL|ES、EGL等接口,将一系列的绘图请求,提交给GPU。
    注意:
    a)OpenGL|ES、EGL的实现,可以有多种形式,这里以Mesa 3D为例,所有的3D rendering请求,都会经过该软件库,它会根据实际情况,通过硬件或者软件的方式,响应Application的rendering请求。
    b)当系统存在基于DRI的硬件rendering机制时,Mesa 3D会通过libGL-meas-DRI,调用DRI提供的rendering功能。
    c)libGL-meas-DRI会调用libdrm,libdrm会通过ioctl调用kernel态的DRI驱动,这里称作DRM(Direct Rendering Module)
    d)kernel的DRM模块,最终通过GPU完成rendering动作。

  2. GPU绘制完成后,将rendering的结果返回给Application。
    rendering的结果是以image buffer的形式返回给应用程序。

  3. Application将这些绘制完成的图像buffer(可能不止一个)送给Wayland compositor,Wayland compositor会控制硬件,将buffer显示到屏幕上。
    Wayland compositor会搜集系统Applications送来的所有image buffers,并处理buffer在屏幕上的坐标、叠加方式后,直接通过ioctl,交给kernel KMS(kernel mode setting)模块,该模块会控制显示控制器将图像显示到具体的显示设备上。

DRM 基本概念

DRM 框架的基本流程框图如下:


drm 显示流程.png

软件角度框图:


drm 软件框图.png

DRM框架涉及到的元素很多,大致如下:
KMS:CRTC,ENCODER,CONNECTOR,PLANE,FB,VBLANK,property
GEM:DUMB、PRIME、Fence

下面一一介绍
libdrm:
应用层的一个动态链接库,对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装。

KMS:
Kernel mode setting 简而言之做两件事:更新画面 + 设置显示参数
更新画面: 显示buffer 的切换,多图层之间的合成方式,每个图层的显示位置
设置显示参数:包含 刷新率,分辨率,电源状态 休眠唤醒等等。

GEM:
Graphic Execution Manager,主要负责显示buffer的分配和释放,也是GPU唯一用到DRM的地方。

元素 说明
CRTC 对显示buffer 进行扫描产生时序的硬件模块,通常是指 Display Controller
Encoder 负责将CRTC输出的Timing 转换为外部设备需要信号的硬件模块,比如 HDMI 转换器,LVDS转换器,MIPI/DSI 转换器等
Connector 连接物理显示设备的连接器,比如 HDMI接口,LVDS 接口等,通常和 Encoder 绑定在一起
Plane 硬件图层,一个 plane 对应于一张显示buffer,有的 显示设备支持多图层显示(overlay mode),但所有的Display Controller至少要有1个plane
FB Framebuffer ,单个图层的显示buffer,对应于一段显存
VBlank 软件和硬件的同步机制,LCD时序中两帧之间的垂直消隐区,软件通常使用硬件VSYNC来实现
Property DRM 中用于设置显示参数的数据结构,所有设置到显示设备的参数都可以抽象为 property
Dump 表示连续物理内存,基于kernel中通用CMA API实现,多用于小分辨率简单场景
Prime 连续、非连续物理内存都支持,基于DMA-BUF机制,可以实现buffer共享,多用于大内存复杂场景
Fence Buffer 之间的同步机制,基于内核dma_fence机制实现,用于防止显示内容出现异步问题

学习 drm 就是学习上面这些概念的用法和实现。

上一篇下一篇

猜你喜欢

热点阅读