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>
drmHashLookup
drmHashNext
drmIoctl
+drmIsKMS
drmIsMaster
drmMalloc
drmMap
* 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;
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);