aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_helpers')
-rw-r--r--src/render_helpers/mod.rs36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs
index 12ebd024..f69eec05 100644
--- a/src/render_helpers/mod.rs
+++ b/src/render_helpers/mod.rs
@@ -2,12 +2,13 @@ use std::ptr;
use anyhow::{ensure, Context};
use niri_config::BlockOutFrom;
-use smithay::backend::allocator::Fourcc;
+use smithay::backend::allocator::dmabuf::Dmabuf;
+use smithay::backend::allocator::{Buffer, Fourcc};
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;
-use smithay::backend::renderer::{buffer_dimensions, Bind, ExportMem, Frame, Offscreen, Renderer};
+use smithay::backend::renderer::{Bind, ExportMem, Frame, Offscreen, Renderer};
use smithay::reexports::wayland_server::protocol::wl_buffer::WlBuffer;
use smithay::reexports::wayland_server::protocol::wl_shm;
use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size, Transform};
@@ -233,16 +234,19 @@ pub fn render_to_vec(
Ok(copy.to_vec())
}
-#[cfg(feature = "xdp-gnome-screencast")]
pub fn render_to_dmabuf(
renderer: &mut GlesRenderer,
- dmabuf: smithay::backend::allocator::dmabuf::Dmabuf,
+ dmabuf: Dmabuf,
size: Size<i32, Physical>,
scale: Scale<f64>,
transform: Transform,
elements: impl Iterator<Item = impl RenderElement<GlesRenderer>>,
) -> anyhow::Result<SyncPoint> {
let _span = tracy_client::span!();
+ ensure!(
+ dmabuf.width() == size.w as u32 && dmabuf.height() == size.h as u32,
+ "invalid buffer size"
+ );
renderer.bind(dmabuf).context("error binding texture")?;
render_elements(renderer, size, scale, transform, elements)
}
@@ -250,32 +254,28 @@ pub fn render_to_dmabuf(
pub fn render_to_shm(
renderer: &mut GlesRenderer,
buffer: &WlBuffer,
+ size: Size<i32, Physical>,
scale: Scale<f64>,
transform: Transform,
elements: impl Iterator<Item = impl RenderElement<GlesRenderer>>,
) -> anyhow::Result<()> {
let _span = tracy_client::span!();
-
- let buffer_size = buffer_dimensions(buffer).context("error getting buffer dimensions")?;
- let size = buffer_size.to_logical(1, Transform::Normal).to_physical(1);
-
- let mapping =
- render_and_download(renderer, size, scale, transform, Fourcc::Argb8888, elements)?;
- let bytes = renderer
- .map_texture(&mapping)
- .context("error mapping texture")?;
-
shm::with_buffer_contents_mut(buffer, |shm_buffer, shm_len, buffer_data| {
ensure!(
// The buffer prefers pixels in little endian ...
- buffer_data.format == wl_shm::Format::Argb8888
- && buffer_data.stride == size.w * 4
+ buffer_data.format == wl_shm::Format::Xrgb8888
+ && buffer_data.width == size.w
&& buffer_data.height == size.h
- && shm_len as i32 == buffer_data.stride * buffer_data.height,
+ && buffer_data.stride == size.w * 4
+ && shm_len == buffer_data.stride as usize * buffer_data.height as usize,
"invalid buffer format or size"
);
+ let mapping =
+ render_and_download(renderer, size, scale, transform, Fourcc::Xrgb8888, elements)?;
- ensure!(bytes.len() == shm_len, "mapped buffer has wrong length");
+ let bytes = renderer
+ .map_texture(&mapping)
+ .context("error mapping texture")?;
unsafe {
let _span = tracy_client::span!("copy_nonoverlapping");