一. 概念
贴一张图(这张图可能和其他地方的不一样,我作了修改,后文会解释):
DRM架构包含如上图所示的几个部分,显示一张图像,就是分别获取上面的各个节点信息,进行配置,将将fb -> planes -> crtc -> encoder - > connector连接起来 ,最终实现把FB的内容推送到显示器显示的目的。
1.1 FrameBuffer帧缓存
FB是图像实际存放的一段内存区域,是我们想要显示的原始图像所在空间,一般存放的是RGBX或者YUV的图像数据。这些数据可能是虚拟地址空间或者DMA、CMA等内存区域,和显示模组没有硬件关系。
1.2 Plane图层
显示的基本单元,每个图层可能关联一个FB的数据。图层是显示模组硬件,每个图层叠加顺序、支持的透明度等一般是硬件决定的,如果超过图层数量限制就需要软件来额外处理。
注:
很多示例图上是把FB和Planes分开的输入到CRTC的,但我理解,所有要显示的FB都必须要依赖到一个图层才能显示,除非CRTC本身有一个背景层,这个背景层不能叫plane,其它在此基础上做透明叠加等操作的额外图层才能叫Plane???而现在通用的显示控制器一般是可以自由设定图层顺序和透明度的,每个plane可能是等效的,可以分别配置z-order来随意叠加,所以我是把所有FB直接指向了planes。如有错误请指正。
1.3 CRTC 扫描(CRT)控制器
把一个或者多个图层的数据作处理,形成视觉上的一张图像。比如有两个图层,一个是播放文件的视频图层,另一个是UI操作图层,将其叠加为一个新的图,送到下一级(Encoder)作显示。使用CRT猜测是沿用旧时的称呼。
1.4 Encoder 编码器
将CRTC生成的最终画面转化为不同的显示信号。
1.5 Connector连接器
将信号传送到显示器。
2. API简述
drm用户态接口是依赖于libdrm,因此需要先编译安装该库文件。使用libdrm来显示的主要api如下。
2.1 获取显示资源drmModeGetResources
drmModeRes *res;
int drm_fd;
drm_fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
res = drmModeGetResources(fd);