diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-12 20:38:51 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-04-12 20:38:51 +0400 |
| commit | 7319f37f7a88832513dc7a98949f827bf6f13e4d (patch) | |
| tree | 94f0c520da98b18750317c2735fe1b1de8445bd3 /src | |
| parent | 0cd149c939c1f756a96381a84801073021ac1e63 (diff) | |
| download | niri-7319f37f7a88832513dc7a98949f827bf6f13e4d.tar.gz niri-7319f37f7a88832513dc7a98949f827bf6f13e4d.tar.bz2 niri-7319f37f7a88832513dc7a98949f827bf6f13e4d.zip | |
Add render_to_encompassing_texture()
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout/closing_window.rs | 24 | ||||
| -rw-r--r-- | src/render_helpers/mod.rs | 23 |
2 files changed, 28 insertions, 19 deletions
diff --git a/src/layout/closing_window.rs b/src/layout/closing_window.rs index f863a5d3..47e039aa 100644 --- a/src/layout/closing_window.rs +++ b/src/layout/closing_window.rs @@ -14,7 +14,7 @@ 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_texture, RenderSnapshot, RenderTarget}; +use crate::render_helpers::{render_to_encompassing_texture, RenderSnapshot, RenderTarget}; #[derive(Debug)] pub struct ClosingWindow { @@ -70,33 +70,19 @@ impl ClosingWindow { let _span = tracy_client::span!("ClosingWindow::new"); let mut render_to_buffer = |elements: Vec<E>| -> anyhow::Result<_> { - let geo = elements - .iter() - .map(|ele| ele.geometry(Scale::from(f64::from(scale)))) - .reduce(|a, b| a.merge(b)) - .unwrap_or_default(); - - let elements = elements.iter().rev().map(|ele| { - RelocateRenderElement::from_element( - ele, - (-geo.loc.x, -geo.loc.y), - Relocate::Relative, - ) - }); - let offset = geo.loc.to_logical(scale); - - let (texture, _sync_point) = render_to_texture( + let (texture, _sync_point, geo) = render_to_encompassing_texture( renderer, - geo.size, Scale::from(scale as f64), Transform::Normal, Fourcc::Abgr8888, - elements, + &elements, ) .context("error rendering to texture")?; let buffer = TextureBuffer::from_texture(renderer, texture, scale, Transform::Normal, None); + let offset = geo.loc.to_logical(scale); + Ok((buffer, offset)) }; diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs index e780de4e..c445240d 100644 --- a/src/render_helpers/mod.rs +++ b/src/render_helpers/mod.rs @@ -5,6 +5,7 @@ use niri_config::BlockOutFrom; use smithay::backend::allocator::Fourcc; use smithay::backend::renderer::element::solid::{SolidColorBuffer, SolidColorRenderElement}; use smithay::backend::renderer::element::texture::{TextureBuffer, TextureRenderElement}; +use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement}; use smithay::backend::renderer::element::{Kind, RenderElement}; use smithay::backend::renderer::gles::{GlesMapping, GlesRenderer, GlesTexture}; use smithay::backend::renderer::sync::SyncPoint; @@ -124,6 +125,28 @@ impl<C, B> Default for RenderSnapshot<C, B> { } } +pub fn render_to_encompassing_texture( + renderer: &mut GlesRenderer, + scale: Scale<f64>, + transform: Transform, + fourcc: Fourcc, + elements: &[impl RenderElement<GlesRenderer>], +) -> anyhow::Result<(GlesTexture, SyncPoint, Rectangle<i32, Physical>)> { + let geo = elements + .iter() + .map(|ele| ele.geometry(scale)) + .reduce(|a, b| a.merge(b)) + .unwrap_or_default(); + let elements = elements.iter().rev().map(|ele| { + RelocateRenderElement::from_element(ele, (-geo.loc.x, -geo.loc.y), Relocate::Relative) + }); + + let (texture, sync_point) = + render_to_texture(renderer, geo.size, scale, transform, fourcc, elements)?; + + Ok((texture, sync_point, geo)) +} + pub fn render_to_texture( renderer: &mut GlesRenderer, size: Size<i32, Physical>, |
