aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-11-24 10:36:39 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2021-11-25 15:12:32 +0000
commitf29abe4c777ba8293ab76334ef2ac83eaa0043f6 (patch)
tree7e1824da2f534191b5564fc5202d39debdf740b1
parente4f748c6e9d618eb2ee8f15aa22aae8dcde4cc4a (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.
-rw-r--r--backend/headless/backend.c93
-rw-r--r--backend/headless/output.c1
-rw-r--r--include/backend/headless.h1
3 files changed, 4 insertions, 91 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"
diff --git a/include/backend/headless.h b/include/backend/headless.h
index f60d07e6..e126ac4e 100644
--- a/include/backend/headless.h
+++ b/include/backend/headless.h
@@ -8,7 +8,6 @@
struct wlr_headless_backend {
struct wlr_backend backend;
- int drm_fd;
struct wl_display *display;
struct wl_list outputs;
size_t last_output_num;