From 4dae12890f511aed876cc156eb0f28827ed76086 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 28 Apr 2021 23:39:36 +0200 Subject: [PATCH] backend: automatically create allocator Introduce a new backend_get_allocator function that automatically creates an allocator for the backend if the backend has a renderer. --- backend/backend.c | 19 +++++++++++++++++++ include/backend/backend.h | 6 ++++++ include/wlr/backend.h | 1 + 3 files changed, 26 insertions(+) diff --git a/backend/backend.c b/backend/backend.c index f7c618f3..8a7d69bd 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -19,6 +19,7 @@ #include #include "backend/backend.h" #include "backend/multi.h" +#include "render/allocator.h" #include "util/signal.h" #if WLR_HAS_X11_BACKEND @@ -36,6 +37,7 @@ void wlr_backend_init(struct wlr_backend *backend, void wlr_backend_finish(struct wlr_backend *backend) { wlr_signal_emit_safe(&backend->events.destroy, backend); + wlr_allocator_destroy(backend->allocator); wlr_renderer_destroy(backend->renderer); } @@ -116,6 +118,23 @@ uint32_t backend_get_buffer_caps(struct wlr_backend *backend) { return backend->impl->get_buffer_caps(backend); } +struct wlr_allocator *backend_get_allocator(struct wlr_backend *backend) { + if (backend->allocator != NULL) { + return backend->allocator; + } + + struct wlr_renderer *renderer = wlr_backend_get_renderer(backend); + if (renderer == NULL) { + return NULL; + } + + backend->allocator = wlr_allocator_autocreate(backend, renderer); + if (backend->allocator == NULL) { + wlr_log(WLR_ERROR, "Failed to create backend allocator"); + } + return backend->allocator; +} + static size_t parse_outputs_env(const char *name) { const char *outputs_str = getenv(name); if (outputs_str == NULL) { diff --git a/include/backend/backend.h b/include/backend/backend.h index 8c7440c3..7d88cd79 100644 --- a/include/backend/backend.h +++ b/include/backend/backend.h @@ -10,4 +10,10 @@ */ uint32_t backend_get_buffer_caps(struct wlr_backend *backend); +/** + * Get the backend's allocator. Automatically creates the allocator if + * necessary. + */ +struct wlr_allocator *backend_get_allocator(struct wlr_backend *backend); + #endif diff --git a/include/wlr/backend.h b/include/wlr/backend.h index 020be18d..025f74bd 100644 --- a/include/wlr/backend.h +++ b/include/wlr/backend.h @@ -29,6 +29,7 @@ struct wlr_backend { // Private state struct wlr_renderer *renderer; + struct wlr_allocator *allocator; }; /**