commit 3f327b3db0c1fc6985c0ed3231e1bd6296584dad
parent a3a9ec1211fcf857aa2e047f9a1c1388d17194c3
Author: Kenny Levinsen <kl@kl.wtf>
Date: Mon, 15 Jul 2024 00:12:39 +0200
desktop/output: Stop repaint loop when not needed
1e0031781fc9 refactored repaint to accumulate all changes in a single
wlr_output_state and commit them at the end of the repaint loop,
replacing a call to wlr_scene_output_commit. wlr_scene_output_commit
contains an early bail-out when no frame has been requested and no
damage has accumulated, which was not replicated as part of this
refactor, causing the repaint loop to never pause.
Replicate the logic to stop the repaint loop as needed.
Fixes: 1e0031781fc9 ("desktop/output: unify page-flip codepath")
Diffstat:
1 file changed, 7 insertions(+), 0 deletions(-)
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
@@ -247,6 +247,13 @@ static int output_repaint_timer_handler(void *data) {
.color_transform = output->color_transform,
};
+ struct wlr_output *wlr_output = output->wlr_output;
+ struct wlr_scene_output *scene_output = output->scene_output;
+ if (!wlr_output->needs_frame && !output->gamma_lut_changed &&
+ !pixman_region32_not_empty(&scene_output->pending_commit_damage)) {
+ return 0;
+ }
+
struct wlr_output_state pending;
wlr_output_state_init(&pending);
if (!wlr_scene_output_build_state(output->scene_output, &pending, &opts)) {