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/primary_gpu_texture.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/primary_gpu_texture.rs')
| -rw-r--r-- | src/render_helpers/primary_gpu_texture.rs | 99 |
1 files changed, 99 insertions, 0 deletions
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 + } +} |
