From 20e6861021ddce3c12f896aa2a961a4da23f98ad Mon Sep 17 00:00:00 2001 From: emersion Date: Sun, 28 Jan 2018 22:39:24 +0100 Subject: [PATCH] Do not flush damage if swapping buffers failed This should solve issues with multiple outputs on DRM backend. --- backend/drm/drm.c | 2 +- rootston/output.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 024bc929..a9cfa276 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -210,7 +210,7 @@ static bool wlr_drm_connector_swap_buffers(struct wlr_output *output) { if (conn->pageflip_pending) { wlr_log(L_ERROR, "Skipping pageflip"); - return true; + return false; } if (drm->iface->crtc_pageflip(drm, conn, crtc, fb_id, NULL)) { diff --git a/rootston/output.c b/rootston/output.c index 14840e5b..04a45d1f 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -387,7 +387,9 @@ static void render_output(struct roots_output *output) { } int buffer_age = -1; - wlr_output_make_current(wlr_output, &buffer_age); + if (!wlr_output_make_current(wlr_output, &buffer_age)) { + return; + } int width, height; output_get_transformed_size(output->wlr_output, &width, &height); @@ -482,7 +484,9 @@ static void render_output(struct roots_output *output) { renderer_end: wlr_renderer_scissor(output->desktop->server->renderer, NULL); wlr_renderer_end(server->renderer); - wlr_output_swap_buffers(wlr_output, &now, &damage); + if (!wlr_output_swap_buffers(wlr_output, &now, &damage)) { + goto damage_finish; + } // same as decrementing, but works on unsigned integers output->previous_damage_idx += ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN - 1; output->previous_damage_idx %= ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN;