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_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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue