mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-29 16:05:59 +01:00
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:
parent
a22311ec76
commit
6aaefad40d
3 changed files with 12 additions and 14 deletions
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue