diff options
| author | Simon Ser <contact@emersion.fr> | 2020-12-19 15:46:14 +0100 | 
|---|---|---|
| committer | Simon Ser <contact@emersion.fr> | 2021-01-16 08:57:42 +0100 | 
| commit | 6dfc8ce00b3627834cdb928a7c02b8957d607407 (patch) | |
| tree | 15c92e420f56a2317c94a18372bbc0715ccdda72 /backend/x11 | |
| parent | b7c95d483ad9245e1280b77041f6f390d18ed03e (diff) | |
| download | wlroots-6dfc8ce00b3627834cdb928a7c02b8957d607407.tar.xz | |
backend/x11: implement get_drm_fd
Diffstat (limited to 'backend/x11')
| -rw-r--r-- | backend/x11/backend.c | 18 | 
1 files changed, 16 insertions, 2 deletions
| diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 1fde98c6..84938de3 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -188,6 +188,8 @@ static void backend_destroy(struct wlr_backend *backend) {  	xcb_errors_context_free(x11->errors_context);  #endif +	close(x11->drm_fd); +  	if (x11->xlib_conn) {  		XCloseDisplay(x11->xlib_conn);  	} @@ -200,10 +202,16 @@ static struct wlr_renderer *backend_get_renderer(  	return x11->renderer;  } +static int backend_get_drm_fd(struct wlr_backend *backend) { +	struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend); +	return x11->drm_fd; +} +  static const struct wlr_backend_impl backend_impl = {  	.start = backend_start,  	.destroy = backend_destroy,  	.get_renderer = backend_get_renderer, +	.get_drm_fd = backend_get_drm_fd,  };  bool wlr_backend_is_x11(struct wlr_backend *backend) { @@ -519,12 +527,18 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display,  	// DRI3 may return a render node (Xwayland) or an authenticated primary  	// node (plain Glamor). -	int drm_fd = query_dri3_drm_fd(x11); -	if (drm_fd < 0) { +	x11->drm_fd = query_dri3_drm_fd(x11); +	if (x11->drm_fd < 0) {  		wlr_log(WLR_ERROR, "Failed to query DRI3 DRM FD");  		goto error_event;  	} +	int drm_fd = fcntl(x11->drm_fd, F_DUPFD_CLOEXEC, 0); +	if (drm_fd < 0) { +		wlr_log(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed"); +		goto error_event; +	} +  	struct wlr_gbm_allocator *gbm_alloc = wlr_gbm_allocator_create(drm_fd);  	if (gbm_alloc == NULL) {  		wlr_log(WLR_ERROR, "Failed to create GBM allocator"); | 
