aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-10-30 20:28:13 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-10-30 20:28:13 +0400
commit31f6b32fa3390ea05db66ed40a2954001c0700e5 (patch)
treea97bbc07701f9fc9a083e568cd5cd4d153f8d5d0
parent76db55c38cef0a0d437a6d2add5c18272128113b (diff)
downloadniri-31f6b32fa3390ea05db66ed40a2954001c0700e5.tar.gz
niri-31f6b32fa3390ea05db66ed40a2954001c0700e5.tar.bz2
niri-31f6b32fa3390ea05db66ed40a2954001c0700e5.zip
Extract render_to_texture()
-rw-r--r--src/niri.rs36
1 files changed, 27 insertions, 9 deletions
diff --git a/src/niri.rs b/src/niri.rs
index a0830f08..d2466c29 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -1885,7 +1885,7 @@ impl Niri {
let size = output.current_mode().unwrap().size;
let scale = Scale::from(output.current_scale().fractional_scale());
let elements = self.render(renderer, output, true);
- let pixels = render_to_vec(renderer, size, scale, &elements)?;
+ let pixels = render_to_vec(renderer, size, scale, Fourcc::Abgr8888, &elements)?;
self.save_screenshot(size, pixels)
.context("error saving screenshot")
@@ -1910,7 +1910,7 @@ impl Niri {
scale,
1.,
);
- let pixels = render_to_vec(renderer, size, scale, &elements)?;
+ let pixels = render_to_vec(renderer, size, scale, Fourcc::Abgr8888, &elements)?;
self.save_screenshot(size, pixels)
.context("error saving screenshot")
@@ -1996,7 +1996,7 @@ impl Niri {
}
// FIXME: scale.
- let pixels = render_to_vec(renderer, size, Scale::from(1.), &elements)?;
+ let pixels = render_to_vec(renderer, size, Scale::from(1.), Fourcc::Abgr8888, &elements)?;
let path = make_screenshot_path().context("error making screenshot path")?;
debug!("saving screenshot to {path:?}");
@@ -2077,23 +2077,26 @@ impl ClientData for ClientState {
fn disconnected(&self, _client_id: ClientId, _reason: DisconnectReason) {}
}
-fn render_and_download(
+fn render_to_texture(
renderer: &mut GlesRenderer,
size: Size<i32, Physical>,
scale: Scale<f64>,
+ fourcc: Fourcc,
elements: &[impl RenderElement<GlesRenderer>],
-) -> anyhow::Result<GlesMapping> {
- let _span = tracy_client::span!("render_and_download");
+) -> anyhow::Result<(GlesTexture, SyncPoint)> {
+ let _span = tracy_client::span!("render_to_texture");
let output_rect = Rectangle::from_loc_and_size((0, 0), size);
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
- let fourcc = Fourcc::Abgr8888;
let texture: GlesTexture = renderer
.create_buffer(fourcc, buffer_size)
.context("error creating texture")?;
- renderer.bind(texture).context("error binding texture")?;
+ renderer
+ .bind(texture.clone())
+ .context("error binding texture")?;
+
let mut frame = renderer
.render(size, Transform::Normal)
.context("error starting frame")?;
@@ -2107,8 +2110,22 @@ fn render_and_download(
}
let sync_point = frame.finish().context("error finishing frame")?;
+ Ok((texture, sync_point))
+}
+
+fn render_and_download(
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ scale: Scale<f64>,
+ fourcc: Fourcc,
+ elements: &[impl RenderElement<GlesRenderer>],
+) -> anyhow::Result<GlesMapping> {
+ let _span = tracy_client::span!("render_and_download");
+
+ let (_, sync_point) = render_to_texture(renderer, size, scale, fourcc, elements)?;
sync_point.wait();
+ let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
let mapping = renderer
.copy_framebuffer(Rectangle::from_loc_and_size((0, 0), buffer_size), fourcc)
.context("error copying framebuffer")?;
@@ -2119,12 +2136,13 @@ fn render_to_vec(
renderer: &mut GlesRenderer,
size: Size<i32, Physical>,
scale: Scale<f64>,
+ fourcc: Fourcc,
elements: &[impl RenderElement<GlesRenderer>],
) -> anyhow::Result<Vec<u8>> {
let _span = tracy_client::span!("render_to_vec");
let mapping =
- render_and_download(renderer, size, scale, elements).context("error rendering")?;
+ render_and_download(renderer, size, scale, fourcc, elements).context("error rendering")?;
let copy = renderer
.map_texture(&mapping)
.context("error mapping texture")?;