diff --git a/Cargo.lock b/Cargo.lock index 66cffb298..d06cd9a5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5102,7 +5102,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smithay" version = "0.7.0" -source = "git+https://github.com/smithay/smithay.git?rev=da42569#da42569e7a0e1669acb1e15d96cbb500a27cb266" +source = "git+https://github.com/smithay/smithay.git?rev=e84a4ca#e84a4ca82d58d783839083bd48c4ab120715c4b6" dependencies = [ "aliasable", "appendlist", diff --git a/Cargo.toml b/Cargo.toml index 0a35babed..957ef756f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -148,4 +148,4 @@ cosmic-protocols = { git = "https://github.com/pop-os//cosmic-protocols", branch cosmic-client-toolkit = { git = "https://github.com/pop-os//cosmic-protocols", branch = "main" } [patch.crates-io] -smithay = { git = "https://github.com/smithay/smithay.git", rev = "da42569" } +smithay = { git = "https://github.com/smithay/smithay.git", rev = "e84a4ca" } diff --git a/src/backend/render/element.rs b/src/backend/render/element.rs index 7897da65d..5f75725f5 100644 --- a/src/backend/render/element.rs +++ b/src/backend/render/element.rs @@ -1,19 +1,22 @@ use crate::shell::{CosmicMappedRenderElement, WorkspaceRenderElement}; #[cfg(feature = "debug")] -use smithay::backend::renderer::{element::texture::TextureRenderElement, gles::GlesTexture}; +use smithay::backend::renderer::element::texture::TextureRenderElement; use smithay::{ - backend::renderer::{ - ImportAll, ImportMem, Renderer, - element::{ - Element, Id, Kind, RenderElement, UnderlyingStorage, - memory::MemoryRenderBufferRenderElement, - surface::WaylandSurfaceRenderElement, - utils::{CropRenderElement, Relocate, RelocateRenderElement, RescaleRenderElement}, + backend::{ + allocator::dmabuf::Dmabuf, + renderer::{ + Bind, Blit, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, + element::{ + Element, Id, Kind, RenderElement, UnderlyingStorage, + memory::MemoryRenderBufferRenderElement, + surface::WaylandSurfaceRenderElement, + utils::{CropRenderElement, Relocate, RelocateRenderElement, RescaleRenderElement}, + }, + gles::{GlesError, GlesRenderbuffer, GlesTexture, element::TextureShaderElement}, + glow::{GlowFrame, GlowRenderer}, + utils::{CommitCounter, DamageSet, OpaqueRegions}, }, - gles::{GlesError, element::TextureShaderElement}, - glow::{GlowFrame, GlowRenderer}, - utils::{CommitCounter, DamageSet, OpaqueRegions}, }, utils::{Buffer as BufferCoords, Logical, Physical, Point, Rectangle, Scale}, }; @@ -22,7 +25,7 @@ use super::{GlMultiRenderer, cursor::CursorRenderElement}; pub enum CosmicElement where - R: AsGlowRenderer + Renderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -42,7 +45,7 @@ where impl Element for CosmicElement where - R: AsGlowRenderer + Renderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -183,7 +186,7 @@ where impl RenderElement for CosmicElement where - R: AsGlowRenderer + Renderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, R::Error: FromGlesError, CosmicMappedRenderElement: RenderElement, @@ -253,7 +256,7 @@ where impl From>>> for CosmicElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -268,7 +271,7 @@ where impl From> for CosmicElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -280,7 +283,7 @@ where #[cfg(feature = "debug")] impl From> for CosmicElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -289,9 +292,15 @@ where } } -pub trait AsGlowRenderer -where - Self: Renderer, +pub trait AsGlowRenderer: + Renderer + + Offscreen + + Offscreen + + ImportAll + + ImportMem + + ExportMem + + Bind + + Blit { fn glow_renderer(&self) -> &GlowRenderer; fn glow_renderer_mut(&mut self) -> &mut GlowRenderer; diff --git a/src/backend/render/mod.rs b/src/backend/render/mod.rs index 0e22c8ea9..cb8453f4b 100644 --- a/src/backend/render/mod.rs +++ b/src/backend/render/mod.rs @@ -45,11 +45,10 @@ use cosmic::Theme; use element::FromGlesError; use smithay::{ backend::{ - allocator::{Fourcc, dmabuf::Dmabuf}, + allocator::Fourcc, drm::{DrmDeviceFd, DrmNode}, renderer::{ - Bind, Blit, Color32F, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, Texture, - TextureFilter, + Color32F, ImportAll, Offscreen, Renderer, Texture, TextureFilter, damage::{Error as RenderError, OutputDamageTracker, RenderOutputResult}, element::{ Element, Id, Kind, RenderElement, WeakId, @@ -478,7 +477,7 @@ pub fn cursor_elements<'a, 'frame, R>( exclude_dnd_icon: bool, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, { @@ -620,7 +619,7 @@ pub fn output_elements( _fps: Option<(&EguiState, &Timings)>, ) -> Result>, RenderError> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicMappedRenderElement: RenderElement, @@ -718,7 +717,7 @@ pub fn workspace_elements( element_filter: ElementFilter, ) -> Result>, RenderError> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicMappedRenderElement: RenderElement, @@ -1060,7 +1059,7 @@ pub struct PostprocessState { } impl PostprocessState { - pub fn new_with_renderer>( + pub fn new_with_renderer( renderer: &mut R, format: Fourcc, output_config: PostprocessOutputConfig, @@ -1091,7 +1090,7 @@ impl PostprocessState { }) } - pub fn track_cursor>( + pub fn track_cursor( &mut self, renderer: &mut R, format: Fourcc, @@ -1193,14 +1192,7 @@ pub fn render_output<'d, R>( loop_handle: &calloop::LoopHandle<'static, State>, ) -> Result, RenderError> where - R: Renderer - + ImportAll - + ImportMem - + ExportMem - + Bind - + Offscreen - + Blit - + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicElement: RenderElement, @@ -1373,7 +1365,7 @@ where match result { Ok((res, mut elements)) => { for (session, frame) in output.take_pending_frames() { - if let Some(pending_image_copy_data) = render_session::<_, _, GlesTexture>( + if let Some(pending_image_copy_data) = render_session( renderer, session.user_data().get::().unwrap(), frame, @@ -1505,7 +1497,7 @@ pub fn render_workspace<'d, R>( element_filter: ElementFilter, ) -> Result<(RenderOutputResult<'d>, Vec>), RenderError> where - R: Renderer + ImportAll + ImportMem + ExportMem + Bind + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicElement: RenderElement, diff --git a/src/shell/element/mod.rs b/src/shell/element/mod.rs index 812d572ee..bc07c3b8f 100644 --- a/src/shell/element/mod.rs +++ b/src/shell/element/mod.rs @@ -10,7 +10,6 @@ use smithay::{ backend::{ input::KeyState, renderer::{ - ImportAll, ImportMem, Renderer, element::{ Element, RenderElement, UnderlyingStorage, memory::MemoryRenderBufferRenderElement, @@ -571,7 +570,7 @@ impl CosmicMapped { alpha: f32, ) -> Vec where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, C: From>, @@ -602,7 +601,7 @@ impl CosmicMapped { alpha: f32, ) -> Option where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, C: From>, @@ -646,7 +645,7 @@ impl CosmicMapped { scanout_override: Option, ) -> Vec where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, C: From>, @@ -1061,7 +1060,7 @@ impl From for CosmicMapped { pub enum CosmicMappedRenderElement where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, { Stack(self::stack::CosmicStackRenderElement), @@ -1096,7 +1095,7 @@ where impl Element for CosmicMappedRenderElement where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, { fn id(&self) -> &smithay::backend::renderer::element::Id { @@ -1279,7 +1278,7 @@ where impl RenderElement for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, R::Error: FromGlesError, { @@ -1395,7 +1394,7 @@ where impl From> for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -1405,7 +1404,7 @@ where } impl From> for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -1416,7 +1415,7 @@ where impl From for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -1427,7 +1426,7 @@ where impl From> for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -1439,7 +1438,7 @@ where #[cfg(feature = "debug")] impl From> for CosmicMappedRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { diff --git a/src/shell/element/stack.rs b/src/shell/element/stack.rs index 56e878f8c..fffb970c5 100644 --- a/src/shell/element/stack.rs +++ b/src/shell/element/stack.rs @@ -637,7 +637,7 @@ impl CosmicStack { alpha: f32, ) -> Vec where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, C: From>, { @@ -666,7 +666,7 @@ impl CosmicStack { alpha: f32, ) -> Option where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, C: From>, { @@ -733,7 +733,7 @@ impl CosmicStack { scanout_override: Option, ) -> Vec where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, C: From>, { @@ -1995,7 +1995,7 @@ where impl RenderElement for CosmicStackRenderElement where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, R::Error: FromGlesError, { diff --git a/src/shell/element/window.rs b/src/shell/element/window.rs index 3bfc6349a..ce0189e4f 100644 --- a/src/shell/element/window.rs +++ b/src/shell/element/window.rs @@ -364,7 +364,7 @@ impl CosmicWindow { alpha: f32, ) -> Option where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, C: From>, { @@ -444,7 +444,7 @@ impl CosmicWindow { scanout_override: Option, ) -> Vec where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, C: From>, { @@ -1350,7 +1350,7 @@ where impl RenderElement for CosmicWindowRenderElement where - R: Renderer + AsGlowRenderer + ImportAll + ImportMem, + R: AsGlowRenderer, R::TextureId: 'static, R::Error: FromGlesError, { diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index 582ec1b47..ce9603236 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -10,12 +10,9 @@ use cosmic_comp_config::AppearanceConfig; use cosmic_settings_config::shortcuts::action::ResizeDirection; use keyframe::{ease, functions::EaseInOutCubic}; use smithay::{ - backend::renderer::{ - ImportAll, ImportMem, Renderer, - element::{ - AsRenderElements, RenderElement, - utils::{Relocate, RelocateRenderElement, RescaleRenderElement}, - }, + backend::renderer::element::{ + AsRenderElements, RenderElement, + utils::{Relocate, RelocateRenderElement, RescaleRenderElement}, }, desktop::{PopupKind, Space, WindowSurfaceType, layer_map_for_output, space::SpaceElement}, input::Seat, @@ -1421,7 +1418,7 @@ impl FloatingLayout { alpha: f32, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -1472,7 +1469,7 @@ impl FloatingLayout { theme: &cosmic::theme::CosmicTheme, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, diff --git a/src/shell/layout/tiling/mod.rs b/src/shell/layout/tiling/mod.rs index 85efb2ceb..86cd8034c 100644 --- a/src/shell/layout/tiling/mod.rs +++ b/src/shell/layout/tiling/mod.rs @@ -47,7 +47,6 @@ use keyframe::{ }; use smithay::{ backend::renderer::{ - ImportAll, ImportMem, Renderer, element::{ AsRenderElements, Id, RenderElement, utils::{ @@ -4011,7 +4010,7 @@ impl TilingLayout { theme: &cosmic::theme::CosmicTheme, ) -> Result>, OutputNotMapped> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -4171,7 +4170,7 @@ impl TilingLayout { theme: &cosmic::theme::CosmicTheme, ) -> Result>, OutputNotMapped> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -4345,7 +4344,7 @@ fn geometries_for_groupview<'a, R>( Vec>, ) where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer + 'a, + R: AsGlowRenderer + 'a, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -4977,7 +4976,7 @@ fn render_old_tree_popups( is_swap_mode: bool, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -5020,7 +5019,7 @@ fn render_old_tree_windows( theme: &cosmic::theme::CosmicTheme, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -5203,7 +5202,7 @@ fn render_new_tree_popups( swap_desc: Option, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -5269,7 +5268,7 @@ fn render_new_tree_windows( theme: &cosmic::theme::CosmicTheme, ) -> Vec> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index b03ac7766..97d0cb300 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -34,7 +34,6 @@ use keyframe::{ease, functions::EaseInOutCubic}; use smithay::output::WeakOutput; use smithay::{ backend::renderer::{ - ImportAll, ImportMem, Renderer, element::{ Element, Id, RenderElement, surface::WaylandSurfaceRenderElement, texture::TextureRenderElement, utils::RescaleRenderElement, @@ -1518,7 +1517,7 @@ impl Workspace { theme: &CosmicTheme, ) -> Result>, OutputNotMapped> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -1720,7 +1719,7 @@ impl Workspace { theme: &CosmicTheme, ) -> Result>, OutputNotMapped> where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, CosmicMappedRenderElement: RenderElement, CosmicWindowRenderElement: RenderElement, @@ -1860,7 +1859,7 @@ pub struct OutputNotMapped; pub enum WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, { OverrideRedirect(WaylandSurfaceRenderElement), @@ -1872,7 +1871,7 @@ where impl Element for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, { fn id(&self) -> &smithay::backend::renderer::element::Id { @@ -1972,7 +1971,7 @@ where impl RenderElement for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, R::Error: FromGlesError, { @@ -2027,7 +2026,7 @@ where impl From>> for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -2038,7 +2037,7 @@ where impl From> for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -2049,7 +2048,7 @@ where impl From> for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -2060,7 +2059,7 @@ where impl From> for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { @@ -2071,7 +2070,7 @@ where impl From> for WorkspaceRenderElement where - R: Renderer + ImportAll + ImportMem + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: 'static, CosmicMappedRenderElement: RenderElement, { diff --git a/src/wayland/handlers/image_copy_capture/render.rs b/src/wayland/handlers/image_copy_capture/render.rs index a0e58f5d2..79e370a94 100644 --- a/src/wayland/handlers/image_copy_capture/render.rs +++ b/src/wayland/handlers/image_copy_capture/render.rs @@ -3,9 +3,9 @@ use calloop::LoopHandle; use smithay::{ backend::{ - allocator::{Buffer, Fourcc, dmabuf::Dmabuf, format::get_transparent}, + allocator::{Buffer, Fourcc, format::get_transparent}, renderer::{ - Bind, Blit, BufferType, Color32F, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, + BufferType, Color32F, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, buffer_dimensions, buffer_type, damage::{Error as DTError, OutputDamageTracker, RenderOutputResult}, element::{ @@ -185,7 +185,7 @@ where })) } -pub fn render_session( +pub fn render_session( renderer: &mut R, session: &SessionData, frame: Frame, @@ -193,7 +193,7 @@ pub fn render_session( render_fn: F, ) -> Result, DTError> where - R: ExportMem + Offscreen, + R: AsGlowRenderer, R::Error: FromGlesError, F: for<'d> FnOnce( &WlBuffer, @@ -204,38 +204,53 @@ where Vec>, ) -> Result, DTError>, { - let mut session_damage_tracking = session.lock().unwrap(); + let mut session_user_data = session.lock().unwrap(); let buffer = frame.buffer(); - let mut offscreen = matches!(buffer_type(&buffer), Some(BufferType::Shm)) - .then(|| { - let size = buffer_dimensions(&buffer).ok_or(DTError::OutputNoMode(OutputNoMode))?; - let format = with_buffer_contents(&buffer, |_, _, data| { - shm_format_to_fourcc(data.format) - .expect("We should be able to convert all hardcoded shm screencopy formats") - }) - .map_err(|_| DTError::OutputNoMode(OutputNoMode))?; - renderer - .create_buffer(format, size) - .map_err(DTError::Rendering) - }) - .transpose()?; - let age = if offscreen.is_some() { - // TODO re-use offscreen buffer to damage track screencopy to shm - 0 + let mut age = 1; + if matches!(buffer_type(&buffer), Some(BufferType::Shm)) { + let size = buffer_dimensions(&buffer).ok_or(DTError::OutputNoMode(OutputNoMode))?; + let format = with_buffer_contents(&buffer, |_, _, data| { + shm_format_to_fourcc(data.format) + .expect("We should be able to convert all hardcoded shm screencopy formats") + }) + .map_err(|_| DTError::OutputNoMode(OutputNoMode))?; + + // Re-allocate if context id, size, or format are different + session_user_data + .offscreen + .take_if(|(context_id, renderbuffer)| { + renderer.glow_renderer().context_id() != *context_id + || renderbuffer.size() != size + || renderbuffer.format() != Some(format) + }); + + if session_user_data.offscreen.is_none() { + let renderbuffer = Offscreen::::create_buffer(renderer, format, size) + .map_err(DTError::Rendering)?; + session_user_data.offscreen = + Some((renderer.glow_renderer().context_id(), renderbuffer)); + // If we're allocating a new offscreen buffer, we need to re-render everything + // (or copy the contexts of the shm buffer) + age = 0; + } } else { - 1 - }; + // If for some reason a capture session is used for shm, but then changes to dmabuf capture, + // remove the offscreen buffer. + session_user_data.offscreen = None; + } + + let SessionUserData { dt, offscreen } = &mut *session_user_data; let mut fb = offscreen .as_mut() - .map(|tex| renderer.bind(tex).map_err(DTError::Rendering)) + .map(|(_, tex)| renderer.bind(tex).map_err(DTError::Rendering)) .transpose()?; let res = render_fn( &frame.buffer(), renderer, fb.as_mut(), - &mut session_damage_tracking.dt, + dt, age, frame.damage(), ); @@ -304,7 +319,7 @@ pub fn render_workspace_to_buffer( handle: (WorkspaceHandle, usize), ) -> Result, DTError> where - R: Renderer + ImportAll + ImportMem + ExportMem + Bind + Blit + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicElement: RenderElement, @@ -422,7 +437,7 @@ pub fn render_workspace_to_buffer( }; let result = match renderer { RendererRef::Glow(renderer) => { - match render_session::<_, _, GlesRenderbuffer>( + match render_session( renderer, session.user_data().get::().unwrap(), frame, @@ -450,7 +465,7 @@ pub fn render_workspace_to_buffer( } } RendererRef::GlMulti(mut renderer) => { - match render_session::<_, _, GlesRenderbuffer>( + match render_session( &mut renderer, session.user_data().get::().unwrap(), frame, @@ -514,6 +529,7 @@ pub fn render_window_to_buffer( return; }; session.update_constraints(constraints); + if let Some(data) = session.user_data().get::() { let size = geometry.size.to_physical(1); *data.lock().unwrap() = @@ -536,7 +552,7 @@ pub fn render_window_to_buffer( geometry: Rectangle, ) -> Result, DTError> where - R: Renderer + ImportAll + ImportMem + ExportMem + Bind + Blit + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicElement: RenderElement, @@ -638,7 +654,7 @@ pub fn render_window_to_buffer( dt.render_output(renderer, &mut fb, age, &elements, Color32F::TRANSPARENT) } else { let fb = offscreen.expect("shm buffer should have an offscreen target"); - dt.render_output(renderer, fb, 0, &elements, Color32F::TRANSPARENT) + dt.render_output(renderer, fb, age, &elements, Color32F::TRANSPARENT) } } @@ -671,7 +687,7 @@ pub fn render_window_to_buffer( } }; let result = match renderer { - RendererRef::Glow(renderer) => match render_session::<_, _, GlesRenderbuffer>( + RendererRef::Glow(renderer) => match render_session( renderer, session.user_data().get::().unwrap(), frame, @@ -697,7 +713,7 @@ pub fn render_window_to_buffer( None } }, - RendererRef::GlMulti(mut renderer) => match render_session::<_, _, GlesRenderbuffer>( + RendererRef::GlMulti(mut renderer) => match render_session( &mut renderer, session.user_data().get::().unwrap(), frame, @@ -775,7 +791,7 @@ pub fn render_cursor_to_buffer( seat: &Seat, ) -> Result, DTError> where - R: Renderer + ImportAll + ImportMem + ExportMem + Bind + Blit + AsGlowRenderer, + R: AsGlowRenderer, R::TextureId: Send + Clone + 'static, R::Error: FromGlesError, CosmicElement: RenderElement, @@ -813,7 +829,7 @@ pub fn render_cursor_to_buffer( dt.render_output(renderer, &mut fb, age, &elements, [0.0, 0.0, 0.0, 0.0]) } else { let fb = offscreen.expect("shm buffers should have offscreen target"); - dt.render_output(renderer, fb, 0, &elements, [0.0, 0.0, 0.0, 0.0]) + dt.render_output(renderer, fb, age, &elements, [0.0, 0.0, 0.0, 0.0]) } } @@ -831,7 +847,7 @@ pub fn render_cursor_to_buffer( }; let result = match renderer { RendererRef::Glow(renderer) => { - match render_session::<_, _, GlesRenderbuffer>( + match render_session( renderer, session.user_data().get::().unwrap(), frame, @@ -857,7 +873,7 @@ pub fn render_cursor_to_buffer( } } RendererRef::GlMulti(mut renderer) => { - match render_session::<_, _, GlesRenderbuffer>( + match render_session( &mut renderer, session.user_data().get::().unwrap(), frame, diff --git a/src/wayland/handlers/image_copy_capture/user_data.rs b/src/wayland/handlers/image_copy_capture/user_data.rs index 083f42207..e9f3623ec 100644 --- a/src/wayland/handlers/image_copy_capture/user_data.rs +++ b/src/wayland/handlers/image_copy_capture/user_data.rs @@ -3,7 +3,11 @@ use std::{cell::RefCell, sync::Mutex}; use smithay::{ - backend::renderer::damage::OutputDamageTracker, + backend::renderer::{ + ContextId, + damage::OutputDamageTracker, + gles::{GlesRenderbuffer, GlesTexture}, + }, output::Output, wayland::image_copy_capture::{ CursorSession, CursorSessionRef, Frame, FrameRef, Session, SessionRef, @@ -19,11 +23,15 @@ pub type SessionData = Mutex; pub struct SessionUserData { pub dt: OutputDamageTracker, + pub offscreen: Option<(ContextId, GlesRenderbuffer)>, } impl SessionUserData { pub fn new(tracker: OutputDamageTracker) -> SessionUserData { - SessionUserData { dt: tracker } + SessionUserData { + dt: tracker, + offscreen: None, + } } }