From c4aa3fe3e65fe2e28e7c5a882c0e8e79b72e51d0 Mon Sep 17 00:00:00 2001 From: Jens Peters Date: Sun, 13 Oct 2024 14:13:01 +0200 Subject: [PATCH] server: add dmabuf feedback Co-authored-by: Consolatis <35009135+Consolatis@users.noreply.github.com> --- include/labwc.h | 1 + src/server.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/labwc.h b/include/labwc.h index 0a6c3a17..df339ce8 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -225,6 +225,7 @@ struct server { struct wlr_backend *backend; } headless; struct wlr_session *session; + struct wlr_linux_dmabuf_v1 *linux_dmabuf; struct wlr_xdg_shell *xdg_shell; struct wlr_layer_shell_v1 *layer_shell; diff --git a/src/server.c b/src/server.c index bfe33c3c..d9241940 100644 --- a/src/server.c +++ b/src/server.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -44,6 +45,7 @@ #define LAB_WLR_COMPOSITOR_VERSION 5 #define LAB_WLR_FRACTIONAL_SCALE_V1_VERSION 1 +#define LAB_WLR_LINUX_DMABUF_VERSION 4 static struct wlr_compositor *compositor; static struct wl_event_source *sighup_source; @@ -393,7 +395,23 @@ server_init(struct server *server) server->renderer_lost.notify = handle_renderer_lost; wl_signal_add(&server->renderer->events.lost, &server->renderer_lost); - wlr_renderer_init_wl_display(server->renderer, server->wl_display); + if (!wlr_renderer_init_wl_shm(server->renderer, server->wl_display)) { + wlr_log(WLR_ERROR, "Failed to initialize shared memory pool"); + exit(EXIT_FAILURE); + } + + if (wlr_renderer_get_texture_formats( + server->renderer, WLR_BUFFER_CAP_DMABUF)) { + if (wlr_renderer_get_drm_fd(server->renderer) >= 0) { + wlr_drm_create(server->wl_display, server->renderer); + } + server->linux_dmabuf = wlr_linux_dmabuf_v1_create_with_renderer( + server->wl_display, + LAB_WLR_LINUX_DMABUF_VERSION, + server->renderer); + } else { + wlr_log(WLR_DEBUG, "unable to initialize dmabuf"); + } /* * Autocreates an allocator for us. The allocator is the bridge between @@ -502,6 +520,9 @@ server_init(struct server *server) wlr_log(WLR_ERROR, "unable to create presentation interface"); exit(EXIT_FAILURE); } + if (server->linux_dmabuf) { + wlr_scene_set_linux_dmabuf_v1(server->scene, server->linux_dmabuf); + } wlr_export_dmabuf_manager_v1_create(server->wl_display); wlr_screencopy_manager_v1_create(server->wl_display);