diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 3c20a4b6a..5fbf2fe79 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -1072,7 +1072,7 @@ impl SurfaceThreadState { let frames = self .mirroring .is_none() - .then(|| take_screencopy_frames(&self.output, &mut elements, &mut has_cursor_mode_none)) + .then(|| take_screencopy_frames(&self.output, &elements, &mut has_cursor_mode_none)) .unwrap_or_default(); // actual rendering @@ -1345,13 +1345,6 @@ impl SurfaceThreadState { (&session, frame, res), now.into(), ) { - session - .user_data() - .get::() - .unwrap() - .lock() - .unwrap() - .reset(); tracing::warn!(?err, "Failed to screencopy"); } } @@ -1380,14 +1373,7 @@ impl SurfaceThreadState { } } Err(err) => { - for (session, frame, _) in frames { - session - .user_data() - .get::() - .unwrap() - .lock() - .unwrap() - .reset(); + for (_session, frame, _) in frames { frame.fail(FailureReason::Unknown); } return Err(err).with_context(|| "Failed to submit result for display"); @@ -1591,10 +1577,9 @@ fn get_surface_dmabuf_feedback( } } -// TODO: Don't mutate `elements` fn take_screencopy_frames( output: &Output, - elements: &mut Vec>, + elements: &[CosmicElement], has_cursor_mode_none: &mut bool, ) -> Vec<( ScreencopySessionRef, @@ -1609,7 +1594,15 @@ fn take_screencopy_frames( let session_data = session.user_data().get::().unwrap(); let mut damage_tracking = session_data.lock().unwrap(); - let old_len = if !additional_damage.is_empty() { + let buffer = frame.buffer(); + let age = if matches!(buffer_type(&buffer), Some(BufferType::Shm)) { + // TODO re-use offscreen buffer to damage track screencopy to shm + 0 + } else { + 1 + }; + + if !additional_damage.is_empty() { let area = output .current_mode() .unwrap() @@ -1619,41 +1612,26 @@ fn take_screencopy_frames( .to_buffer(1, Transform::Normal) .to_f64(); - let old_len = elements.len(); - elements.extend( - additional_damage - .into_iter() - .map(|rect| { - rect.to_f64() - .to_logical( - output.current_scale().fractional_scale(), - output.current_transform(), - &area, - ) - .to_i32_round() - }) - .map(DamageElement::new) - .map(Into::into), - ); - - Some(old_len) - } else { - None + let additional_damage_elements: Vec<_> = additional_damage + .into_iter() + .map(|rect| { + rect.to_f64() + .to_logical( + output.current_scale().fractional_scale(), + output.current_transform(), + &area, + ) + .to_i32_round() + }) + .map(DamageElement::new) + .collect(); + let _ = damage_tracking + .dt + .damage_output(age, &additional_damage_elements); }; - let buffer = frame.buffer(); - let age = if matches!(buffer_type(&frame.buffer()), Some(BufferType::Shm)) { - // TODO re-use offscreen buffer to damage track screencopy to shm - 0 - } else { - damage_tracking.age_for_buffer(&buffer) - }; let res = damage_tracking.dt.damage_output(age, &elements); - if let Some(old_len) = old_len { - elements.truncate(old_len); - } - if !session.draw_cursor() { *has_cursor_mode_none = true; } diff --git a/src/backend/render/element.rs b/src/backend/render/element.rs index 767e223a3..21ed22c74 100644 --- a/src/backend/render/element.rs +++ b/src/backend/render/element.rs @@ -32,7 +32,6 @@ where Cursor(RescaleRenderElement>>), Dnd(WaylandSurfaceRenderElement), MoveGrab(RescaleRenderElement>), - AdditionalDamage(DamageElement), Postprocess( CropRenderElement>>, ), @@ -53,7 +52,6 @@ where CosmicElement::Cursor(elem) => elem.id(), CosmicElement::Dnd(elem) => elem.id(), CosmicElement::MoveGrab(elem) => elem.id(), - CosmicElement::AdditionalDamage(elem) => elem.id(), CosmicElement::Postprocess(elem) => elem.id(), CosmicElement::Zoom(elem) => elem.id(), #[cfg(feature = "debug")] @@ -67,7 +65,6 @@ where CosmicElement::Cursor(elem) => elem.current_commit(), CosmicElement::Dnd(elem) => elem.current_commit(), CosmicElement::MoveGrab(elem) => elem.current_commit(), - CosmicElement::AdditionalDamage(elem) => elem.current_commit(), CosmicElement::Postprocess(elem) => elem.current_commit(), CosmicElement::Zoom(elem) => elem.current_commit(), #[cfg(feature = "debug")] @@ -81,7 +78,6 @@ where CosmicElement::Cursor(elem) => elem.src(), CosmicElement::Dnd(elem) => elem.src(), CosmicElement::MoveGrab(elem) => elem.src(), - CosmicElement::AdditionalDamage(elem) => elem.src(), CosmicElement::Postprocess(elem) => elem.src(), CosmicElement::Zoom(elem) => elem.src(), #[cfg(feature = "debug")] @@ -95,7 +91,6 @@ where CosmicElement::Cursor(elem) => elem.geometry(scale), CosmicElement::Dnd(elem) => elem.geometry(scale), CosmicElement::MoveGrab(elem) => elem.geometry(scale), - CosmicElement::AdditionalDamage(elem) => elem.geometry(scale), CosmicElement::Postprocess(elem) => elem.geometry(scale), CosmicElement::Zoom(elem) => elem.geometry(scale), #[cfg(feature = "debug")] @@ -109,7 +104,6 @@ where CosmicElement::Cursor(elem) => elem.location(scale), CosmicElement::Dnd(elem) => elem.location(scale), CosmicElement::MoveGrab(elem) => elem.location(scale), - CosmicElement::AdditionalDamage(elem) => elem.location(scale), CosmicElement::Postprocess(elem) => elem.location(scale), CosmicElement::Zoom(elem) => elem.location(scale), #[cfg(feature = "debug")] @@ -123,7 +117,6 @@ where CosmicElement::Cursor(elem) => elem.transform(), CosmicElement::Dnd(elem) => elem.transform(), CosmicElement::MoveGrab(elem) => elem.transform(), - CosmicElement::AdditionalDamage(elem) => elem.transform(), CosmicElement::Postprocess(elem) => elem.transform(), CosmicElement::Zoom(elem) => elem.transform(), #[cfg(feature = "debug")] @@ -141,7 +134,6 @@ where CosmicElement::Cursor(elem) => elem.damage_since(scale, commit), CosmicElement::Dnd(elem) => elem.damage_since(scale, commit), CosmicElement::MoveGrab(elem) => elem.damage_since(scale, commit), - CosmicElement::AdditionalDamage(elem) => elem.damage_since(scale, commit), CosmicElement::Postprocess(elem) => elem.damage_since(scale, commit), CosmicElement::Zoom(elem) => elem.damage_since(scale, commit), #[cfg(feature = "debug")] @@ -155,7 +147,6 @@ where CosmicElement::Cursor(elem) => elem.opaque_regions(scale), CosmicElement::Dnd(elem) => elem.opaque_regions(scale), CosmicElement::MoveGrab(elem) => elem.opaque_regions(scale), - CosmicElement::AdditionalDamage(elem) => elem.opaque_regions(scale), CosmicElement::Postprocess(elem) => elem.opaque_regions(scale), CosmicElement::Zoom(elem) => elem.opaque_regions(scale), #[cfg(feature = "debug")] @@ -169,7 +160,6 @@ where CosmicElement::Cursor(elem) => elem.alpha(), CosmicElement::Dnd(elem) => elem.alpha(), CosmicElement::MoveGrab(elem) => elem.alpha(), - CosmicElement::AdditionalDamage(elem) => elem.alpha(), CosmicElement::Postprocess(elem) => elem.alpha(), CosmicElement::Zoom(elem) => elem.alpha(), #[cfg(feature = "debug")] @@ -183,7 +173,6 @@ where CosmicElement::Cursor(elem) => elem.kind(), CosmicElement::Dnd(elem) => elem.kind(), CosmicElement::MoveGrab(elem) => elem.kind(), - CosmicElement::AdditionalDamage(elem) => elem.kind(), CosmicElement::Postprocess(elem) => elem.kind(), CosmicElement::Zoom(elem) => elem.kind(), #[cfg(feature = "debug")] @@ -212,9 +201,6 @@ where CosmicElement::Cursor(elem) => elem.draw(frame, src, dst, damage, opaque_regions), CosmicElement::Dnd(elem) => elem.draw(frame, src, dst, damage, opaque_regions), CosmicElement::MoveGrab(elem) => elem.draw(frame, src, dst, damage, opaque_regions), - CosmicElement::AdditionalDamage(elem) => { - RenderElement::::draw(elem, frame, src, dst, damage, opaque_regions) - } CosmicElement::Postprocess(elem) => { let glow_frame = R::glow_frame_mut(frame); RenderElement::::draw( @@ -250,7 +236,6 @@ where CosmicElement::Cursor(elem) => elem.underlying_storage(renderer), CosmicElement::Dnd(elem) => elem.underlying_storage(renderer), CosmicElement::MoveGrab(elem) => elem.underlying_storage(renderer), - CosmicElement::AdditionalDamage(elem) => elem.underlying_storage(renderer), CosmicElement::Postprocess(elem) => { let glow_renderer = renderer.glow_renderer_mut(); elem.underlying_storage(glow_renderer) @@ -281,17 +266,6 @@ where } } -impl From for CosmicElement -where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, - R::TextureId: 'static, - CosmicMappedRenderElement: RenderElement, -{ - fn from(elem: DamageElement) -> Self { - Self::AdditionalDamage(elem) - } -} - impl From> for CosmicElement where R: Renderer + ImportAll + ImportMem + AsGlowRenderer, diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index f4f5578fe..644beb0a8 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -1353,21 +1353,20 @@ where )?; let old_len = elements.len(); - elements.extend( - additional_damage - .into_iter() - .map(|rect| { - rect.to_f64() - .to_logical( - output.current_scale().fractional_scale(), - output.current_transform(), - &area, - ) - .to_i32_round() - }) - .map(DamageElement::new) - .map(Into::into), - ); + let additional_damage_elements: Vec<_> = additional_damage + .into_iter() + .map(|rect| { + rect.to_f64() + .to_logical( + output.current_scale().fractional_scale(), + output.current_transform(), + &area, + ) + .to_i32_round() + }) + .map(DamageElement::new) + .collect(); + dt.damage_output(age, &additional_damage_elements)?; Some(old_len) } else { @@ -1473,7 +1472,7 @@ where CosmicMappedRenderElement: RenderElement, WorkspaceRenderElement: RenderElement, { - let mut elements: Vec> = workspace_elements( + let elements: Vec> = workspace_elements( gpu, renderer, shell, @@ -1488,13 +1487,12 @@ where if let Some(additional_damage) = additional_damage { let output_geo = output.geometry().to_local(&output).as_logical(); - elements.extend( - additional_damage - .into_iter() - .filter_map(|rect| rect.intersection(output_geo)) - .map(DamageElement::new) - .map(Into::>::into), - ); + let additional_damage_elements: Vec<_> = additional_damage + .into_iter() + .filter_map(|rect| rect.intersection(output_geo)) + .map(DamageElement::new) + .collect(); + damage_tracker.damage_output(age, &additional_damage_elements)?; } let res = damage_tracker.render_output( diff --git a/src/wayland/handlers/screencopy/render.rs b/src/wayland/handlers/screencopy/render.rs index 03c48b4f1..3705987b0 100644 --- a/src/wayland/handlers/screencopy/render.rs +++ b/src/wayland/handlers/screencopy/render.rs @@ -223,7 +223,7 @@ where // TODO re-use offscreen buffer to damage track screencopy to shm 0 } else { - session_damage_tracking.age_for_buffer(&buffer) + 1 }; let mut fb = offscreen .as_mut() @@ -490,7 +490,6 @@ smithay::render_elements! { pub WindowCaptureElement where R: ImportAll + ImportMem; WaylandElement=WaylandSurfaceRenderElement, CursorElement=RelocateRenderElement>, - AdditionalDamage=DamageElement, } pub fn render_window_to_buffer( @@ -541,22 +540,19 @@ pub fn render_window_to_buffer( CosmicElement: RenderElement, CosmicMappedRenderElement: RenderElement, { - let mut elements = Vec::new(); - - elements.extend( - additional_damage - .into_iter() - .filter_map(|rect| { - let logical_rect = rect.to_logical( - 1, - Transform::Normal, - &geometry.size.to_buffer(1, Transform::Normal), - ); - logical_rect.intersection(Rectangle::from_size(geometry.size)) - }) - .map(DamageElement::new) - .map(Into::>::into), - ); + let additional_damage_elements: Vec<_> = additional_damage + .into_iter() + .filter_map(|rect| { + let logical_rect = rect.to_logical( + 1, + Transform::Normal, + &geometry.size.to_buffer(1, Transform::Normal), + ); + logical_rect.intersection(Rectangle::from_size(geometry.size)) + }) + .map(DamageElement::new) + .collect(); + dt.damage_output(age, &additional_damage_elements)?; let shell = common.shell.read(); let seat = shell.seats.last_active().clone(); @@ -579,6 +575,8 @@ pub fn render_window_to_buffer( }; std::mem::drop(shell); + let mut elements = Vec::new(); + if let Some(location) = location { if draw_cursor { elements.extend( @@ -777,7 +775,17 @@ pub fn render_cursor_to_buffer( CosmicElement: RenderElement, CosmicMappedRenderElement: RenderElement, { - let mut elements = cursor::draw_cursor( + let additional_damage_elements: Vec<_> = additional_damage + .into_iter() + .filter_map(|rect| { + let logical_rect = rect.to_logical(1, Transform::Normal, &Size::from((64, 64))); + logical_rect.intersection(Rectangle::from_size((64, 64).into())) + }) + .map(DamageElement::new) + .collect(); + dt.damage_output(age, &additional_damage_elements)?; + + let elements = cursor::draw_cursor( renderer, &seat, Point::from((0.0, 0.0)), @@ -791,17 +799,6 @@ pub fn render_cursor_to_buffer( .map(WindowCaptureElement::from) .collect::>(); - elements.extend( - additional_damage - .into_iter() - .filter_map(|rect| { - let logical_rect = rect.to_logical(1, Transform::Normal, &Size::from((64, 64))); - logical_rect.intersection(Rectangle::from_size((64, 64).into())) - }) - .map(DamageElement::new) - .map(Into::>::into), - ); - if let Ok(dmabuf) = get_dmabuf(buffer) { let mut dmabuf_clone = dmabuf.clone(); let mut fb = renderer diff --git a/src/wayland/handlers/screencopy/user_data.rs b/src/wayland/handlers/screencopy/user_data.rs index b780b0dd3..dae2b6288 100644 --- a/src/wayland/handlers/screencopy/user_data.rs +++ b/src/wayland/handlers/screencopy/user_data.rs @@ -1,10 +1,6 @@ -use std::{cell::RefCell, collections::HashMap, sync::Mutex}; +use std::{cell::RefCell, sync::Mutex}; -use smithay::{ - backend::renderer::{damage::OutputDamageTracker, utils::CommitCounter}, - output::Output, - reexports::wayland_server::{protocol::wl_buffer::WlBuffer, Resource, Weak}, -}; +use smithay::{backend::renderer::damage::OutputDamageTracker, output::Output}; use crate::{ shell::{CosmicSurface, Workspace}, @@ -20,36 +16,11 @@ pub type SessionData = Mutex; pub struct SessionUserData { pub dt: OutputDamageTracker, - commit_counter: CommitCounter, - buffer_age: HashMap, CommitCounter>, } impl SessionUserData { pub fn new(tracker: OutputDamageTracker) -> SessionUserData { - SessionUserData { - dt: tracker, - commit_counter: CommitCounter::default(), - buffer_age: HashMap::new(), - } - } - - pub fn age_for_buffer(&mut self, buffer: &WlBuffer) -> usize { - self.buffer_age.retain(|k, _| k.upgrade().is_ok()); - - let weak = buffer.downgrade(); - let age = self - .commit_counter - .distance(self.buffer_age.get(&weak).copied()) - .unwrap_or(0); - self.buffer_age.insert(weak, self.commit_counter); - - self.commit_counter.increment(); - age - } - - pub fn reset(&mut self) { - self.commit_counter = CommitCounter::default(); - self.buffer_age.clear(); + SessionUserData { dt: tracker } } }