谈到 drm 就涉及到 libdrm 库,它是一个跨驱动的中间件,它允许用户空间应用(例如作为Mesa和2D驱动程序)通过DRI与内核通信协议。
如下DRM结构图:
libdrm 是DRM下沟通驱动和用户层的库。过去APP可能是使用open(framebuff)这样的方式来和图形驱动沟通,但是在现在的硬件演化下,已经不适应新的场景。
原因如下:
- 有多个图层怎么办?
- 有多个屏幕怎么办?
- 怎么处理vsync的问题,怎么同步不撕裂?
- 怎么利用上dmabuf,做到memory zero-copy?
libdrm 的存在就是用来方便用户层和驱动这些问题,提供API给X11, Wayland这样的display backend使用。
DRM里有crtc,plane,connector这三个概念,可以这么理解:
- connector就是屏幕,比如一个HDMI一个connector num, 一个DSI一个connector num。
- crtc表示vop, 一个屏幕一般对应一个crtc。
- plane就是图层,比如视频层在plane2,UI在plane1, 视频在UI上面。
DRM里API分两套,legacy和atomic。
legacy看名字就是早期的API,我们现在大部分程序也都是用legacy API。 里面有几个关