From 66712009fb67f655950f1710de0e7a7d9574964b Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 22 Jul 2025 17:18:55 +0200 Subject: [PATCH] kms/surface: Only skip cursor updates if the application renders consistently --- src/backend/kms/surface/mod.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 583c8530..1935805b 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -11,7 +11,10 @@ use crate::{ state::SurfaceDmabufFeedback, utils::prelude::*, wayland::{ - handlers::screencopy::{submit_buffer, FrameHolder, SessionData}, + handlers::{ + compositor::recursive_frame_time_estimation, + screencopy::{submit_buffer, FrameHolder, SessionData}, + }, protocols::screencopy::{ FailureReason, Frame as ScreencopyFrame, SessionRef as ScreencopySessionRef, }, @@ -969,13 +972,24 @@ impl SurfaceThreadState { let mut additional_frame_flags = FrameFlags::empty(); let mut remove_frame_flags = FrameFlags::empty(); - let has_active_fullscreen = { + let (has_active_fullscreen, fullscreen_drives_refresh_rate) = { let shell = self.shell.read(); let output = self.mirroring.as_ref().unwrap_or(&self.output); if let Some((_, workspace)) = shell.workspaces.active(output) { - workspace.get_fullscreen().is_some() + if let Some(fullscreen_surface) = workspace.get_fullscreen() { + const _30_FPS: Duration = Duration::from_nanos(1_000_000_000 / 30); + ( + true, + fullscreen_surface.wl_surface().is_some_and(|surface| { + recursive_frame_time_estimation(&self.clock, &*surface) + .is_some_and(|dur| dur <= _30_FPS) + }), + ) + } else { + (false, false) + } } else { - false + (false, false) } }; @@ -1009,7 +1023,8 @@ impl SurfaceThreadState { anyhow::format_err!("Failed to accumulate elements for rendering: {:?}", err) })?; - if vrr && has_active_fullscreen && !self.timings.past_min_render_time(&self.clock) { + if vrr && fullscreen_drives_refresh_rate && !self.timings.past_min_render_time(&self.clock) + { additional_frame_flags |= FrameFlags::SKIP_CURSOR_ONLY_UPDATES; }; self.timings.set_vrr(vrr);