aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers/renderer.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-06 11:24:50 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-06 11:25:25 +0400
commitb2298db5c59ed2378aa56095bfdfac8523a7ef77 (patch)
tree6afd28e7300354e32afcd48f908f115e44e36cd5 /src/render_helpers/renderer.rs
parentbaa6263cbe72562b26c37514385ddeb4247feb3e (diff)
downloadniri-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.rs73
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()
+ }
+}