From 6aaefad40db8b4c972d30a5841c1ff819bb0da09 Mon Sep 17 00:00:00 2001 From: emersion Date: Sat, 1 Dec 2018 10:56:35 +0100 Subject: [PATCH] output: switch swap_buffers damage to output-buffer-local coords This is one more step towards [1]. This gives more freedom to the compositor wrt. how it handles damage. [1]: https://github.com/swaywm/wlroots/issues/1363 --- include/wlr/types/wlr_output.h | 5 ++++- rootston/output.c | 9 +++++++-- types/wlr_output.c | 12 +----------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 6d38152a..22822b11 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -121,7 +121,7 @@ struct wlr_output { struct wlr_output_event_swap_buffers { struct wlr_output *output; struct timespec *when; - pixman_region32_t *damage; + pixman_region32_t *damage; // output-buffer-local coordinates }; enum wlr_output_present_flag { @@ -203,6 +203,9 @@ bool wlr_output_preferred_read_format(struct wlr_output *output, * NULL. If the compositor doesn't support damage tracking, set `damage` to * NULL. * + * Damage is given in output-buffer-local coordinates (ie. scaled and + * transformed). + * * Swapping buffers schedules a `frame` event. */ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, diff --git a/rootston/output.c b/rootston/output.c index 9ca55447..7017bd1f 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -522,12 +522,17 @@ renderer_end: wlr_renderer_scissor(renderer, NULL); wlr_renderer_end(renderer); + int width, height; + wlr_output_transformed_resolution(wlr_output, &width, &height); + if (server->config->debug_damage_tracking) { - int width, height; - wlr_output_transformed_resolution(wlr_output, &width, &height); pixman_region32_union_rect(&damage, &damage, 0, 0, width, height); } + enum wl_output_transform transform = + wlr_output_transform_invert(wlr_output->transform); + wlr_region_transform(&damage, &damage, transform, width, height); + if (!wlr_output_damage_swap_buffers(output->damage, &now, &damage)) { goto damage_finish; } diff --git a/types/wlr_output.c b/types/wlr_output.c index dc8e34b8..a778e5f2 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -365,9 +365,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, output->idle_frame = NULL; } - int width, height; - wlr_output_transformed_resolution(output, &width, &height); - struct timespec now; if (when == NULL) { clock_gettime(CLOCK_MONOTONIC, &now); @@ -384,19 +381,12 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, pixman_region32_t render_damage; pixman_region32_init(&render_damage); pixman_region32_union_rect(&render_damage, &render_damage, 0, 0, - width, height); + output->width, output->height); if (damage != NULL) { // Damage tracking supported pixman_region32_intersect(&render_damage, &render_damage, damage); } - // Transform damage into renderer coordinates, ie. upside down - // TODO: take transformed coords, make the renderer flip the damage - enum wl_output_transform transform = - wlr_output_transform_invert(output->transform); - wlr_region_transform(&render_damage, &render_damage, transform, - width, height); - if (!output->impl->swap_buffers(output, damage ? &render_damage : NULL)) { pixman_region32_fini(&render_damage); return false;