xf86drmMode: add drmIsKMS
authorSimon Ser <contact@emersion.fr>
Tue, 23 Feb 2021 17:19:33 +0000 (18:19 +0100)
committerSimon Ser <contact@emersion.fr>
Fri, 26 Feb 2021 11:56:46 +0000 (12:56 +0100)
If a device has a primary node, it doesn't necessarily mean it's
suitable for KMS usage. For instance, render-only drivers also
expose primary nodes.

The check is extracted from Weston [1].

The motivation for this new function is two-fold:

- Avoid an unnecessary GETRESOURCES call. To check whether a
  primary node is suitable for KMS, we don't actually need to
  retrieve the object IDs we just need to check the counts.
- Avoid confusion in user-space and make sure user-space implements
  the check properly. For instance, wlroots doesn't [2]: it uses
  drmGetVersion which succeeds with render-only drivers.

[1]: https://gitlab.freedesktop.org/wayland/weston/-/blob/master/libweston/backend-drm/drm.c#L2689
[2]: https://github.com/swaywm/wlroots/blob/a290d7a78dc36275e24e54f84570f37a66dc67a4/backend/session/session.c#L268

Signed-off-by: Simon Ser <contact@emersion.fr>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
core-symbols.txt
xf86drmMode.c
xf86drmMode.h

index 1ff4eca..410054b 100644 (file)
@@ -83,6 +83,7 @@ drmHashInsert
 drmHashLookup
 drmHashNext
 drmIoctl
+drmIsKMS
 drmIsMaster
 drmMalloc
 drmMap
index 3d6bdfd..c3920b9 100644 (file)
@@ -146,6 +146,16 @@ drm_public void drmModeFreeEncoder(drmModeEncoderPtr ptr)
  * ModeSetting functions.
  */
 
+drm_public int drmIsKMS(int fd)
+{
+       struct drm_mode_card_res res = {0};
+
+       if (drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res) != 0)
+               return 0;
+
+       return res.count_crtcs > 0 && res.count_connectors > 0 && res.count_encoders > 0;
+}
+
 drm_public drmModeResPtr drmModeGetResources(int fd)
 {
        struct drm_mode_card_res res, counts;
index baf3d5d..7269678 100644 (file)
@@ -260,6 +260,13 @@ extern void drmModeFreePlane( drmModePlanePtr ptr );
 extern void drmModeFreePlaneResources(drmModePlaneResPtr ptr);
 
 /**
+ * Check whether the DRM node supports Kernel Mode-Setting.
+ *
+ * Returns 1 if suitable for KMS, 0 otherwise.
+ */
+extern int drmIsKMS(int fd);
+
+/**
  * Retrieves all of the resources associated with a card.
  */
 extern drmModeResPtr drmModeGetResources(int fd);