aboutsummaryrefslogtreecommitdiff
path: root/sway/desktop/output.c
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-02-22 18:38:19 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2023-02-22 13:37:44 -0500
commitc2ccc0c9d4726a2d1f23f1696c7b6aa0f6cb1a63 (patch)
treebd5c40f008c3f74dbe2c22ab047dc7b0721da51c /sway/desktop/output.c
parentd6cb4fa8de1e540c58b58d29d1520df296e46d1f (diff)
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,
return wlr_output_commit(wlr_output);
}
+static void get_frame_damage(struct sway_output *output,
+ pixman_region32_t *frame_damage) {
+ struct wlr_output *wlr_output = output->wlr_output;
+
+ int width, height;
+ wlr_output_transformed_resolution(wlr_output, &width, &height);
+
+ pixman_region32_init(frame_damage);
+
+ enum wl_output_transform transform =
+ wlr_output_transform_invert(wlr_output->transform);
+ wlr_region_transform(frame_damage, &output->damage_ring.current,
+ transform, width, height);
+
+ if (debug.damage != DAMAGE_DEFAULT) {
+ pixman_region32_union_rect(frame_damage, frame_damage,
+ 0, 0, wlr_output->width, wlr_output->height);
+ }
+}
+
static int output_repaint_timer_handler(void *data) {
struct sway_output *output = data;
- if (output->wlr_output == NULL) {
+ struct wlr_output *wlr_output = output->wlr_output;
+ if (wlr_output == NULL) {
return 0;
}
- output->wlr_output->frame_pending = false;
+ wlr_output->frame_pending = false;
struct sway_workspace *workspace = output->current.active_workspace;
if (workspace == NULL) {
@@ -575,10 +596,22 @@ static int output_repaint_timer_handler(void *data) {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
- output_render(output, &now, &damage);
+ output_render(output, &damage);
pixman_region32_fini(&damage);
+ pixman_region32_t frame_damage;
+ get_frame_damage(output, &frame_damage);
+ wlr_output_set_damage(wlr_output, &frame_damage);
+ pixman_region32_fini(&frame_damage);
+
+ if (!wlr_output_commit(wlr_output)) {
+ return 0;
+ }
+
+ wlr_damage_ring_rotate(&output->damage_ring);
+ output->last_frame = now;
+
return 0;
}