From 18886965673e3f9d5faec0bafd09f68be2d9db45 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 10 Apr 2024 08:53:35 +0400 Subject: 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 --- src/layout/mod.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'src/layout/mod.rs') diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 18870025..073ae804 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -36,10 +36,11 @@ use std::time::Duration; use niri_config::{CenterFocusedColumn, Config, Struts}; use niri_ipc::SizeChange; -use smithay::backend::renderer::element::solid::SolidColorRenderElement; +use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; use smithay::backend::renderer::element::surface::WaylandSurfaceRenderElement; +use smithay::backend::renderer::element::texture::TextureBuffer; use smithay::backend::renderer::element::Id; -use smithay::backend::renderer::gles::GlesRenderer; +use smithay::backend::renderer::gles::{GlesRenderer, GlesTexture}; use smithay::output::Output; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; use smithay::utils::{Logical, Point, Scale, Size, Transform}; @@ -48,9 +49,8 @@ use self::monitor::Monitor; pub use self::monitor::MonitorRenderElement; use self::workspace::{compute_working_area, Column, ColumnWidth, OutputId, Workspace}; use crate::niri_render_elements; -use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; use crate::render_helpers::renderer::NiriRenderer; -use crate::render_helpers::{RenderSnapshot, RenderTarget}; +use crate::render_helpers::{BakedBuffer, RenderSnapshot, RenderTarget}; use crate::utils::output_size; use crate::window::ResolvedWindowRules; @@ -67,12 +67,8 @@ niri_render_elements! { } } -niri_render_elements! { - LayoutElementSnapshotRenderElements => { - Texture = PrimaryGpuTextureRenderElement, - SolidColor = SolidColorRenderElement, - } -} +pub type LayoutElementRenderSnapshot = + RenderSnapshot>, BakedBuffer>; pub trait LayoutElement { /// Type that can be used as a unique ID of this element. @@ -110,7 +106,7 @@ pub trait LayoutElement { target: RenderTarget, ) -> Vec>; - fn take_last_render(&self) -> RenderSnapshot; + fn take_last_render(&self) -> LayoutElementRenderSnapshot; fn request_size(&self, size: Size); fn request_fullscreen(&self, size: Size); @@ -1930,7 +1926,7 @@ mod tests { vec![] } - fn take_last_render(&self) -> RenderSnapshot { + fn take_last_render(&self) -> LayoutElementRenderSnapshot { RenderSnapshot::default() } -- cgit