From 28e90246811ecd2decad17bd6fd8af2afee62fca Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 19 Aug 2025 12:45:07 -0700 Subject: [PATCH] kms/surface: Define a `PendingImageCopyData`, instead of using tuple Adding anything else to this tuple is awkward; defining a simple struct makes this cleaner. This also adds a `sync` property, which will come in handy later. Containing simply the same-named argument that was passed to `submit_buffer`. --- src/backend/kms/device.rs | 10 ++++------ src/backend/kms/surface/mod.rs | 17 +++++++++-------- src/backend/render/mod.rs | 8 ++++++-- src/wayland/handlers/screencopy/render.rs | 23 +++++++++++++++-------- 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index 7b356874..3785f862 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -8,7 +8,7 @@ use crate::{ config::{AdaptiveSync, EdidProduct, OutputConfig, OutputState, ScreenFilter}, shell::Shell, utils::{env::dev_list_var, prelude::*}, - wayland::protocols::screencopy::Frame, + wayland::handlers::screencopy::PendingImageCopyData, }; use anyhow::{Context, Result}; @@ -39,9 +39,7 @@ use smithay::{ rustix::fs::OFlags, wayland_server::{protocol::wl_buffer::WlBuffer, DisplayHandle, Weak}, }, - utils::{ - Buffer as BufferCoords, Clock, DevPath, DeviceFd, Monotonic, Point, Rectangle, Transform, - }, + utils::{Clock, DevPath, DeviceFd, Monotonic, Point, Transform}, wayland::drm_lease::{DrmLease, DrmLeaseState}, }; use tracing::{error, info, warn}; @@ -71,7 +69,7 @@ pub type LockedGbmDrmOutputManager<'a> = LockedDrmOutputManager< GbmFramebufferExporter, Option<( OutputPresentationFeedback, - Receiver<(Frame, Vec>)>, + Receiver, Duration, )>, DrmDeviceFd, @@ -82,7 +80,7 @@ pub type GbmDrmOutputManager = DrmOutputManager< GbmFramebufferExporter, Option<( OutputPresentationFeedback, - Receiver<(Frame, Vec>)>, + Receiver, Duration, )>, DrmDeviceFd, diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 5cd08519..41d95cf2 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -13,7 +13,7 @@ use crate::{ wayland::{ handlers::{ compositor::recursive_frame_time_estimation, - screencopy::{submit_buffer, FrameHolder, SessionData}, + screencopy::{submit_buffer, FrameHolder, PendingImageCopyData, SessionData}, }, protocols::screencopy::{ FailureReason, Frame as ScreencopyFrame, SessionRef as ScreencopySessionRef, @@ -78,7 +78,7 @@ use smithay::{ }, wayland_server::protocol::wl_surface::WlSurface, }, - utils::{Buffer as BufferCoords, Clock, Monotonic, Physical, Point, Rectangle, Transform}, + utils::{Clock, Monotonic, Physical, Point, Rectangle, Transform}, wayland::{ dmabuf::{get_dmabuf, DmabufFeedbackBuilder}, presentation::Refresh, @@ -172,7 +172,7 @@ pub type GbmDrmOutput = DrmOutput< GbmFramebufferExporter, Option<( OutputPresentationFeedback, - Receiver<(ScreencopyFrame, Vec>)>, + Receiver, Duration, )>, DrmDeviceFd, @@ -819,7 +819,7 @@ impl SurfaceThreadState { self.timings.presented(clock); - while let Ok((frame, damage)) = frames.recv() { + while let Ok(PendingImageCopyData { frame, damage, .. }) = frames.recv() { frame.success(self.output.current_transform(), damage, clock); } } @@ -1635,7 +1635,7 @@ fn send_screencopy_result<'a>( renderer: &mut GlMultiRenderer<'a>, output: &Output, pre_postprocess_data: &mut PrePostprocessData, - tx: &std::sync::mpsc::Sender<(ScreencopyFrame, Vec>)>, + tx: &std::sync::mpsc::Sender, frame_result: &RenderFrameResult>>, elements: &[CosmicElement], (session, frame, res): ( @@ -1807,7 +1807,7 @@ fn send_screencopy_result<'a>( let transform = output.current_transform(); - if let Some((frame, damage)) = submit_buffer( + if let Some(data) = submit_buffer( frame, renderer, shm_buffer.then_some(fb.as_mut().unwrap()), @@ -1816,9 +1816,10 @@ fn send_screencopy_result<'a>( sync, )? { if frame_result.is_empty { - frame.success(transform, damage, presentation_time); + data.frame + .success(transform, data.damage, presentation_time); } else { - let _ = tx.send((frame, damage)); + let _ = tx.send(data); } } diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index 3883fce4..d844e681 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -28,7 +28,7 @@ use crate::{ handlers::{ compositor::FRAME_TIME_FILTER, data_device::get_dnd_icon, - screencopy::{render_session, FrameHolder, SessionData}, + screencopy::{render_session, FrameHolder, PendingImageCopyData, SessionData}, }, protocols::workspace::WorkspaceHandle, }, @@ -1332,7 +1332,11 @@ where match result { Ok((res, mut elements)) => { for (session, frame) in output.take_pending_frames() { - if let Some((frame, damage)) = render_session::<_, _, GlesTexture>( + if let Some(PendingImageCopyData { frame, damage, .. }) = render_session::< + _, + _, + GlesTexture, + >( renderer, &session.user_data().get::().unwrap(), frame, diff --git a/src/wayland/handlers/screencopy/render.rs b/src/wayland/handlers/screencopy/render.rs index 79af623a..14263980 100644 --- a/src/wayland/handlers/screencopy/render.rs +++ b/src/wayland/handlers/screencopy/render.rs @@ -54,6 +54,12 @@ use crate::{ use super::{super::data_device::get_dnd_icon, user_data::SessionHolder}; +pub struct PendingImageCopyData { + pub frame: Frame, + pub damage: Vec>, + pub sync: SyncPoint, +} + pub fn submit_buffer( frame: Frame, renderer: &mut R, @@ -61,7 +67,7 @@ pub fn submit_buffer( transform: Transform, damage: Option<&[Rectangle]>, sync: SyncPoint, -) -> Result>)>, R::Error> +) -> Result, R::Error> where R: ExportMem, R::Error: FromGlesError, @@ -124,16 +130,17 @@ where } } - Ok(Some(( + Ok(Some(PendingImageCopyData { frame, - damage + damage: damage .into_iter() .map(|rect| { let logical = rect.to_logical(1); logical.to_buffer(1, transform, &logical.size) }) .collect(), - ))) + sync, + })) } pub fn render_session( @@ -142,7 +149,7 @@ pub fn render_session( frame: Frame, transform: Transform, render_fn: F, -) -> Result>)>, DTError> +) -> Result, DTError> where R: ExportMem + Offscreen, R::Error: FromGlesError, @@ -430,7 +437,7 @@ pub fn render_workspace_to_buffer( } }; - if let Some((frame, damage)) = result { + if let Some(PendingImageCopyData { frame, damage, .. }) = result { frame.success(transform, damage, common.clock.now()) } } @@ -661,7 +668,7 @@ pub fn render_window_to_buffer( }, }; - if let Some((frame, damage)) = result { + if let Some(PendingImageCopyData { frame, damage, .. }) = result { frame.success(Transform::Normal, damage, common.clock.now()) } } @@ -817,7 +824,7 @@ pub fn render_cursor_to_buffer( } }; - if let Some((frame, damage)) = result { + if let Some(PendingImageCopyData { frame, damage, .. }) = result { frame.success(Transform::Normal, damage, common.clock.now()) } }