diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index e2d2e5b4..3f8baec1 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -1080,7 +1080,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 @@ -1606,10 +1606,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, @@ -1624,7 +1623,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 { + damage_tracking.age_for_buffer(&buffer) + }; + + if !additional_damage.is_empty() { let area = output .current_mode() .unwrap() @@ -1634,41 +1641,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 d539a058..7897da65 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 d439e1ce..0e22c8ea 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -1393,21 +1393,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 { @@ -1513,7 +1512,7 @@ where CosmicMappedRenderElement: RenderElement, WorkspaceRenderElement: RenderElement, { - let mut elements: Vec> = workspace_elements( + let elements: Vec> = workspace_elements( gpu, renderer, shell, @@ -1528,13 +1527,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/image_copy_capture/render.rs b/src/wayland/handlers/image_copy_capture/render.rs index 346534ed..e7615222 100644 --- a/src/wayland/handlers/image_copy_capture/render.rs +++ b/src/wayland/handlers/image_copy_capture/render.rs @@ -492,7 +492,6 @@ smithay::render_elements! { pub WindowCaptureElement where R: ImportAll + ImportMem; WaylandElement=WaylandSurfaceRenderElement, CursorElement=RelocateRenderElement>, - AdditionalDamage=DamageElement, } pub fn render_window_to_buffer( @@ -543,22 +542,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(); @@ -581,6 +577,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( @@ -783,7 +781,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)), @@ -797,17 +805,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