From 7319f37f7a88832513dc7a98949f827bf6f13e4d Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 12 Apr 2024 20:38:51 +0400 Subject: Add render_to_encompassing_texture() --- src/render_helpers/mod.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/render_helpers') 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 Default for RenderSnapshot { } } +pub fn render_to_encompassing_texture( + renderer: &mut GlesRenderer, + scale: Scale, + transform: Transform, + fourcc: Fourcc, + elements: &[impl RenderElement], +) -> anyhow::Result<(GlesTexture, SyncPoint, Rectangle)> { + 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, -- cgit