From 825995687ae47ed8f68fdb952d397ecb61ace822 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Mon, 3 Feb 2020 08:40:25 +0300 Subject: [PATCH] anvil: add BufferUtils A helper struct which currently contains only a method for retrieving buffer dimensions. Will be used for getting the buffer dimensions early, before rendering, to always have up-to-date size which is not zero. --- anvil/src/buffer_utils.rs | 59 +++++++++++++++++++++++++++++++++++++++ anvil/src/main.rs | 1 + 2 files changed, 60 insertions(+) create mode 100644 anvil/src/buffer_utils.rs diff --git a/anvil/src/buffer_utils.rs b/anvil/src/buffer_utils.rs new file mode 100644 index 0000000..c568d9d --- /dev/null +++ b/anvil/src/buffer_utils.rs @@ -0,0 +1,59 @@ +use std::{cell::RefCell, rc::Rc}; + +use slog::Logger; + +#[cfg(feature = "egl")] +use smithay::backend::egl::{BufferAccessError, EGLDisplay}; +use smithay::{ + reexports::wayland_server::protocol::wl_buffer::WlBuffer, + wayland::shm::with_buffer_contents as shm_buffer_contents, +}; + +/// Utilities for working with `WlBuffer`s. +#[derive(Clone)] +pub struct BufferUtils { + #[cfg(feature = "egl")] + egl_display: Rc>>, + log: Logger, +} + +impl BufferUtils { + /// Creates a new `BufferUtils`. + #[cfg(feature = "egl")] + pub fn new(egl_display: Rc>>, log: Logger) -> Self { + Self { egl_display, log } + } + + /// Creates a new `BufferUtils`. + #[cfg(not(feature = "egl"))] + pub fn new(log: Logger) -> Self { + Self { log } + } + + /// Returns the dimensions of an image stored in the buffer. + #[cfg(feature = "egl")] + pub fn dimensions(&self, buffer: &WlBuffer) -> Option<(i32, i32)> { + // Try to retrieve the EGL dimensions of this buffer, and, if that fails, the shm dimensions. + self.egl_display + .borrow() + .as_ref() + .and_then(|display| display.egl_buffer_dimensions(buffer)) + .or_else(|| self.shm_buffer_dimensions(buffer)) + } + + /// Returns the dimensions of an image stored in the buffer. + #[cfg(not(feature = "egl"))] + pub fn dimensions(&self, buffer: &WlBuffer) -> Option<(i32, i32)> { + self.shm_buffer_dimensions(buffer) + } + + /// Returns the dimensions of an image stored in the shm buffer. + fn shm_buffer_dimensions(&self, buffer: &WlBuffer) -> Option<(i32, i32)> { + shm_buffer_contents(buffer, |_, data| (data.width, data.height)) + .map_err(|err| { + warn!(self.log, "Unable to load buffer contents"; "err" => format!("{:?}", err)); + err + }) + .ok() + } +} diff --git a/anvil/src/main.rs b/anvil/src/main.rs index 079802e..f593091 100644 --- a/anvil/src/main.rs +++ b/anvil/src/main.rs @@ -12,6 +12,7 @@ use smithay::reexports::{calloop::EventLoop, wayland_server::Display}; #[macro_use] mod shaders; +mod buffer_utils; mod glium_drawer; mod input_handler; mod shell;