diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-10 08:53:35 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-10 09:14:04 +0400 |
| commit | 18886965673e3f9d5faec0bafd09f68be2d9db45 (patch) | |
| tree | 4cfc7fbf7c5b9b87fca7c47e672a6c47cc06855a /src/render_helpers/mod.rs | |
| parent | b9e789619f91d4b542618cb19b0fa27cd2e052c7 (diff) | |
| download | niri-18886965673e3f9d5faec0bafd09f68be2d9db45.tar.gz niri-18886965673e3f9d5faec0bafd09f68be2d9db45.tar.bz2 niri-18886965673e3f9d5faec0bafd09f68be2d9db45.zip | |
Reimplement window closing anim in an efficient way
- Keep a root surface cache to be accessible in surface destroyed()
- Only snapshot during / right before closing, rather than every frame
- Store textures rather than elements to handle scale and alpha properly
Diffstat (limited to 'src/render_helpers/mod.rs')
| -rw-r--r-- | src/render_helpers/mod.rs | 81 |
1 files changed, 75 insertions, 6 deletions
diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs index c6c9fed1..e780de4e 100644 --- a/src/render_helpers/mod.rs +++ b/src/render_helpers/mod.rs @@ -3,15 +3,19 @@ use std::ptr; use anyhow::{ensure, Context}; use niri_config::BlockOutFrom; use smithay::backend::allocator::Fourcc; -use smithay::backend::renderer::element::RenderElement; +use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; +use smithay::backend::renderer::element::texture::{TextureBuffer, TextureRenderElement}; +use smithay::backend::renderer::element::{Kind, RenderElement}; use smithay::backend::renderer::gles::{GlesMapping, GlesRenderer, GlesTexture}; use smithay::backend::renderer::sync::SyncPoint; use smithay::backend::renderer::{buffer_dimensions, Bind, ExportMem, Frame, Offscreen, Renderer}; use smithay::reexports::wayland_server::protocol::wl_buffer::WlBuffer; use smithay::reexports::wayland_server::protocol::wl_shm; -use smithay::utils::{Physical, Rectangle, Scale, Size, Transform}; +use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform}; use smithay::wayland::shm; +use self::primary_gpu_texture::PrimaryGpuTextureRenderElement; + pub mod gradient; pub mod offscreen; pub mod primary_gpu_pixel_shader; @@ -32,20 +36,85 @@ pub enum RenderTarget { ScreenCapture, } +/// Buffer with location, src and dst. +#[derive(Debug)] +pub struct BakedBuffer<B> { + pub buffer: B, + pub location: Point<i32, Logical>, + pub src: Option<Rectangle<f64, Logical>>, + pub dst: Option<Size<i32, Logical>>, +} + /// Snapshot of a render. #[derive(Debug)] -pub struct RenderSnapshot<E> { +pub struct RenderSnapshot<C, B> { /// Contents for a normal render. - pub contents: Vec<E>, + pub contents: Vec<C>, /// Blocked-out contents. - pub blocked_out_contents: Vec<E>, + pub blocked_out_contents: Vec<B>, /// Where the contents were blocked out from at the time of the snapshot. pub block_out_from: Option<BlockOutFrom>, } -impl<E> Default for RenderSnapshot<E> { +pub trait ToRenderElement { + type RenderElement; + + fn to_render_element( + &self, + location: Point<i32, Logical>, + scale: Scale<f64>, + alpha: f32, + kind: Kind, + ) -> Self::RenderElement; +} + +impl ToRenderElement for BakedBuffer<TextureBuffer<GlesTexture>> { + type RenderElement = PrimaryGpuTextureRenderElement; + + fn to_render_element( + &self, + location: Point<i32, Logical>, + scale: Scale<f64>, + alpha: f32, + kind: Kind, + ) -> Self::RenderElement { + let elem = TextureRenderElement::from_texture_buffer( + (location + self.location).to_physical_precise_round(scale), + &self.buffer, + Some(alpha), + self.src, + self.dst, + kind, + ); + PrimaryGpuTextureRenderElement(elem) + } +} + +impl ToRenderElement for BakedBuffer<SolidColorBuffer> { + type RenderElement = SolidColorRenderElement; + + fn to_render_element( + &self, + location: Point<i32, Logical>, + scale: Scale<f64>, + alpha: f32, + kind: Kind, + ) -> Self::RenderElement { + SolidColorRenderElement::from_buffer( + &self.buffer, + (location + self.location) + .to_physical_precise_round(scale) + .to_i32_round(), + scale, + alpha, + kind, + ) + } +} + +impl<C, B> Default for RenderSnapshot<C, B> { fn default() -> Self { Self { contents: Default::default(), |
