aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/output.c
diff options
context:
space:
mode:
authorLibravatar Simon Ser <contact@emersion.fr>2023-02-22 18:38:19 +0100
committerLibravatar Simon Zeni <simon@bl4ckb0ne.ca>2023-02-22 13:37:44 -0500
commitc2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63 (patch)
treebd5c40f008c3f74dbe2c22ab047dc7b0721da51c /sway/desktop/output.c
parentConstify pixman_region32_t for rendering functions (diff)
downloadsway-c2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63.tar.gz
sway-c2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63.tar.zst
sway-c2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63.zip
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.c39
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,
517 return wlr_output_commit(wlr_output); 517 return wlr_output_commit(wlr_output);
518} 518}
519 519
520static void get_frame_damage(struct sway_output *output,
521 pixman_region32_t *frame_damage) {
522 struct wlr_output *wlr_output = output->wlr_output;
523
524 int width, height;
525 wlr_output_transformed_resolution(wlr_output, &width, &height);
526
527 pixman_region32_init(frame_damage);
528
529 enum wl_output_transform transform =
530 wlr_output_transform_invert(wlr_output->transform);
531 wlr_region_transform(frame_damage, &output->damage_ring.current,
532 transform, width, height);
533
534 if (debug.damage != DAMAGE_DEFAULT) {
535 pixman_region32_union_rect(frame_damage, frame_damage,
536 0, 0, wlr_output->width, wlr_output->height);
537 }
538}
539
520static int output_repaint_timer_handler(void *data) { 540static int output_repaint_timer_handler(void *data) {
521 struct sway_output *output = data; 541 struct sway_output *output = data;
522 if (output->wlr_output == NULL) { 542 struct wlr_output *wlr_output = output->wlr_output;
543 if (wlr_output == NULL) {
523 return 0; 544 return 0;
524 } 545 }
525 546
526 output->wlr_output->frame_pending = false; 547 wlr_output->frame_pending = false;
527 548
528 struct sway_workspace *workspace = output->current.active_workspace; 549 struct sway_workspace *workspace = output->current.active_workspace;
529 if (workspace == NULL) { 550 if (workspace == NULL) {
@@ -575,10 +596,22 @@ static int output_repaint_timer_handler(void *data) {
575 struct timespec now; 596 struct timespec now;
576 clock_gettime(CLOCK_MONOTONIC, &now); 597 clock_gettime(CLOCK_MONOTONIC, &now);
577 598
578 output_render(output, &now, &damage); 599 output_render(output, &damage);
579 600
580 pixman_region32_fini(&damage); 601 pixman_region32_fini(&damage);
581 602
603 pixman_region32_t frame_damage;
604 get_frame_damage(output, &frame_damage);
605 wlr_output_set_damage(wlr_output, &frame_damage);
606 pixman_region32_fini(&frame_damage);
607
608 if (!wlr_output_commit(wlr_output)) {
609 return 0;
610 }
611
612 wlr_damage_ring_rotate(&output->damage_ring);
613 output->last_frame = now;
614
582 return 0; 615 return 0;
583} 616}
584 617