diff options
author | Greg V <greg@unrelenting.technology> | 2020-09-15 17:41:04 +0300 |
---|---|---|
committer | Olivier Fourdan <fourdan@gmail.com> | 2020-10-01 08:29:01 +0000 |
commit | 1ac389dda89b2882c80767c91bbe88e01818491c (patch) | |
tree | a72e61e9e08a8f0ba4ae39fadd396a64157c5f06 /hw | |
parent | d108c2c82cba242ea5998d7c91254d90d3a5db71 (diff) |
xwayland: use drmGetNodeTypeFromFd for checking if a node is a render one
Major/minor numbers are a.. major (ha) source of pain in FreeBSD porting.
In this case, Xwayland was thinking that /dev/dri/card0 is already a render node,
because the st_rdev on FreeBSD was passing the Linux-style check,
and because of the assumption, acceleration would fail because
various ioctls like AMDGPU_INFO would be denied on the non-render node.
Switch to libdrm's function that already works correctly on all platforms.
Signed-off-by: Greg V <greg@unrelenting.technology>
Reviewed-by: Emmanuel Vadot <manu@FreeBSD.org>
(cherry picked from commit 239ebdc9e447d4f836d0c2aa6068c6064fffb46c)
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xwayland/xwayland-glamor-gbm.c | 19 |
1 files changed, 2 insertions, 17 deletions
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c index ebff70a00..b519492cc 100644 --- a/hw/xwayland/xwayland-glamor-gbm.c +++ b/hw/xwayland/xwayland-glamor-gbm.c @@ -111,21 +111,6 @@ wl_drm_format_for_depth(int depth) } static char -is_fd_render_node(int fd) -{ - struct stat render; - - if (fstat(fd, &render)) - return 0; - if (!S_ISCHR(render.st_mode)) - return 0; - if (render.st_rdev & 0x80) - return 1; - - return 0; -} - -static char is_device_path_render_node (const char *device_path) { char is_render_node; @@ -135,7 +120,7 @@ is_device_path_render_node (const char *device_path) if (fd < 0) return 0; - is_render_node = is_fd_render_node(fd); + is_render_node = (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER); close(fd); return is_render_node; @@ -767,7 +752,7 @@ xwl_drm_handle_device(void *data, struct wl_drm *drm, const char *device) return; } - if (is_fd_render_node(xwl_gbm->drm_fd)) { + if (drmGetNodeTypeFromFd(xwl_gbm->drm_fd) == DRM_NODE_RENDER) { xwl_gbm->fd_render_node = 1; xwl_screen->expecting_event--; } else { |