diff --git a/src/backend/render/cursor.rs b/src/backend/render/cursor.rs index 0585e664..da01b270 100644 --- a/src/backend/render/cursor.rs +++ b/src/backend/render/cursor.rs @@ -175,7 +175,7 @@ fn load_icon(theme: &CursorTheme, shape: CursorIcon) -> Result, Error } render_elements! { - pub CursorRenderElement where R: ImportAll + ImportMem + AsGlowRenderer; + pub CursorRenderElement where R: ImportAll + ImportMem + AsGlowRenderer, R::TextureId: Send; Static=MemoryRenderBufferRenderElement, Surface=SurfaceRenderElement, } diff --git a/src/backend/render/element.rs b/src/backend/render/element.rs index 27179045..706a542b 100644 --- a/src/backend/render/element.rs +++ b/src/backend/render/element.rs @@ -1,5 +1,8 @@ use crate::{ - backend::render::{GlMultiError, wayland::SurfaceRenderElement}, + backend::{ + kms::render::gles::GbmGlowBackend, + render::{GlMultiError, wayland::SurfaceRenderElement}, + }, shell::{CosmicMappedRenderElement, WorkspaceRenderElement}, utils::iced::IcedRenderElement, }; @@ -37,7 +40,7 @@ use super::{GlMultiRenderer, cursor::CursorRenderElement}; pub enum CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { Workspace( @@ -58,7 +61,7 @@ where impl Element for CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn id(&self) -> &Id { @@ -223,7 +226,7 @@ where impl RenderElement for CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn draw( @@ -339,7 +342,7 @@ impl From>>> for CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: CropRenderElement>>) -> Self { @@ -354,7 +357,7 @@ where impl From> for CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(value: IcedRenderElement) -> Self { @@ -365,7 +368,7 @@ where impl From for CosmicElement where R: Renderer + ImportAll + ImportMem + AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(value: DamageElement) -> Self { @@ -377,7 +380,7 @@ where impl From> for CosmicElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: TextureRenderElement) -> Self { diff --git a/src/backend/render/wayland/blur_effect.rs b/src/backend/render/wayland/blur_effect.rs index 8ceb1704..9b3145bc 100644 --- a/src/backend/render/wayland/blur_effect.rs +++ b/src/backend/render/wayland/blur_effect.rs @@ -9,7 +9,7 @@ use smithay::{ allocator::Fourcc, renderer::{ Bind, BlitFrame, Color32F, ContextId, Frame, FrameContext, ImportAll, Offscreen, - Renderer, Texture, TextureFilter, + Renderer, RendererSuper, Texture, TextureFilter, element::{Element, Id, Kind, RenderElement}, gles::{ GlesError, GlesFrame, GlesRenderer, GlesTexProgram, GlesTexture, Uniform, @@ -115,7 +115,7 @@ impl BlurShaders { } } -type BlurTexture = Mutex>; +type BlurTexture = Mutex>; #[derive(Debug)] pub struct BlurState { @@ -369,7 +369,10 @@ impl Element for BlurElement { } } -impl RenderElement for BlurElement { +impl RenderElement for BlurElement +where + R::TextureId: Send + 'static, +{ fn capture_framebuffer( &self, frame: &mut ::Frame<'_, '_>, @@ -377,41 +380,48 @@ impl RenderElement for BlurElement { dst: Rectangle, cache: &UserDataMap, ) -> Result<(), ::Error> { + let transform = frame.transformation(); + let tex_size = self.src.to_i32_round(); let glow_frame = ::glow_frame_mut(frame); let gles_frame = BorrowMut::>::borrow_mut(glow_frame); - let transform = gles_frame.transformation(); - let tex_size = self.src.to_i32_round(); + let mut renderer = gles_frame.renderer(); - let texture_ref = cache.get_or_insert_threadsafe(BlurTexture::default); + let texture_ref = cache.get_or_insert_threadsafe(BlurTexture::::default); let mut texture_entry = texture_ref.lock().unwrap(); - if texture_entry - .as_ref() - .is_some_and(|tex| tex.size() != tex_size) - { + if texture_entry.as_ref().is_some_and(|tex| { + tex.size() != tex_size + || R::tex_to_gl( + &renderer.as_ref().context_id(), + texture_entry.as_ref().unwrap(), + ) + .is_none() + }) { texture_entry.take(); } - - let mut renderer = gles_frame.renderer(); if texture_entry.is_none() { - *texture_entry = Some( - renderer - .as_mut() - .create_buffer(Fourcc::Abgr8888, tex_size) - .map_err(R::from_gles_error)?, - ); + let gl_texture = renderer + .as_mut() + .create_buffer(Fourcc::Abgr8888, tex_size) + .map_err(R::from_gles_error)?; + *texture_entry = Some(R::tex_from_gl(&renderer.as_ref().context_id(), gl_texture)); } - let texture = texture_entry.as_mut().unwrap(); + + let mut texture = R::tex_to_gl( + &renderer.as_ref().context_id(), + texture_entry.as_ref().unwrap(), + ) + .unwrap(); let mut off_texture = renderer .as_mut() .create_buffer(Fourcc::Abgr8888, tex_size) .map_err(R::from_gles_error)?; std::mem::drop(renderer); - let sync = blit_from_active_fb(gles_frame, src, dst, transform, texture) + let sync = blit_from_active_fb(gles_frame, src, dst, transform, &mut texture) .map_err(R::from_gles_error)?; gles_frame.wait(&sync).map_err(R::from_gles_error)?; - let mut textures = [texture, &mut off_texture]; + let mut textures = [&mut texture, &mut off_texture]; render_blur( gles_frame.renderer().as_mut(), &self.scaling_shaders, @@ -433,7 +443,6 @@ impl RenderElement for BlurElement { opaque_regions: &[Rectangle], cache: Option<&UserDataMap>, ) -> Result<(), R::Error> { - let glow_frame = ::glow_frame_mut(frame); let src_to_geo = self.geometry.size / self.src; let src_log = src .upscale(src_to_geo) @@ -451,26 +460,27 @@ impl RenderElement for BlurElement { .flat_map(|rect| damage.iter().flat_map(move |r| r.intersection(rect))) .collect::>(); let cache = cache.expect("Framebuffer element without cache?"); - let Some(texture) = cache.get::() else { + let Some(texture) = cache.get::>() else { return Err(R::from_gles_error(GlesError::BlitError)); }; let texture_ref = texture.lock().unwrap(); - BorrowMut::>::borrow_mut(glow_frame) - .render_texture_from_to( - texture_ref - .as_ref() - .ok_or(R::from_gles_error(GlesError::BlitError))?, + if let Some(tex) = texture_ref.as_ref() { + BorrowMut::::borrow_mut(::glow_frame_mut(frame)) + .override_default_tex_program(self.render_shader.clone(), self.uniforms.clone()); + frame.render_texture_from_to( + tex, src, dst, &damage, - opaque_regions, + &opaque_regions, Transform::Normal, 1.0, - Some(&self.render_shader), - &self.uniforms, - ) - .map_err(R::from_gles_error) + )?; + BorrowMut::::borrow_mut(::glow_frame_mut(frame)) + .clear_tex_program_override(); + } + Ok(()) } } diff --git a/src/backend/render/wayland/mod.rs b/src/backend/render/wayland/mod.rs index 9f07d08b..c2b7d4ec 100644 --- a/src/backend/render/wayland/mod.rs +++ b/src/backend/render/wayland/mod.rs @@ -20,7 +20,7 @@ pub mod blur_effect; pub mod clipped_surface; render_elements! { - pub SurfaceRenderElement where R: AsGlowRenderer + ImportAll; + pub SurfaceRenderElement where R: AsGlowRenderer + ImportAll, R::TextureId: Send; Blur=BlurElement, Clipped=ClippedSurfaceRenderElement, Wayland=WaylandSurfaceRenderElement, diff --git a/src/shell/element/mod.rs b/src/shell/element/mod.rs index f5691b29..14736719 100644 --- a/src/shell/element/mod.rs +++ b/src/shell/element/mod.rs @@ -1137,7 +1137,7 @@ where impl Element for CosmicMappedRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn id(&self) -> &smithay::backend::renderer::element::Id { match self { @@ -1358,7 +1358,7 @@ where impl RenderElement for CosmicMappedRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn draw( &self, diff --git a/src/shell/element/stack.rs b/src/shell/element/stack.rs index 92d29b75..fabb87bd 100644 --- a/src/shell/element/stack.rs +++ b/src/shell/element/stack.rs @@ -1927,7 +1927,7 @@ impl From> impl Element for CosmicStackRenderElement where R: Renderer + ImportAll + ImportMem + AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn id(&self) -> &RendererId { match self { @@ -2036,7 +2036,7 @@ where impl RenderElement for CosmicStackRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn draw( &self, diff --git a/src/shell/element/window.rs b/src/shell/element/window.rs index 09c59f90..f6c9e1c4 100644 --- a/src/shell/element/window.rs +++ b/src/shell/element/window.rs @@ -1275,7 +1275,7 @@ impl From> impl Element for CosmicWindowRenderElement where R: Renderer + ImportAll + ImportMem + AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn id(&self) -> &RendererId { match self { @@ -1384,7 +1384,7 @@ where impl RenderElement for CosmicWindowRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn draw( &self, diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index ea5dbad7..e771e502 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -1973,7 +1973,7 @@ pub struct OutputNotMapped; pub enum WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { OverrideRedirect(SurfaceRenderElement), LowerLayerShell(NamespacedElement>), @@ -1986,7 +1986,7 @@ where impl Element for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn id(&self) -> &smithay::backend::renderer::element::Id { match self { @@ -2117,7 +2117,7 @@ where impl RenderElement for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, { fn draw( &self, @@ -2213,7 +2213,7 @@ where impl From>> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: RescaleRenderElement>) -> Self { @@ -2224,7 +2224,7 @@ where impl From> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: CosmicWindowRenderElement) -> Self { @@ -2235,7 +2235,7 @@ where impl From> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: SurfaceRenderElement) -> Self { @@ -2246,7 +2246,7 @@ where impl From>> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: NamespacedElement>) -> Self { @@ -2257,7 +2257,7 @@ where impl From> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: CosmicMappedRenderElement) -> Self { @@ -2268,7 +2268,7 @@ where impl From> for WorkspaceRenderElement where R: AsGlowRenderer, - R::TextureId: 'static, + R::TextureId: Send + 'static, CosmicMappedRenderElement: RenderElement, { fn from(elem: TextureRenderElement) -> Self { diff --git a/src/utils/iced/mod.rs b/src/utils/iced/mod.rs index b03e1682..2bfe888d 100644 --- a/src/utils/iced/mod.rs +++ b/src/utils/iced/mod.rs @@ -1112,7 +1112,7 @@ impl IcedElement

{ } render_elements! { - pub IcedRenderElement where R: ImportMem + AsGlowRenderer; + pub IcedRenderElement where R: ImportMem + AsGlowRenderer, R::TextureId: Send; UI=MemoryRenderBufferRenderElement, Blur=BlurElement, } diff --git a/src/utils/screenshot.rs b/src/utils/screenshot.rs index de544b72..f1f1f5f4 100644 --- a/src/utils/screenshot.rs +++ b/src/utils/screenshot.rs @@ -23,7 +23,7 @@ pub fn screenshot_window(state: &mut State, surface: &CosmicSurface) { fn render_window(renderer: &mut R, window: &CosmicSurface) -> anyhow::Result<()> where R: Renderer + ImportAll + Offscreen + ExportMem + AsGlowRenderer, - R::TextureId: Clone + 'static, + R::TextureId: Send + Clone + 'static, R::Error: Send + Sync + 'static, { let bbox = bbox_from_surface_tree(&window.wl_surface().unwrap(), (0, 0)); diff --git a/src/wayland/handlers/image_copy_capture/render.rs b/src/wayland/handlers/image_copy_capture/render.rs index 0b77cbf5..ae429b4d 100644 --- a/src/wayland/handlers/image_copy_capture/render.rs +++ b/src/wayland/handlers/image_copy_capture/render.rs @@ -502,7 +502,7 @@ pub fn render_workspace_to_buffer( } smithay::render_elements! { - pub WindowCaptureElement where R: ImportAll + ImportMem + AsGlowRenderer; + pub WindowCaptureElement where R: ImportAll + ImportMem + AsGlowRenderer, R::TextureId: Send; WaylandElement=SurfaceRenderElement, CursorElement=RelocateRenderElement>, DamageElement=DamageElement,