diff options
author | Simon Ser <contact@emersion.fr> | 2021-11-24 10:36:39 +0100 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2021-11-25 15:12:32 +0000 |
commit | f29abe4c777ba8293ab76334ef2ac83eaa0043f6 (patch) | |
tree | 7e1824da2f534191b5564fc5202d39debdf740b1 /backend/headless | |
parent | e4f748c6e9d618eb2ee8f15aa22aae8dcde4cc4a (diff) |
backend/headless: stop picking a DRM FD
Sometimes the headless backend is used standalone with the Pixman
renderer, sometimes it's used together with another backend which
has already picked a DRM FD. In both of these cases it doesn't make
sense to pick a DRM FD.
Broadly speaking the headless backend doesn't really care which DRM
device is used for the buffers it receives. So it doesn't really
make sense to tie it to a particular DRM device.
Let the backend users (e.g. wlr_renderer_autocreate) open an arbitrary
DRM FD as needed instead.
Diffstat (limited to 'backend/headless')
-rw-r--r-- | backend/headless/backend.c | 93 | ||||
-rw-r--r-- | backend/headless/output.c | 1 |
2 files changed, 4 insertions, 90 deletions
diff --git a/backend/headless/backend.c b/backend/headless/backend.c index ad0c4ebf..8d74287d 100644 --- a/backend/headless/backend.c +++ b/backend/headless/backend.c @@ -1,16 +1,9 @@ -#define _POSIX_C_SOURCE 200809L #include <assert.h> -#include <drm_fourcc.h> -#include <fcntl.h> #include <stdlib.h> -#include <unistd.h> #include <wlr/interfaces/wlr_input_device.h> #include <wlr/interfaces/wlr_output.h> -#include <wlr/render/wlr_renderer.h> #include <wlr/util/log.h> -#include <xf86drm.h> #include "backend/headless.h" -#include "render/drm_format_set.h" #include "util/signal.h" struct wlr_headless_backend *headless_backend_from_backend( @@ -64,16 +57,9 @@ static void backend_destroy(struct wlr_backend *wlr_backend) { wlr_backend_finish(wlr_backend); - close(backend->drm_fd); free(backend); } -static int backend_get_drm_fd(struct wlr_backend *wlr_backend) { - struct wlr_headless_backend *backend = - headless_backend_from_backend(wlr_backend); - return backend->drm_fd; -} - static uint32_t get_buffer_caps(struct wlr_backend *wlr_backend) { return WLR_BUFFER_CAP_DATA_PTR | WLR_BUFFER_CAP_DMABUF @@ -83,7 +69,6 @@ static uint32_t get_buffer_caps(struct wlr_backend *wlr_backend) { static const struct wlr_backend_impl backend_impl = { .start = backend_start, .destroy = backend_destroy, - .get_drm_fd = backend_get_drm_fd, .get_buffer_caps = get_buffer_caps, }; @@ -107,52 +92,6 @@ static bool backend_init(struct wlr_headless_backend *backend, return true; } -static int open_drm_render_node(void) { - uint32_t flags = 0; - int devices_len = drmGetDevices2(flags, NULL, 0); - if (devices_len < 0) { - wlr_log(WLR_ERROR, "drmGetDevices2 failed: %s", strerror(-devices_len)); - return -1; - } - drmDevice **devices = calloc(devices_len, sizeof(drmDevice *)); - if (devices == NULL) { - wlr_log_errno(WLR_ERROR, "Allocation failed"); - return -1; - } - devices_len = drmGetDevices2(flags, devices, devices_len); - if (devices_len < 0) { - free(devices); - wlr_log(WLR_ERROR, "drmGetDevices2 failed: %s", strerror(-devices_len)); - return -1; - } - - int fd = -1; - for (int i = 0; i < devices_len; i++) { - drmDevice *dev = devices[i]; - if (dev->available_nodes & (1 << DRM_NODE_RENDER)) { - const char *name = dev->nodes[DRM_NODE_RENDER]; - wlr_log(WLR_DEBUG, "Opening DRM render node '%s'", name); - fd = open(name, O_RDWR | O_CLOEXEC); - if (fd < 0) { - wlr_log_errno(WLR_ERROR, "Failed to open '%s'", name); - goto out; - } - break; - } - } - if (fd < 0) { - wlr_log(WLR_ERROR, "Failed to find any DRM render node"); - } - -out: - for (int i = 0; i < devices_len; i++) { - drmFreeDevice(&devices[i]); - } - free(devices); - - return fd; -} - struct wlr_backend *wlr_headless_backend_create(struct wl_display *display) { wlr_log(WLR_INFO, "Creating headless backend"); @@ -163,21 +102,12 @@ struct wlr_backend *wlr_headless_backend_create(struct wl_display *display) { return NULL; } - backend->drm_fd = open_drm_render_node(); - if (backend->drm_fd < 0) { - wlr_log(WLR_ERROR, "Failed to open DRM render node"); - } - if (!backend_init(backend, display)) { - goto error_init; + free(backend); + return NULL; } return &backend->backend; - -error_init: - close(backend->drm_fd); - free(backend); - return NULL; } struct wlr_backend *wlr_headless_backend_create_with_renderer( @@ -191,27 +121,12 @@ struct wlr_backend *wlr_headless_backend_create_with_renderer( return NULL; } - int drm_fd = wlr_renderer_get_drm_fd(renderer); - if (drm_fd < 0) { - wlr_log(WLR_ERROR, "Failed to get DRM device FD from parent renderer"); - backend->drm_fd = -1; - } else { - backend->drm_fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0); - if (backend->drm_fd < 0) { - wlr_log_errno(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed"); - } - } - if (!backend_init(backend, display)) { - goto error_init; + free(backend); + return NULL; } return &backend->backend; - -error_init: - close(backend->drm_fd); - free(backend); - return NULL; } bool wlr_backend_is_headless(struct wlr_backend *backend) { diff --git a/backend/headless/output.c b/backend/headless/output.c index 43762b23..50d914e4 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -2,7 +2,6 @@ #include <stdlib.h> #include <stdio.h> #include <wlr/interfaces/wlr_output.h> -#include <wlr/render/wlr_renderer.h> #include <wlr/util/log.h> #include "backend/headless.h" #include "util/signal.h" |