diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-09 10:24:09 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-10 18:08:00 +0300 |
| commit | 7019172b677d6332de53f24471dc2edbab30b2d4 (patch) | |
| tree | 13a1cb33c46bc69de1ca664605ea8fe879e3a12a /src/render_helpers | |
| parent | be62bd123ae44d92b2d74ca714a7f029faccc921 (diff) | |
| download | niri-7019172b677d6332de53f24471dc2edbab30b2d4.tar.gz niri-7019172b677d6332de53f24471dc2edbab30b2d4.tar.bz2 niri-7019172b677d6332de53f24471dc2edbab30b2d4.zip | |
Add MemoryBuffer
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/memory.rs | 63 | ||||
| -rw-r--r-- | src/render_helpers/mod.rs | 1 | ||||
| -rw-r--r-- | src/render_helpers/texture.rs | 18 |
3 files changed, 82 insertions, 0 deletions
diff --git a/src/render_helpers/memory.rs b/src/render_helpers/memory.rs new file mode 100644 index 00000000..01cde3f6 --- /dev/null +++ b/src/render_helpers/memory.rs @@ -0,0 +1,63 @@ +use std::sync::Arc; + +use smithay::backend::allocator::format::get_bpp; +use smithay::backend::allocator::Fourcc; +use smithay::utils::{Buffer, Logical, Scale, Size, Transform}; + +#[derive(Clone)] +pub struct MemoryBuffer { + data: Arc<[u8]>, + format: Fourcc, + size: Size<i32, Buffer>, + scale: Scale<f64>, + transform: Transform, +} + +impl MemoryBuffer { + pub fn new( + data: impl Into<Arc<[u8]>>, + format: Fourcc, + size: impl Into<Size<i32, Buffer>>, + scale: impl Into<Scale<f64>>, + transform: Transform, + ) -> Self { + let data = data.into(); + + let size = size.into(); + let stride = + size.w * (get_bpp(format).expect("Format with unknown bits per pixel") / 8) as i32; + assert!(data.len() >= (stride * size.h) as usize); + + Self { + data, + format, + size, + scale: scale.into(), + transform, + } + } + + pub fn data(&self) -> &[u8] { + &self.data + } + + pub fn format(&self) -> Fourcc { + self.format + } + + pub fn size(&self) -> Size<i32, Buffer> { + self.size + } + + pub fn scale(&self) -> Scale<f64> { + self.scale + } + + pub fn transform(&self) -> Transform { + self.transform + } + + pub fn logical_size(&self) -> Size<f64, Logical> { + self.size.to_f64().to_logical(self.scale, self.transform) + } +} diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs index dcb51e7c..db78fbe3 100644 --- a/src/render_helpers/mod.rs +++ b/src/render_helpers/mod.rs @@ -21,6 +21,7 @@ pub mod border; pub mod clipped_surface; pub mod damage; pub mod debug; +pub mod memory; pub mod offscreen; pub mod primary_gpu_texture; pub mod render_elements; diff --git a/src/render_helpers/texture.rs b/src/render_helpers/texture.rs index c1eec367..b818547d 100644 --- a/src/render_helpers/texture.rs +++ b/src/render_helpers/texture.rs @@ -4,6 +4,8 @@ use smithay::backend::renderer::utils::{CommitCounter, OpaqueRegions}; use smithay::backend::renderer::{Frame as _, ImportMem, Renderer, Texture}; use smithay::utils::{Buffer, Logical, Physical, Point, Rectangle, Scale, Size, Transform}; +use super::memory::MemoryBuffer; + /// Smithay's texture buffer, but with fractional scale. #[derive(Debug, Clone)] pub struct TextureBuffer<T> { @@ -67,6 +69,22 @@ impl<T> TextureBuffer<T> { )) } + pub fn from_memory_buffer<R: Renderer<TextureId = T> + ImportMem>( + renderer: &mut R, + buffer: &MemoryBuffer, + ) -> Result<Self, <R as Renderer>::Error> { + Self::from_memory( + renderer, + buffer.data(), + buffer.format(), + buffer.size(), + false, + buffer.scale(), + buffer.transform(), + Vec::new(), + ) + } + pub fn texture(&self) -> &T { &self.texture } |
