make rendermon more straightforward

Prior to damage tracking, we had to make sure wlr_output_commit was
called even if we weren't rendering anything new.  If we didn't, then
nothing would render after attempting the first window resize.  This is
no longer a problem (maybe because adding damage schedules another frame
callback?), so we can do some normal early-returns here.
This commit is contained in:
Devin J. Pohly 2021-01-19 02:17:57 -06:00 committed by Miles Breslin
parent 38fe384783
commit 8616d947b7

32
dwl.c
View File

@ -1758,7 +1758,7 @@ void
rendermon(struct wl_listener *listener, void *data)
{
Client *c;
int render = 1;
int render;
bool needs_frame;
pixman_region32_t damage;
@ -1769,19 +1769,26 @@ rendermon(struct wl_listener *listener, void *data)
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
/* Do not render if any XDG clients have an outstanding resize. */
/* If there is any XDG client which is awaiting resize, request a new
* frame from that client, and do not render anything new until there
* are no pending resizes remaining. */
wl_list_for_each(c, &stack, slink) {
if (c->resize) {
wlr_surface_send_frame_done(client_surface(c), &now);
render = 0;
}
}
pixman_region32_init(&damage);
if (!wlr_output_damage_attach_render(m->damage, &needs_frame, &damage))
return;
}
}
/* Do not render if no new frame is needed */
pixman_region32_init(&damage);
render = wlr_output_damage_attach_render(m->damage, &needs_frame, &damage);
pixman_region32_fini(&damage);
if (!render || !needs_frame) {
/* Rollback is needed because attach_render is double-buffered */
wlr_output_rollback(m->wlr_output);
return;
}
if (render && needs_frame) {
/* 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);
@ -1806,14 +1813,7 @@ rendermon(struct wl_listener *listener, void *data)
/* Conclude rendering and swap the buffers, showing the final frame
* on-screen. */
wlr_renderer_end(drw);
wlr_output_set_damage(m->wlr_output, &m->damage->current);
} else {
wlr_output_rollback(m->wlr_output);
}
pixman_region32_fini(&damage);
wlr_output_commit(m->wlr_output);
}