diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/tty.rs | 2 | ||||
| -rw-r--r-- | src/config_error_notification.rs | 2 | ||||
| -rw-r--r-- | src/exit_confirm_dialog.rs | 2 | ||||
| -rw-r--r-- | src/hotkey_overlay.rs | 2 | ||||
| -rw-r--r-- | src/layout/mod.rs | 2 | ||||
| -rw-r--r-- | src/layout/monitor.rs | 2 | ||||
| -rw-r--r-- | src/layout/tile.rs | 2 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 2 | ||||
| -rw-r--r-- | src/niri.rs | 2 | ||||
| -rw-r--r-- | src/render_helpers.rs | 295 | ||||
| -rw-r--r-- | src/render_helpers/mod.rs | 3 | ||||
| -rw-r--r-- | src/render_helpers/primary_gpu_texture.rs | 99 | ||||
| -rw-r--r-- | src/render_helpers/render_elements.rs | 126 | ||||
| -rw-r--r-- | src/render_helpers/renderer.rs | 73 | ||||
| -rw-r--r-- | src/screenshot_ui.rs | 2 |
15 files changed, 311 insertions, 305 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs index ca211c0d..051376e9 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -49,7 +49,7 @@ use wayland_protocols::wp::presentation_time::server::wp_presentation_feedback; use super::RenderResult; use crate::frame_clock::FrameClock; use crate::niri::{Niri, RedrawState, State}; -use crate::render_helpers::AsGlesRenderer; +use crate::render_helpers::renderer::AsGlesRenderer; use crate::utils::get_monotonic_time; const SUPPORTED_COLOR_FORMATS: &[Fourcc] = &[Fourcc::Argb8888, Fourcc::Abgr8888]; diff --git a/src/config_error_notification.rs b/src/config_error_notification.rs index 2a3c0860..73ae3d9b 100644 --- a/src/config_error_notification.rs +++ b/src/config_error_notification.rs @@ -15,7 +15,7 @@ use smithay::reexports::gbm::Format as Fourcc; use smithay::utils::Transform; use crate::animation::Animation; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; const TEXT: &str = "Failed to parse the config file. \ Please run <span face='monospace' bgcolor='#000000'>niri validate</span> \ diff --git a/src/exit_confirm_dialog.rs b/src/exit_confirm_dialog.rs index eed640ca..84eddefe 100644 --- a/src/exit_confirm_dialog.rs +++ b/src/exit_confirm_dialog.rs @@ -12,7 +12,7 @@ use smithay::output::Output; use smithay::reexports::gbm::Format as Fourcc; use smithay::utils::Transform; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; const TEXT: &str = "Are you sure you want to exit niri?\n\n\ Press <span face='mono' bgcolor='#2C2C2C'> Enter </span> to confirm."; diff --git a/src/hotkey_overlay.rs b/src/hotkey_overlay.rs index 682bbbef..81a61cdc 100644 --- a/src/hotkey_overlay.rs +++ b/src/hotkey_overlay.rs @@ -18,7 +18,7 @@ use smithay::reexports::gbm::Format as Fourcc; use smithay::utils::{Physical, Size, Transform}; use crate::input::CompositorMod; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; const PADDING: i32 = 8; const MARGIN: i32 = PADDING * 2; diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 2dcabe62..6121a1f2 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -53,7 +53,7 @@ use self::monitor::{Monitor, WorkspaceSwitch, WorkspaceSwitchGesture}; use self::workspace::{compute_working_area, Column, ColumnWidth, OutputId, Workspace}; use crate::animation::Animation; use crate::niri_render_elements; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; use crate::utils::output_size; pub mod focus_ring; diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index cd6d1eba..0e5802cd 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -14,7 +14,7 @@ use super::workspace::{ }; use super::{LayoutElement, Options}; use crate::animation::Animation; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; use crate::utils::output_size; #[derive(Debug)] diff --git a/src/layout/tile.rs b/src/layout/tile.rs index e4f255b8..8932b494 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -10,7 +10,7 @@ use smithay::utils::{Logical, Point, Rectangle, Scale, Size}; use super::focus_ring::FocusRing; use super::{LayoutElement, LayoutElementRenderElement, Options}; use crate::niri_render_elements; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; /// Toplevel window with decorations. #[derive(Debug)] diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 4eb8c347..5ef22852 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -15,7 +15,7 @@ use super::tile::{Tile, TileRenderElement}; use super::{LayoutElement, Options}; use crate::animation::Animation; use crate::niri_render_elements; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; use crate::utils::output_size; #[derive(Debug)] diff --git a/src/niri.rs b/src/niri.rs index f232f708..589b16fc 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -101,7 +101,7 @@ use crate::ipc::server::IpcServer; use crate::layout::{Layout, MonitorRenderElement}; use crate::protocols::foreign_toplevel::{self, ForeignToplevelManagerState}; use crate::pw_utils::{Cast, PipeWire}; -use crate::render_helpers::NiriRenderer; +use crate::render_helpers::renderer::NiriRenderer; use crate::screenshot_ui::{ScreenshotUi, ScreenshotUiRenderElement}; use crate::utils::{ center, get_monotonic_time, make_screenshot_path, output_size, write_png_rgba8, diff --git a/src/render_helpers.rs b/src/render_helpers.rs deleted file mode 100644 index b0ae2a72..00000000 --- a/src/render_helpers.rs +++ /dev/null @@ -1,295 +0,0 @@ -use smithay::backend::allocator::dmabuf::Dmabuf; -use smithay::backend::renderer::element::texture::TextureRenderElement; -use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; -use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture}; -use smithay::backend::renderer::utils::CommitCounter; -use smithay::backend::renderer::{ - Bind, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, Texture, -}; -use smithay::utils::{Buffer, Physical, Rectangle, Scale, Transform}; - -use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; - -/// Trait with our main renderer requirements to save on the typing. -pub trait NiriRenderer: - ImportAll - + ImportMem - + ExportMem - + Bind<Dmabuf> - + Offscreen<GlesTexture> - + Renderer<TextureId = Self::NiriTextureId, Error = Self::NiriError> - + AsGlesRenderer -{ - // Associated types to work around the instability of associated type bounds. - type NiriTextureId: Texture + Clone + 'static; - type NiriError: std::error::Error - + Send - + Sync - + From<<GlesRenderer as Renderer>::Error> - + 'static; -} - -impl<R> NiriRenderer for R -where - R: ImportAll + ImportMem + ExportMem + Bind<Dmabuf> + Offscreen<GlesTexture> + AsGlesRenderer, - R::TextureId: Texture + Clone + 'static, - R::Error: std::error::Error + Send + Sync + From<<GlesRenderer as Renderer>::Error> + 'static, -{ - type NiriTextureId = R::TextureId; - type NiriError = R::Error; -} - -/// Trait for getting the underlying `GlesRenderer`. -pub trait AsGlesRenderer { - fn as_gles_renderer(&mut self) -> &mut GlesRenderer; -} - -impl AsGlesRenderer for GlesRenderer { - fn as_gles_renderer(&mut self) -> &mut GlesRenderer { - self - } -} - -impl<'render, 'alloc> AsGlesRenderer for TtyRenderer<'render, 'alloc> { - fn as_gles_renderer(&mut self) -> &mut GlesRenderer { - self.as_mut() - } -} - -/// Trait for getting the underlying `GlesFrame`. -pub trait AsGlesFrame<'frame> -where - Self: 'frame, -{ - fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame>; -} - -impl<'frame> AsGlesFrame<'frame> for GlesFrame<'frame> { - fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame> { - self - } -} - -impl<'render, 'alloc, 'frame> AsGlesFrame<'frame> for TtyFrame<'render, 'alloc, 'frame> { - fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame> { - self.as_mut() - } -} - -// We need to implement RenderElement manually due to AsGlesFrame requirement. -// This macro does it for us. -#[macro_export] -macro_rules! niri_render_elements { - ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { - #[derive(Debug)] - pub enum $name<R: $crate::render_helpers::NiriRenderer> { - $($variant($type)),+ - } - - impl<R: $crate::render_helpers::NiriRenderer> smithay::backend::renderer::element::Element for $name<R> { - fn id(&self) -> &smithay::backend::renderer::element::Id { - match self { - $($name::$variant(elem) => elem.id()),+ - } - } - - fn current_commit(&self) -> smithay::backend::renderer::utils::CommitCounter { - match self { - $($name::$variant(elem) => elem.current_commit()),+ - } - } - - fn geometry(&self, scale: smithay::utils::Scale<f64>) -> Rectangle<i32, smithay::utils::Physical> { - match self { - $($name::$variant(elem) => elem.geometry(scale)),+ - } - } - - fn transform(&self) -> smithay::utils::Transform { - match self { - $($name::$variant(elem) => elem.transform()),+ - } - } - - fn src(&self) -> smithay::utils::Rectangle<f64, smithay::utils::Buffer> { - match self { - $($name::$variant(elem) => elem.src()),+ - } - } - - fn damage_since( - &self, - scale: smithay::utils::Scale<f64>, - commit: Option<smithay::backend::renderer::utils::CommitCounter>, - ) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { - match self { - $($name::$variant(elem) => elem.damage_since(scale, commit)),+ - } - } - - fn opaque_regions(&self, scale: smithay::utils::Scale<f64>) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { - match self { - $($name::$variant(elem) => elem.opaque_regions(scale)),+ - } - } - - fn alpha(&self) -> f32 { - match self { - $($name::$variant(elem) => elem.alpha()),+ - } - } - - fn kind(&self) -> smithay::backend::renderer::element::Kind { - match self { - $($name::$variant(elem) => elem.kind()),+ - } - } - } - - impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> for $name<smithay::backend::renderer::gles::GlesRenderer> { - fn draw( - &self, - frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, - src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, - dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, - damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], - ) -> Result<(), smithay::backend::renderer::gles::GlesError> { - match self { - $($name::$variant(elem) => { - smithay::backend::renderer::element::RenderElement::<smithay::backend::renderer::gles::GlesRenderer>::draw(elem, frame, src, dst, damage) - })+ - } - } - - fn underlying_storage(&self, renderer: &mut smithay::backend::renderer::gles::GlesRenderer) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { - match self { - $($name::$variant(elem) => elem.underlying_storage(renderer)),+ - } - } - } - - impl<'render, 'alloc> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render, 'alloc>> - for $name<$crate::backend::tty::TtyRenderer<'render, 'alloc>> - { - fn draw( - &self, - frame: &mut $crate::backend::tty::TtyFrame<'render, 'alloc, '_>, - src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, - dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, - damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], - ) -> Result<(), $crate::backend::tty::TtyRendererError<'render, 'alloc>> { - match self { - $($name::$variant(elem) => { - smithay::backend::renderer::element::RenderElement::<$crate::backend::tty::TtyRenderer<'render, 'alloc>>::draw(elem, frame, src, dst, damage) - })+ - } - } - - fn underlying_storage( - &self, - renderer: &mut $crate::backend::tty::TtyRenderer<'render, 'alloc>, - ) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { - match self { - $($name::$variant(elem) => elem.underlying_storage(renderer)),+ - } - } - } - - $(impl<R: $crate::render_helpers::NiriRenderer> From<$type> for $name<R> { - fn from(x: $type) -> Self { - Self::$variant(x) - } - })+ - }; -} - -/// Wrapper for a texture from the primary GPU for rendering with the primary GPU. -#[derive(Debug)] -pub struct PrimaryGpuTextureRenderElement(pub TextureRenderElement<GlesTexture>); - -impl Element for PrimaryGpuTextureRenderElement { - fn id(&self) -> &Id { - self.0.id() - } - - fn current_commit(&self) -> CommitCounter { - self.0.current_commit() - } - - fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical> { - self.0.geometry(scale) - } - - fn transform(&self) -> Transform { - self.0.transform() - } - - fn src(&self) -> Rectangle<f64, Buffer> { - self.0.src() - } - - fn damage_since( - &self, - scale: Scale<f64>, - commit: Option<CommitCounter>, - ) -> Vec<Rectangle<i32, Physical>> { - self.0.damage_since(scale, commit) - } - - fn opaque_regions(&self, scale: Scale<f64>) -> Vec<Rectangle<i32, Physical>> { - self.0.opaque_regions(scale) - } - - fn alpha(&self) -> f32 { - self.0.alpha() - } - - fn kind(&self) -> Kind { - self.0.kind() - } -} - -impl RenderElement<GlesRenderer> for PrimaryGpuTextureRenderElement { - fn draw( - &self, - frame: &mut GlesFrame<'_>, - src: Rectangle<f64, Buffer>, - dst: Rectangle<i32, Physical>, - damage: &[Rectangle<i32, Physical>], - ) -> Result<(), GlesError> { - let gles_frame = frame.as_gles_frame(); - RenderElement::<GlesRenderer>::draw(&self.0, gles_frame, src, dst, damage)?; - Ok(()) - } - - fn underlying_storage(&self, _renderer: &mut GlesRenderer) -> Option<UnderlyingStorage> { - // If scanout for things other than Wayland buffers is implemented, this will need to take - // the target GPU into account. - None - } -} - -impl<'render, 'alloc> RenderElement<TtyRenderer<'render, 'alloc>> - for PrimaryGpuTextureRenderElement -{ - fn draw( - &self, - frame: &mut TtyFrame<'_, '_, '_>, - src: Rectangle<f64, Buffer>, - dst: Rectangle<i32, Physical>, - damage: &[Rectangle<i32, Physical>], - ) -> Result<(), TtyRendererError<'render, 'alloc>> { - let gles_frame = frame.as_gles_frame(); - RenderElement::<GlesRenderer>::draw(&self.0, gles_frame, src, dst, damage)?; - Ok(()) - } - - fn underlying_storage( - &self, - _renderer: &mut TtyRenderer<'render, 'alloc>, - ) -> Option<UnderlyingStorage> { - // If scanout for things other than Wayland buffers is implemented, this will need to take - // the target GPU into account. - None - } -} diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs new file mode 100644 index 00000000..fc7a9c85 --- /dev/null +++ b/src/render_helpers/mod.rs @@ -0,0 +1,3 @@ +pub mod primary_gpu_texture; +pub mod render_elements; +pub mod renderer; diff --git a/src/render_helpers/primary_gpu_texture.rs b/src/render_helpers/primary_gpu_texture.rs new file mode 100644 index 00000000..a3835c49 --- /dev/null +++ b/src/render_helpers/primary_gpu_texture.rs @@ -0,0 +1,99 @@ +use smithay::backend::renderer::element::texture::TextureRenderElement; +use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; +use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture}; +use smithay::backend::renderer::utils::CommitCounter; +use smithay::utils::{Buffer, Physical, Rectangle, Scale, Transform}; + +use super::renderer::AsGlesFrame; +use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; + +/// Wrapper for a texture from the primary GPU for rendering with the primary GPU. +#[derive(Debug)] +pub struct PrimaryGpuTextureRenderElement(pub TextureRenderElement<GlesTexture>); + +impl Element for PrimaryGpuTextureRenderElement { + fn id(&self) -> &Id { + self.0.id() + } + + fn current_commit(&self) -> CommitCounter { + self.0.current_commit() + } + + fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical> { + self.0.geometry(scale) + } + + fn transform(&self) -> Transform { + self.0.transform() + } + + fn src(&self) -> Rectangle<f64, Buffer> { + self.0.src() + } + + fn damage_since( + &self, + scale: Scale<f64>, + commit: Option<CommitCounter>, + ) -> Vec<Rectangle<i32, Physical>> { + self.0.damage_since(scale, commit) + } + + fn opaque_regions(&self, scale: Scale<f64>) -> Vec<Rectangle<i32, Physical>> { + self.0.opaque_regions(scale) + } + + fn alpha(&self) -> f32 { + self.0.alpha() + } + + fn kind(&self) -> Kind { + self.0.kind() + } +} + +impl RenderElement<GlesRenderer> for PrimaryGpuTextureRenderElement { + fn draw( + &self, + frame: &mut GlesFrame<'_>, + src: Rectangle<f64, Buffer>, + dst: Rectangle<i32, Physical>, + damage: &[Rectangle<i32, Physical>], + ) -> Result<(), GlesError> { + let gles_frame = frame.as_gles_frame(); + RenderElement::<GlesRenderer>::draw(&self.0, gles_frame, src, dst, damage)?; + Ok(()) + } + + fn underlying_storage(&self, _renderer: &mut GlesRenderer) -> Option<UnderlyingStorage> { + // If scanout for things other than Wayland buffers is implemented, this will need to take + // the target GPU into account. + None + } +} + +impl<'render, 'alloc> RenderElement<TtyRenderer<'render, 'alloc>> + for PrimaryGpuTextureRenderElement +{ + fn draw( + &self, + frame: &mut TtyFrame<'_, '_, '_>, + src: Rectangle<f64, Buffer>, + dst: Rectangle<i32, Physical>, + damage: &[Rectangle<i32, Physical>], + ) -> Result<(), TtyRendererError<'render, 'alloc>> { + let gles_frame = frame.as_gles_frame(); + RenderElement::<GlesRenderer>::draw(&self.0, gles_frame, src, dst, damage)?; + Ok(()) + } + + fn underlying_storage( + &self, + _renderer: &mut TtyRenderer<'render, 'alloc>, + ) -> Option<UnderlyingStorage> { + // If scanout for things other than Wayland buffers is implemented, this will need to take + // the target GPU into account. + None + } +} diff --git a/src/render_helpers/render_elements.rs b/src/render_helpers/render_elements.rs new file mode 100644 index 00000000..d6423bff --- /dev/null +++ b/src/render_helpers/render_elements.rs @@ -0,0 +1,126 @@ +// We need to implement RenderElement manually due to AsGlesFrame requirement. +// This macro does it for us. +#[macro_export] +macro_rules! niri_render_elements { + ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { + #[derive(Debug)] + pub enum $name<R: $crate::render_helpers::renderer::NiriRenderer> { + $($variant($type)),+ + } + + impl<R: $crate::render_helpers::renderer::NiriRenderer> smithay::backend::renderer::element::Element for $name<R> { + fn id(&self) -> &smithay::backend::renderer::element::Id { + match self { + $($name::$variant(elem) => elem.id()),+ + } + } + + fn current_commit(&self) -> smithay::backend::renderer::utils::CommitCounter { + match self { + $($name::$variant(elem) => elem.current_commit()),+ + } + } + + fn geometry(&self, scale: smithay::utils::Scale<f64>) -> Rectangle<i32, smithay::utils::Physical> { + match self { + $($name::$variant(elem) => elem.geometry(scale)),+ + } + } + + fn transform(&self) -> smithay::utils::Transform { + match self { + $($name::$variant(elem) => elem.transform()),+ + } + } + + fn src(&self) -> smithay::utils::Rectangle<f64, smithay::utils::Buffer> { + match self { + $($name::$variant(elem) => elem.src()),+ + } + } + + fn damage_since( + &self, + scale: smithay::utils::Scale<f64>, + commit: Option<smithay::backend::renderer::utils::CommitCounter>, + ) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { + match self { + $($name::$variant(elem) => elem.damage_since(scale, commit)),+ + } + } + + fn opaque_regions(&self, scale: smithay::utils::Scale<f64>) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { + match self { + $($name::$variant(elem) => elem.opaque_regions(scale)),+ + } + } + + fn alpha(&self) -> f32 { + match self { + $($name::$variant(elem) => elem.alpha()),+ + } + } + + fn kind(&self) -> smithay::backend::renderer::element::Kind { + match self { + $($name::$variant(elem) => elem.kind()),+ + } + } + } + + impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> for $name<smithay::backend::renderer::gles::GlesRenderer> { + fn draw( + &self, + frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, + src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, + dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, + damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], + ) -> Result<(), smithay::backend::renderer::gles::GlesError> { + match self { + $($name::$variant(elem) => { + smithay::backend::renderer::element::RenderElement::<smithay::backend::renderer::gles::GlesRenderer>::draw(elem, frame, src, dst, damage) + })+ + } + } + + fn underlying_storage(&self, renderer: &mut smithay::backend::renderer::gles::GlesRenderer) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { + match self { + $($name::$variant(elem) => elem.underlying_storage(renderer)),+ + } + } + } + + impl<'render, 'alloc> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render, 'alloc>> + for $name<$crate::backend::tty::TtyRenderer<'render, 'alloc>> + { + fn draw( + &self, + frame: &mut $crate::backend::tty::TtyFrame<'render, 'alloc, '_>, + src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, + dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, + damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], + ) -> Result<(), $crate::backend::tty::TtyRendererError<'render, 'alloc>> { + match self { + $($name::$variant(elem) => { + smithay::backend::renderer::element::RenderElement::<$crate::backend::tty::TtyRenderer<'render, 'alloc>>::draw(elem, frame, src, dst, damage) + })+ + } + } + + fn underlying_storage( + &self, + renderer: &mut $crate::backend::tty::TtyRenderer<'render, 'alloc>, + ) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { + match self { + $($name::$variant(elem) => elem.underlying_storage(renderer)),+ + } + } + } + + $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; +} diff --git a/src/render_helpers/renderer.rs b/src/render_helpers/renderer.rs new file mode 100644 index 00000000..7f85b66d --- /dev/null +++ b/src/render_helpers/renderer.rs @@ -0,0 +1,73 @@ +use smithay::backend::allocator::dmabuf::Dmabuf; +use smithay::backend::renderer::gles::{GlesFrame, GlesRenderer, GlesTexture}; +use smithay::backend::renderer::{ + Bind, ExportMem, ImportAll, ImportMem, Offscreen, Renderer, Texture, +}; + +use crate::backend::tty::{TtyFrame, TtyRenderer}; + +/// Trait with our main renderer requirements to save on the typing. +pub trait NiriRenderer: + ImportAll + + ImportMem + + ExportMem + + Bind<Dmabuf> + + Offscreen<GlesTexture> + + Renderer<TextureId = Self::NiriTextureId, Error = Self::NiriError> + + AsGlesRenderer +{ + // Associated types to work around the instability of associated type bounds. + type NiriTextureId: Texture + Clone + 'static; + type NiriError: std::error::Error + + Send + + Sync + + From<<GlesRenderer as Renderer>::Error> + + 'static; +} + +impl<R> NiriRenderer for R +where + R: ImportAll + ImportMem + ExportMem + Bind<Dmabuf> + Offscreen<GlesTexture> + AsGlesRenderer, + R::TextureId: Texture + Clone + 'static, + R::Error: std::error::Error + Send + Sync + From<<GlesRenderer as Renderer>::Error> + 'static, +{ + type NiriTextureId = R::TextureId; + type NiriError = R::Error; +} + +/// Trait for getting the underlying `GlesRenderer`. +pub trait AsGlesRenderer { + fn as_gles_renderer(&mut self) -> &mut GlesRenderer; +} + +impl AsGlesRenderer for GlesRenderer { + fn as_gles_renderer(&mut self) -> &mut GlesRenderer { + self + } +} + +impl<'render, 'alloc> AsGlesRenderer for TtyRenderer<'render, 'alloc> { + fn as_gles_renderer(&mut self) -> &mut GlesRenderer { + self.as_mut() + } +} + +/// Trait for getting the underlying `GlesFrame`. +pub trait AsGlesFrame<'frame> +where + Self: 'frame, +{ + fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame>; +} + +impl<'frame> AsGlesFrame<'frame> for GlesFrame<'frame> { + fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame> { + self + } +} + +impl<'render, 'alloc, 'frame> AsGlesFrame<'frame> for TtyFrame<'render, 'alloc, 'frame> { + fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame> { + self.as_mut() + } +} diff --git a/src/screenshot_ui.rs b/src/screenshot_ui.rs index f50e84d6..311b357b 100644 --- a/src/screenshot_ui.rs +++ b/src/screenshot_ui.rs @@ -19,7 +19,7 @@ use smithay::output::{Output, WeakOutput}; use smithay::utils::{Buffer, Physical, Point, Rectangle, Scale, Size, Transform}; use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; -use crate::render_helpers::PrimaryGpuTextureRenderElement; +use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; const BORDER: i32 = 2; |
