DRM框架简介
DRM 是目前主流的图形显示框架,Linux 内核中已经有Framebuffer 驱动用于管理显示设备的 Framebuffer, Framebuffer 框架也可以实现Linux 系统的显示功能,但是缺点如下:
- 不支持VSYNC
- 不支持DMA-BUF
- 不支持异步更新
- 不支持Fence机制
-
不支持和GPU的通信
这些功能DRM框架都支持, 可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护。
Framebuffer显示框架.png
下面是Linux graphic system 的框架,基于Wayland的Windowing system,在DRI框架下,通过两条路径(DRM和KMS),分别实现Rendering和送显两个显示步骤,注意观察 DRM 框架在其中的作用
Linux Wayland DRI 显示框架.png
-
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动作。 -
GPU绘制完成后,将rendering的结果返回给Application。
rendering的结果是以image buffer的形式返回给应用程序。 -
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 就是学习上面这些概念的用法和实现。
网友评论