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
This commit is contained in:
emersion 2018-12-01 10:56:35 +01:00
parent a22311ec76
commit 6aaefad40d
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
3 changed files with 12 additions and 14 deletions

View file

@ -121,7 +121,7 @@ struct wlr_output {
struct wlr_output_event_swap_buffers { struct wlr_output_event_swap_buffers {
struct wlr_output *output; struct wlr_output *output;
struct timespec *when; struct timespec *when;
pixman_region32_t *damage; pixman_region32_t *damage; // output-buffer-local coordinates
}; };
enum wlr_output_present_flag { 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. If the compositor doesn't support damage tracking, set `damage` to
* NULL. * NULL.
* *
* Damage is given in output-buffer-local coordinates (ie. scaled and
* transformed).
*
* Swapping buffers schedules a `frame` event. * Swapping buffers schedules a `frame` event.
*/ */
bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when,

View file

@ -522,12 +522,17 @@ renderer_end:
wlr_renderer_scissor(renderer, NULL); wlr_renderer_scissor(renderer, NULL);
wlr_renderer_end(renderer); wlr_renderer_end(renderer);
int width, height;
wlr_output_transformed_resolution(wlr_output, &width, &height);
if (server->config->debug_damage_tracking) { 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); 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)) { if (!wlr_output_damage_swap_buffers(output->damage, &now, &damage)) {
goto damage_finish; goto damage_finish;
} }

View file

@ -365,9 +365,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when,
output->idle_frame = NULL; output->idle_frame = NULL;
} }
int width, height;
wlr_output_transformed_resolution(output, &width, &height);
struct timespec now; struct timespec now;
if (when == NULL) { if (when == NULL) {
clock_gettime(CLOCK_MONOTONIC, &now); 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_t render_damage;
pixman_region32_init(&render_damage); pixman_region32_init(&render_damage);
pixman_region32_union_rect(&render_damage, &render_damage, 0, 0, pixman_region32_union_rect(&render_damage, &render_damage, 0, 0,
width, height); output->width, output->height);
if (damage != NULL) { if (damage != NULL) {
// Damage tracking supported // Damage tracking supported
pixman_region32_intersect(&render_damage, &render_damage, damage); 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)) { if (!output->impl->swap_buffers(output, damage ? &render_damage : NULL)) {
pixman_region32_fini(&render_damage); pixman_region32_fini(&render_damage);
return false; return false;