diff options
author | Simon Ser <contact@emersion.fr> | 2023-02-22 18:38:19 +0100 |
---|---|---|
committer | Simon Zeni <simon@bl4ckb0ne.ca> | 2023-02-22 13:37:44 -0500 |
commit | c2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63 (patch) | |
tree | bd5c40f008c3f74dbe2c22ab047dc7b0721da51c /sway/desktop/output.c | |
parent | d6cb4fa8de1e540c58b58d29d1520df296e46d1f (diff) |
Move output commit out of output_render()
That way output_render() only does what it says on the tin.
Diffstat (limited to 'sway/desktop/output.c')
-rw-r--r-- | sway/desktop/output.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 302f9fda..4b6e9122 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -517,13 +517,34 @@ static bool scan_out_fullscreen_view(struct sway_output *output, return wlr_output_commit(wlr_output); } +static void get_frame_damage(struct sway_output *output, + pixman_region32_t *frame_damage) { + struct wlr_output *wlr_output = output->wlr_output; + + int width, height; + wlr_output_transformed_resolution(wlr_output, &width, &height); + + pixman_region32_init(frame_damage); + + enum wl_output_transform transform = + wlr_output_transform_invert(wlr_output->transform); + wlr_region_transform(frame_damage, &output->damage_ring.current, + transform, width, height); + + if (debug.damage != DAMAGE_DEFAULT) { + pixman_region32_union_rect(frame_damage, frame_damage, + 0, 0, wlr_output->width, wlr_output->height); + } +} + static int output_repaint_timer_handler(void *data) { struct sway_output *output = data; - if (output->wlr_output == NULL) { + struct wlr_output *wlr_output = output->wlr_output; + if (wlr_output == NULL) { return 0; } - output->wlr_output->frame_pending = false; + wlr_output->frame_pending = false; struct sway_workspace *workspace = output->current.active_workspace; if (workspace == NULL) { @@ -575,10 +596,22 @@ static int output_repaint_timer_handler(void *data) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); - output_render(output, &now, &damage); + output_render(output, &damage); pixman_region32_fini(&damage); + pixman_region32_t frame_damage; + get_frame_damage(output, &frame_damage); + wlr_output_set_damage(wlr_output, &frame_damage); + pixman_region32_fini(&frame_damage); + + if (!wlr_output_commit(wlr_output)) { + return 0; + } + + wlr_damage_ring_rotate(&output->damage_ring); + output->last_frame = now; + return 0; } |