From b06d58fa8b6bb5d9a154f795ec595477e13998bc Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Fri, 17 Nov 2023 14:34:32 -0500 Subject: [PATCH] backend/drm: Destroy page flips on backend destroy When we destroy the backend, page flips will no longer be invoked meaning those won't clean up the page flips for us. --- backend/drm/backend.c | 5 +++++ backend/drm/drm.c | 6 +++--- include/backend/drm/drm.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/drm/backend.c b/backend/drm/backend.c index 5ff2b90c..40597dae 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -39,6 +39,11 @@ static void backend_destroy(struct wlr_backend *backend) { destroy_drm_connector(conn); } + struct wlr_drm_page_flip *page_flip, *page_flip_tmp; + wl_list_for_each_safe(page_flip, page_flip_tmp, &drm->page_flips, link) { + drm_page_flip_destroy(page_flip); + } + wlr_backend_finish(backend); wl_list_remove(&drm->display_destroy.link); diff --git a/backend/drm/drm.c b/backend/drm/drm.c index eb9e8267..0af93802 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -420,7 +420,7 @@ static void drm_connector_set_pending_page_flip(struct wlr_drm_connector *conn, conn->pending_page_flip = page_flip; } -static void page_flip_destroy(struct wlr_drm_page_flip *page_flip) { +void drm_page_flip_destroy(struct wlr_drm_page_flip *page_flip) { if (!page_flip) { return; } @@ -476,7 +476,7 @@ static bool drm_crtc_commit(struct wlr_drm_connector *conn, drm_fb_clear(&layer->pending_fb); } - page_flip_destroy(page_flip); + drm_page_flip_destroy(page_flip); } return ok; } @@ -1696,7 +1696,7 @@ static void handle_page_flip(int fd, unsigned seq, if (conn != NULL) { conn->pending_page_flip = NULL; } - page_flip_destroy(page_flip); + drm_page_flip_destroy(page_flip); if (conn == NULL) { return; diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h index eef778df..4718eee0 100644 --- a/include/backend/drm/drm.h +++ b/include/backend/drm/drm.h @@ -193,6 +193,7 @@ bool drm_connector_supports_vrr(struct wlr_drm_connector *conn); size_t drm_crtc_get_gamma_lut_size(struct wlr_drm_backend *drm, struct wlr_drm_crtc *crtc); void drm_lease_destroy(struct wlr_drm_lease *lease); +void drm_page_flip_destroy(struct wlr_drm_page_flip *page_flip); struct wlr_drm_fb *get_next_cursor_fb(struct wlr_drm_connector *conn); struct wlr_drm_layer *get_drm_layer(struct wlr_drm_backend *drm,