diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 11:24:50 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 11:25:25 +0400 |
| commit | b2298db5c59ed2378aa56095bfdfac8523a7ef77 (patch) | |
| tree | 6afd28e7300354e32afcd48f908f115e44e36cd5 /src/render_helpers/renderer.rs | |
| parent | baa6263cbe72562b26c37514385ddeb4247feb3e (diff) | |
| download | niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.tar.gz niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.tar.bz2 niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.zip | |
Split render_helpers.rs
Diffstat (limited to 'src/render_helpers/renderer.rs')
| -rw-r--r-- | src/render_helpers/renderer.rs | 73 |
1 files changed, 73 insertions, 0 deletions
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() + } +} |
