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..a672bb56 100644 --- a/src/common/scene-helpers.c +++ b/src/common/scene-helpers.c @@ -107,6 +107,14 @@ 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)) { + wlr_log(WLR_DEBUG, "Output test for tearing failed on %s, " + "trying page-flip without tearing", wlr_output->name); + state->tearing_page_flip = false; + } + } + struct wlr_box additional_damage = {0}; if (state->buffer && is_magnify_on()) { magnify(output, state->buffer, &additional_damage); 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 };