diff --git a/include/labwc.h b/include/labwc.h index 09fdca7b..29f72c39 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -406,8 +406,6 @@ struct output { bool leased; bool gamma_lut_changed; - - uint32_t nr_tearing_failures; }; #undef LAB_NR_LAYERS diff --git a/src/common/scene-helpers.c b/src/common/scene-helpers.c index 6f3ee373..1eb670ed 100644 --- a/src/common/scene-helpers.c +++ b/src/common/scene-helpers.c @@ -107,19 +107,33 @@ lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output, return false; } + if (state->tearing_page_flip) { + if (!wlr_output_test_state(wlr_output, state)) { + state->tearing_page_flip = false; + } + } + struct wlr_box additional_damage = {0}; if (state->buffer && is_magnify_on()) { magnify(output, state->buffer, &additional_damage); } - if (state == &output->pending) { - if (!output_state_commit(output)) { - wlr_log(WLR_INFO, "Failed to commit output %s", - wlr_output->name); - return false; + bool committed = wlr_output_commit_state(wlr_output, state); + /* + * Handle case where the ouput state test for tearing succeeded, + * but actual commit failed. Retry wihout tearing. + */ + if (!committed && state->tearing_page_flip) { + state->tearing_page_flip = false; + committed = wlr_output_commit_state(wlr_output, state); + } + if (committed) { + if (state == &output->pending) { + wlr_output_state_finish(&output->pending); + wlr_output_state_init(&output->pending); } - } else if (!wlr_output_commit_state(wlr_output, state)) { - wlr_log(WLR_INFO, "Failed to commit state for output %s", + } else { + wlr_log(WLR_INFO, "Failed to commit output %s", wlr_output->name); return false; } diff --git a/src/output.c b/src/output.c index cd7299b1..0eee6331 100644 --- a/src/output.c +++ b/src/output.c @@ -32,14 +32,6 @@ #include "view.h" #include "xwayland.h" -static unsigned int -get_tearing_retry_count(struct output *output) -{ - /* Two seconds worth of frames, guessing 60Hz if refresh is invalid */ - int refresh = output->wlr_output->refresh; - return refresh > 0 ? refresh / 500 : 120; -} - bool output_get_tearing_allowance(struct output *output) { @@ -57,11 +49,6 @@ output_get_tearing_allowance(struct output *output) return false; } - /* tearing should not have failed too many times */ - if (output->nr_tearing_failures >= get_tearing_retry_count(output)) { - return false; - } - /* allow tearing for any window when requested or forced */ if (rc.allow_tearing == LAB_TEARING_ENABLED) { if (view->force_tearing == LAB_STATE_UNSPECIFIED) { @@ -154,22 +141,7 @@ output_frame_notify(struct wl_listener *listener, void *data) pending->tearing_page_flip = output_get_tearing_allowance(output); - bool committed = - lab_wlr_scene_output_commit(scene_output, pending); - - if (pending->tearing_page_flip) { - if (committed) { - output->nr_tearing_failures = 0; - } else { - if (++output->nr_tearing_failures >= - get_tearing_retry_count(output)) { - wlr_log(WLR_INFO, "setting tearing allowance failed " - "for two consecutive seconds, disabling"); - } - pending->tearing_page_flip = false; - lab_wlr_scene_output_commit(scene_output, pending); - } - } + lab_wlr_scene_output_commit(scene_output, pending); } struct timespec now = { 0 };