From ed8961b30976be8c5fc117d0b748a432e094f72d Mon Sep 17 00:00:00 2001 From: Austin Shafer Date: Thu, 1 Feb 2024 17:55:04 -0500 Subject: [PATCH] backend/drm: always create multigpu renderers Multi-gpu code needs a context for each GPU in the system, but as of now we only create renderers for secondary devices. This always creates the multigpu renderer so we can use it for copying. --- backend/drm/backend.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/backend/drm/backend.c b/backend/drm/backend.c index 27e5585dc..848f1046e 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -53,9 +53,7 @@ static void backend_destroy(struct wlr_backend *backend) { wl_list_remove(&drm->dev_change.link); wl_list_remove(&drm->dev_remove.link); - if (drm->parent) { - finish_drm_renderer(&drm->mgpu_renderer); - } + finish_drm_renderer(&drm->mgpu_renderer); finish_drm_resources(drm); @@ -210,22 +208,20 @@ struct wlr_backend *wlr_drm_backend_create(struct wlr_session *session, goto error_event; } - if (drm->parent) { - if (!init_drm_renderer(drm, &drm->mgpu_renderer)) { - wlr_log(WLR_ERROR, "Failed to initialize renderer"); - goto error_resources; - } - - // We'll perform a multi-GPU copy for all submitted buffers, we need - // to be able to texture from them - struct wlr_renderer *renderer = drm->mgpu_renderer.wlr_rend; - const struct wlr_drm_format_set *texture_formats = - wlr_renderer_get_dmabuf_texture_formats(renderer); - if (texture_formats == NULL) { - wlr_log(WLR_ERROR, "Failed to query renderer texture formats"); - goto error_mgpu_renderer; - } + if (!init_drm_renderer(drm, &drm->mgpu_renderer)) { + wlr_log(WLR_ERROR, "Failed to initialize renderer"); + goto error_resources; + } + // We'll perform a multi-GPU copy for all submitted buffers, we need + // to be able to texture from them + struct wlr_renderer *renderer = drm->mgpu_renderer.wlr_rend; + const struct wlr_drm_format_set *texture_formats = + wlr_renderer_get_dmabuf_texture_formats(renderer); + // Some configurations (alpine CI job) will have a renderer here that does not + // support dmabuf formats. We don't want to fail creation of the drm backend + // as a result of this, we simply don't populate the format set in that case. + if (texture_formats) { // Forbid implicit modifiers, because their meaning changes from one // GPU to another. for (size_t i = 0; i < texture_formats->len; i++) { @@ -245,8 +241,6 @@ struct wlr_backend *wlr_drm_backend_create(struct wlr_session *session, return &drm->backend; -error_mgpu_renderer: - finish_drm_renderer(&drm->mgpu_renderer); error_resources: finish_drm_resources(drm); error_event: