一、简介
DRM,全称Direct Rending Manger。是目前Linux主流的图形显示框架。相比较传统的Framebuffer(FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等),而这些功能DRM原生都支持,因此DRM更能适应当今硬件。并且
DRM可以支持GPU、3D渲染显示等,统一管理GPU、Display驱动,使得软件架构更统一、方便开发和维护。
二、划分
从模块上划分,DRM可以简单分为三部分:libdrm、KMS、GEM。
2.1libdrm
libdrm是DRM框架提供的、位于用户空间的、操作DRM的库。应用程序调用内核里面的KMS和GEM,访问显示相关的资源。其原理是对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装。
2.2KMS(Kernel Mode Setting)
KMS是DRM框架的一个大模块,主要功能是:显示参数设置及显示控制。
显示控制:包括buffer的切换,多图层的合成方式,以及每个图层的显示位置。
显示参数设置:包括分辨率、刷新率、电源状态(休眠唤醒)等。
2.3GEM(Graphic Execution Manager)
GEM主要负责显示内存的分配和释放,也是GPU唯一用到DRM的地方。
三、基本元素
DRM框架涉及到的元素很多,大致如下:
KMS:CRTC,ENCODER,CONNECTOR,PLANE,FB,VBLANK,property
GEM:DUMB、PRIME、fence
3.1KMS
3.1.1DRM Framebuffer
它是一块内存区域,驱动和应用层都能访问它。显示之前需要将它格式化,这个时候会设置分辨率和所需要显示格式(format\size\pitch)。唯一一个和硬件无关的基本元素。
3.1.2CRTC
从framebuffer中读取待显示的图像,并按照响应的格式输出给encoder。其承担的主要作用为:
a.配置适合显示器的分辨率,并输出响应的时序。
b.扫描framebuffer送到一个或多个显示器
c.更新framebuffer
3. 1.3Planes
图层,实际输出的图像是多个图层叠加而成的,比如主图层、光标图层。其中有些图层由硬件加速模块生成,每个crtc至少一个plane。plane一共有三种,分别是:DRM_PLANE_TYPE_PRIMARY、DRM_PLANE_TYPE_OVERLAY、DRM_PLANE_TYPE_CURSOR。
3.1.4Encoder:
将一定格式的图像信号(如RGB、YUV等)编码成connector需要的输出信号。不同的电信号有如 DVID、VGA、YPbPr、CVBS、Mipi、eDP 等
3.1.5Connector:
连接显示器的物理接口 (VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video …) ,负责硬件设备的接入、屏参获取等,如DP、HDMI等.
3.1.6Vblank:
软、硬件同步机制,RGB时序中垂直消影区,软件通常使用硬件VSYNC实现。
3.1.7Property:
任何想设置的参数都可以做成property,通过propery将参数传入kernel内部,是DRM驱动中最灵活的部分。
3.2GEMS
3.2.1Dumb:
只支持连续物理内存,基于kernel中通用CMA API实现,多用于小分辨率简单场景。主要负责一些简单的buffer显示,可以直接使用CPU渲染,GPU不会使用dumb。
3.2.2Prime:
连续、非连续物理内存都支持,基于DMA-BUF机制,可以实现buffer共享,多用于大内存复杂场景。
3.2.3Fence:
buffer同步机制,基于内核dma_fence机制实现,用于防止显示内容出现异步问题。
参考文章
- https://blog.csdn.net/zichuanning520/article/details/127047436