libweston: Reset repaint schedule for all repainted outputs when repaint cancel

All outputs is canceled repaint when a output repaint is failed. At that
time, the output whose repaint is success is not scheduled because the
repaint status of that is still REPAINT_AWAITING_COMPLETION. Therefore,
we need to reset repaint schedule for all repainted outputs.

Signed-off-by: Tomohito Esaki <etom@igel.co.jp>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
Tomohito Esaki 2018-06-05 10:37:06 +09:00 committed by Pekka Paalanen
parent 09bfcd6e1e
commit 7f4d9ffefa
2 changed files with 11 additions and 0 deletions

View file

@ -2450,6 +2450,8 @@ weston_output_maybe_repaint(struct weston_output *output, struct timespec *now,
int ret = 0;
int64_t msec_to_repaint;
output->repainted = false;
/* We're not ready yet; come back to make a decision later. */
if (output->repaint_status != REPAINT_SCHEDULED)
return ret;
@ -2479,6 +2481,7 @@ weston_output_maybe_repaint(struct weston_output *output, struct timespec *now,
if (ret != 0)
goto err;
output->repainted = true;
return ret;
err:
@ -2550,6 +2553,11 @@ output_repaint_timer_handler(void *data)
compositor->backend->repaint_flush(compositor,
repaint_data);
} else {
wl_list_for_each(output, &compositor->output_list, link) {
if (output->repainted)
weston_output_schedule_repaint_reset(output);
}
if (compositor->backend->repaint_cancel)
compositor->backend->repaint_cancel(compositor,
repaint_data);

View file

@ -212,6 +212,9 @@ struct weston_output {
* if set, a repaint will eventually occur. */
bool repaint_needed;
/** Used only between repaint_begin and repaint_cancel. */
bool repainted;
/** State of the repaint loop */
enum {
REPAINT_NOT_SCHEDULED = 0, /**< idle; no repaint will occur */