backend-drm: improve atomic commit failure handling
When an atomic commit fails then the output will be stuck in REPAINT_AWAITING_COMPLETION state. It is waiting for a vblank event that was never scheduled. If the error is EBUSY then it can be expected to be a transient error. So call weston_output_repaint_failed() to reset the state. The next update will then trigger a new commit that will hopefully succeed.
This is necessary because there are some circumstances when the commit can fail unexpectedly:
- With
state_invalid == true
one commit will disable all planes. If another commit for a different output is triggered immediately afterwards, then this commit can temporarily fail with EBUSY because it tries to use the same planes. - At least with i915, if one commit enables an output then a second commit for a different output immediately afterwards can temporarily fail with EBUSY. This is probably caused by some hardware interdependency.