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, DamageSet, OpaqueRegions}; use smithay::utils::{Buffer, Physical, Rectangle, Scale, Transform}; use super::renderer::AsGlesFrame; use super::texture::TextureRenderElement; use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; /// Wrapper for a texture from the primary GPU for rendering with the primary GPU. #[derive(Debug, Clone)] pub struct PrimaryGpuTextureRenderElement(pub TextureRenderElement); 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) -> Rectangle { self.0.geometry(scale) } fn transform(&self) -> Transform { self.0.transform() } fn src(&self) -> Rectangle { self.0.src() } fn damage_since( &self, scale: Scale, commit: Option, ) -> DamageSet { self.0.damage_since(scale, commit) } fn opaque_regions(&self, scale: Scale) -> OpaqueRegions { self.0.opaque_regions(scale) } fn alpha(&self) -> f32 { self.0.alpha() } fn kind(&self) -> Kind { self.0.kind() } } impl RenderElement for PrimaryGpuTextureRenderElement { fn draw( &self, frame: &mut GlesFrame<'_, '_>, src: Rectangle, dst: Rectangle, damage: &[Rectangle], opaque_regions: &[Rectangle], ) -> Result<(), GlesError> { let gles_frame = frame.as_gles_frame(); RenderElement::::draw(&self.0, gles_frame, src, dst, damage, opaque_regions)?; Ok(()) } fn underlying_storage(&self, _renderer: &mut GlesRenderer) -> Option { // If scanout for things other than Wayland buffers is implemented, this will need to take // the target GPU into account. None } } impl<'render> RenderElement> for PrimaryGpuTextureRenderElement { fn draw( &self, frame: &mut TtyFrame<'_, '_, '_>, src: Rectangle, dst: Rectangle, damage: &[Rectangle], opaque_regions: &[Rectangle], ) -> Result<(), TtyRendererError<'render>> { let gles_frame = frame.as_gles_frame(); RenderElement::::draw(&self.0, gles_frame, src, dst, damage, opaque_regions)?; Ok(()) } fn underlying_storage( &self, _renderer: &mut TtyRenderer<'render>, ) -> Option { // If scanout for things other than Wayland buffers is implemented, this will need to take // the target GPU into account. None } }