aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-04-12 20:38:51 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-04-12 20:38:51 +0400
commit7319f37f7a88832513dc7a98949f827bf6f13e4d (patch)
tree94f0c520da98b18750317c2735fe1b1de8445bd3
parent0cd149c939c1f756a96381a84801073021ac1e63 (diff)
downloadniri-7319f37f7a88832513dc7a98949f827bf6f13e4d.tar.gz
niri-7319f37f7a88832513dc7a98949f827bf6f13e4d.tar.bz2
niri-7319f37f7a88832513dc7a98949f827bf6f13e4d.zip
Add render_to_encompassing_texture()
-rw-r--r--src/layout/closing_window.rs24
-rw-r--r--src/render_helpers/mod.rs23
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>,