aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_helpers.rs')
-rw-r--r--src/render_helpers.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/render_helpers.rs b/src/render_helpers.rs
index 922ff59c..6cdc9fc2 100644
--- a/src/render_helpers.rs
+++ b/src/render_helpers.rs
@@ -6,6 +6,8 @@ use smithay::backend::renderer::utils::CommitCounter;
use smithay::backend::renderer::{Bind, ExportMem, ImportAll, 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
@@ -45,6 +47,12 @@ impl AsGlesRenderer for GlesRenderer {
}
}
+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
@@ -59,6 +67,12 @@ impl<'frame> AsGlesFrame<'frame> for GlesFrame<'frame> {
}
}
+impl<'render, 'alloc, 'frame> AsGlesFrame<'frame> for TtyFrame<'render, 'alloc, 'frame> {
+ fn as_gles_frame(&mut self) -> &mut GlesFrame<'frame> {
+ self.as_mut()
+ }
+}
+
/// Wrapper for a texture from the primary GPU for rendering with the primary GPU.
#[derive(Debug)]
pub struct PrimaryGpuTextureRenderElement(pub TextureRenderElement<GlesTexture>);
@@ -124,3 +138,28 @@ impl RenderElement<GlesRenderer> for PrimaryGpuTextureRenderElement {
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
+ }
+}