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;
}
#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)
{
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) {
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 };