aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2024-07-15 00:12:39 +0200
committerFurkan Sahin <furkan-dev@proton.me>2024-07-15 00:12:39 +0200
commit82f2ec9bfa3a28bfd01c5b6695947d025f2990c6 (patch)
treed922ebfad30c6877ef16b7b518b2c6d56881ccfa
parent430c56ac160a36cde21ecd64592dccbefb7a5058 (diff)
desktop/output: Stop repaint loop when not needed
4d52204b308b 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: 4d52204b308b ("desktop/output: unify page-flip codepath")
-rw-r--r--sway/desktop/output.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index f936b2a8..27ede68e 100644
--- 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)) {