From 9d5f1c7ef7e1b038fe6242aaa04009bf21463d2a Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sat, 13 Apr 2024 14:16:07 +0400 Subject: Unify Animation- and RenderSnapshot --- src/layout/closing_window.rs | 3 +- src/layout/mod.rs | 32 +++++-------- src/layout/tile.rs | 109 ++++++------------------------------------- src/layout/workspace.rs | 5 +- 4 files changed, 31 insertions(+), 118 deletions(-) (limited to 'src/layout') diff --git a/src/layout/closing_window.rs b/src/layout/closing_window.rs index 47e039aa..d30d8646 100644 --- a/src/layout/closing_window.rs +++ b/src/layout/closing_window.rs @@ -14,7 +14,8 @@ use smithay::utils::{Logical, Point, Scale, Transform}; use crate::animation::Animation; use crate::niri_render_elements; use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; -use crate::render_helpers::{render_to_encompassing_texture, RenderSnapshot, RenderTarget}; +use crate::render_helpers::snapshot::RenderSnapshot; +use crate::render_helpers::{render_to_encompassing_texture, RenderTarget}; #[derive(Debug)] pub struct ClosingWindow { diff --git a/src/layout/mod.rs b/src/layout/mod.rs index efcc8167..afb101c8 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -50,7 +50,8 @@ pub use self::monitor::MonitorRenderElement; use self::workspace::{compute_working_area, Column, ColumnWidth, OutputId, Workspace}; use crate::niri_render_elements; use crate::render_helpers::renderer::NiriRenderer; -use crate::render_helpers::{BakedBuffer, RenderSnapshot, RenderTarget}; +use crate::render_helpers::snapshot::RenderSnapshot; +use crate::render_helpers::{BakedBuffer, RenderTarget}; use crate::utils::output_size; use crate::window::ResolvedWindowRules; @@ -73,15 +74,6 @@ niri_render_elements! { pub type LayoutElementRenderSnapshot = RenderSnapshot>, BakedBuffer>; -/// Snapshot of an element for animation. -#[derive(Debug)] -pub struct AnimationSnapshot { - /// Snapshot of the render. - pub render: LayoutElementRenderSnapshot, - /// Visual size of the element at the point of the snapshot. - pub size: Size, -} - pub trait LayoutElement { /// Type that can be used as a unique ID of this element. type Id: PartialEq; @@ -118,8 +110,6 @@ pub trait LayoutElement { target: RenderTarget, ) -> Vec>; - fn take_last_render(&self) -> LayoutElementRenderSnapshot; - fn request_size(&mut self, size: Size, animate: bool); fn request_fullscreen(&self, size: Size); fn min_size(&self) -> Size; @@ -150,8 +140,10 @@ pub trait LayoutElement { /// Runs periodic clean-up tasks. fn refresh(&self); - fn animation_snapshot(&self) -> Option<&AnimationSnapshot>; - fn take_animation_snapshot(&mut self) -> Option; + fn take_unmap_snapshot(&self) -> Option; + + fn animation_snapshot(&self) -> Option<&LayoutElementRenderSnapshot>; + fn take_animation_snapshot(&mut self) -> Option; } #[derive(Debug)] @@ -1966,10 +1958,6 @@ mod tests { vec![] } - fn take_last_render(&self) -> LayoutElementRenderSnapshot { - RenderSnapshot::default() - } - fn request_size(&mut self, size: Size, _animate: bool) { self.0.requested_size.set(Some(size)); self.0.pending_fullscreen.set(false); @@ -2024,11 +2012,15 @@ mod tests { &EMPTY } - fn animation_snapshot(&self) -> Option<&AnimationSnapshot> { + fn take_unmap_snapshot(&self) -> Option { + None + } + + fn animation_snapshot(&self) -> Option<&LayoutElementRenderSnapshot> { None } - fn take_animation_snapshot(&mut self) -> Option { + fn take_animation_snapshot(&mut self) -> Option { None } } diff --git a/src/layout/tile.rs b/src/layout/tile.rs index 578de86a..86082f74 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -1,19 +1,17 @@ -use std::cell::OnceCell; use std::cmp::max; use std::rc::Rc; use std::time::Duration; -use niri_config::BlockOutFrom; use smithay::backend::allocator::Fourcc; use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; use smithay::backend::renderer::element::utils::RescaleRenderElement; use smithay::backend::renderer::element::{Element, Kind}; -use smithay::backend::renderer::gles::{GlesRenderer, GlesTexture}; -use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform}; +use smithay::backend::renderer::gles::GlesRenderer; +use smithay::utils::{Logical, Point, Rectangle, Scale, Size, Transform}; use super::focus_ring::{FocusRing, FocusRingRenderElement}; use super::{ - AnimationSnapshot, LayoutElement, LayoutElementRenderElement, Options, + LayoutElement, LayoutElementRenderElement, LayoutElementRenderSnapshot, Options, RESIZE_ANIMATION_THRESHOLD, }; use crate::animation::Animation; @@ -23,9 +21,8 @@ use crate::render_helpers::offscreen::OffscreenRenderElement; use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement; use crate::render_helpers::renderer::NiriRenderer; use crate::render_helpers::shaders::Shaders; -use crate::render_helpers::{ - render_to_encompassing_texture, RenderSnapshot, RenderTarget, ToRenderElement, -}; +use crate::render_helpers::snapshot::RenderSnapshot; +use crate::render_helpers::{render_to_encompassing_texture, RenderTarget, ToRenderElement}; /// Toplevel window with decorations. #[derive(Debug)] @@ -96,10 +93,7 @@ niri_render_elements! { struct ResizeAnimation { anim: Animation, size_from: Size, - snapshot: AnimationSnapshot, - /// Snapshot rendered into a texture (happens lazily). - snapshot_texture: OnceCell)>>, - snapshot_blocked_out_texture: OnceCell)>>, + snapshot: LayoutElementRenderSnapshot, } #[derive(Debug)] @@ -167,8 +161,6 @@ impl Tile { anim, size_from, snapshot: animate_from, - snapshot_texture: OnceCell::new(), - snapshot_blocked_out_texture: OnceCell::new(), }); } else { self.resize_animation = None; @@ -499,7 +491,7 @@ impl Tile { if let Some(resize) = &self.resize_animation { if Shaders::get(gles_renderer).crossfade.is_some() { - if let Some(texture_from) = resize.rendered_texture(gles_renderer, scale, target) { + if let Some(texture_from) = resize.snapshot.texture(gles_renderer, scale, target) { let window_elements = self.window .render(gles_renderer, Point::from((0, 0)), scale, 1., target); @@ -702,13 +694,10 @@ impl Tile { renderer: &mut GlesRenderer, scale: Scale, view_size: Size, - ) -> RenderSnapshot { - let snapshot = self.window.take_last_render(); - if snapshot.contents.is_empty() { - return RenderSnapshot::default(); - } + ) -> Option> { + let snapshot = self.window.take_unmap_snapshot()?; - RenderSnapshot { + Some(RenderSnapshot { contents: self.render_snapshot(renderer, scale, view_size, snapshot.contents), blocked_out_contents: self.render_snapshot( renderer, @@ -717,79 +706,9 @@ impl Tile { snapshot.blocked_out_contents, ), block_out_from: snapshot.block_out_from, - } - } -} - -impl ResizeAnimation { - fn rendered_texture( - &self, - renderer: &mut GlesRenderer, - scale: Scale, - target: RenderTarget, - ) -> &Option<(GlesTexture, Rectangle)> { - let block_out = match self.snapshot.render.block_out_from { - None => false, - Some(BlockOutFrom::Screencast) => target == RenderTarget::Screencast, - Some(BlockOutFrom::ScreenCapture) => target != RenderTarget::Output, - }; - - if block_out { - self.snapshot_blocked_out_texture.get_or_init(|| { - let _span = tracy_client::span!("ResizeAnimation::rendered_texture"); - - let elements: Vec<_> = self - .snapshot - .render - .blocked_out_contents - .iter() - .map(|baked| { - baked.to_render_element(Point::from((0, 0)), scale, 1., Kind::Unspecified) - }) - .collect(); - - match render_to_encompassing_texture( - renderer, - scale, - Transform::Normal, - Fourcc::Abgr8888, - &elements, - ) { - Ok((texture, _sync_point, geo)) => Some((texture, geo)), - Err(err) => { - warn!("error rendering snapshot to texture: {err:?}"); - None - } - } - }) - } else { - self.snapshot_texture.get_or_init(|| { - let _span = tracy_client::span!("ResizeAnimation::rendered_texture"); - - let elements: Vec<_> = self - .snapshot - .render - .contents - .iter() - .map(|baked| { - baked.to_render_element(Point::from((0, 0)), scale, 1., Kind::Unspecified) - }) - .collect(); - - match render_to_encompassing_texture( - renderer, - scale, - Transform::Normal, - Fourcc::Abgr8888, - &elements, - ) { - Ok((texture, _sync_point, geo)) => Some((texture, geo)), - Err(err) => { - warn!("error rendering snapshot to texture: {err:?}"); - None - } - } - }) - } + size: snapshot.size, + texture: Default::default(), + blocked_out_texture: Default::default(), + }) } } diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 202867af..ef8548ae 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -965,8 +965,9 @@ impl Workspace { .map(|o| Scale::from(o.current_scale().fractional_scale())) .unwrap_or(Scale::from(1.)); - let snapshot = tile.take_snapshot_for_close_anim(renderer, output_scale, self.view_size); - if snapshot.contents.is_empty() { + let Some(snapshot) = + tile.take_snapshot_for_close_anim(renderer, output_scale, self.view_size) + else { return; }; -- cgit