DRM -- Userspace Application
参考 https://github.com/dvdhrm/docs/tree/master/drm-howto 中的 modeset-atomic.c Modeset prepare 首先 open drm 设备节点: fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); 设置 client 的 capability: drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 第一行设置 drm file_priv->universal_planes=1。 第二行设置 file_priv->atomic=1, file_priv->universal_planes=1, file_priv->aspect_ratio_allowed = 1。 获取 client 的 capability: drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &cap); drmGetCap(fd, DRM_CAP_CRTC_IN_VBLANK_EVENT, &cap); 第一行,如果 drm_driver 提供了 dumb_create 回调,则返回 1,一般都会提供。 第二行,必定返回 1,现在 driver 都会支持 Vblank 事件。 获取 resources: drmModeGetResources(); drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res); 得到 fbs/crtcs/connectors/encoders 的数量,以及每个对应的 id,还有显示支持的最大最小长宽,填充结构体: typedef struct _drmModeRes { int count_fbs; uint32_t *fbs; int count_crtcs; uint32_t *crtcs; int count_connectors; uint32_t *connectors; int count_encoders; uint32_t *encoders; uint32_t min_width, max_width; uint32_t min_height, max_height; } drmModeRes, *drmModeResPtr; 获取 connector:...