forked from mirror/dwl
handle ephemeral pageflip failures
If a transient failure occurs in wlr_output_commit, re-render until it doesn't happen. This could possibly be removed if we decide to implement damage tracking in the future.
This commit is contained in:
parent
60c40c0989
commit
823cefd292
1 changed files with 29 additions and 25 deletions
54
dwl.c
54
dwl.c
|
@ -1726,38 +1726,42 @@ rendermon(struct wl_listener *listener, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
/* wlr_output_attach_render makes the OpenGL context current. */
|
||||
if (!wlr_output_attach_render(m->wlr_output, NULL))
|
||||
return;
|
||||
/* HACK: This loop is the simplest way to handle ephemeral pageflip
|
||||
* failures but probably not the best. Revisit if damage tracking is
|
||||
* added. */
|
||||
do {
|
||||
/* wlr_output_attach_render makes the OpenGL context current. */
|
||||
if (!wlr_output_attach_render(m->wlr_output, NULL))
|
||||
return;
|
||||
|
||||
if (render) {
|
||||
/* Begin the renderer (calls glViewport and some other GL sanity checks) */
|
||||
wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height);
|
||||
wlr_renderer_clear(drw, rootcolor);
|
||||
if (render) {
|
||||
/* Begin the renderer (calls glViewport and some other GL sanity checks) */
|
||||
wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height);
|
||||
wlr_renderer_clear(drw, rootcolor);
|
||||
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &now);
|
||||
renderclients(m, &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM], &now);
|
||||
renderclients(m, &now);
|
||||
#ifdef XWAYLAND
|
||||
renderindependents(m->wlr_output, &now);
|
||||
renderindependents(m->wlr_output, &now);
|
||||
#endif
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &now);
|
||||
renderlayer(&m->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &now);
|
||||
|
||||
/* Hardware cursors are rendered by the GPU on a separate plane, and can be
|
||||
* moved around without re-rendering what's beneath them - which is more
|
||||
* efficient. However, not all hardware supports hardware cursors. For this
|
||||
* reason, wlroots provides a software fallback, which we ask it to render
|
||||
* here. wlr_cursor handles configuring hardware vs software cursors for you,
|
||||
* and this function is a no-op when hardware cursors are in use. */
|
||||
wlr_output_render_software_cursors(m->wlr_output, NULL);
|
||||
/* Hardware cursors are rendered by the GPU on a separate plane, and can be
|
||||
* moved around without re-rendering what's beneath them - which is more
|
||||
* efficient. However, not all hardware supports hardware cursors. For this
|
||||
* reason, wlroots provides a software fallback, which we ask it to render
|
||||
* here. wlr_cursor handles configuring hardware vs software cursors for you,
|
||||
* and this function is a no-op when hardware cursors are in use. */
|
||||
wlr_output_render_software_cursors(m->wlr_output, NULL);
|
||||
|
||||
/* Conclude rendering and swap the buffers, showing the final frame
|
||||
* on-screen. */
|
||||
wlr_renderer_end(drw);
|
||||
}
|
||||
/* Conclude rendering and swap the buffers, showing the final frame
|
||||
* on-screen. */
|
||||
wlr_renderer_end(drw);
|
||||
}
|
||||
|
||||
wlr_output_commit(m->wlr_output);
|
||||
} while (!wlr_output_commit(m->wlr_output));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue