drm-backend: limit reset/restart to output of a failed commit
When a commit fails, then only the outputs that where part of this commit should be reset or restarted. Otherwise an unrelated output that has another successful pending commit may be restarted incorrectly. Then the output is in an inconsistent state and will trigger an assertion: weston: ../libweston/backend-drm/state-propose.c:627: drm_output_propose_state: Assertion `!output->state_last' failed. Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
This commit is contained in:
parent
ef175c8ed4
commit
f843ba34d1
|
@ -946,7 +946,7 @@ drm_repaint_flush_device(struct drm_device *device)
|
|||
{
|
||||
struct drm_backend *b = device->backend;
|
||||
struct drm_pending_state *pending_state;
|
||||
struct weston_output *base;
|
||||
struct drm_output_state *output_state;
|
||||
int ret;
|
||||
|
||||
pending_state = device->repaint_data;
|
||||
|
@ -964,15 +964,13 @@ drm_repaint_flush_device(struct drm_device *device)
|
|||
if (ret == 0)
|
||||
return;
|
||||
|
||||
wl_list_for_each(base, &b->compositor->output_list, link) {
|
||||
struct drm_output *tmp = to_drm_output(base);
|
||||
if (!tmp || tmp->device != device)
|
||||
continue;
|
||||
wl_list_for_each(output_state, &pending_state->output_list, link) {
|
||||
struct drm_output *tmp = output_state->output;
|
||||
|
||||
if (ret == -EBUSY)
|
||||
weston_output_schedule_repaint_restart(base);
|
||||
weston_output_schedule_repaint_restart(&tmp->base);
|
||||
else
|
||||
weston_output_schedule_repaint_reset(base);
|
||||
weston_output_schedule_repaint_reset(&tmp->base);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue