pub struct MemPool {
    inner: Inner,
    buffer_count: Rc<RefCell<u32>>,
    callback: Rc<RefCell<dyn FnMut(DispatchData<'_>)>>,
}
Expand description

A wrapper handling an SHM memory pool backed by a shared memory file

This wrapper handles for you the creation of the shared memory file and its synchronization with the protocol.

Mempool internally tracks the release of the buffers by the compositor. As such, creating a buffer that is not commited to a surface (and then never released by the server) would cause the Mempool to be stuck believing it is still in use.

Mempool will also handle the destruction of buffers and as such the destroy() method should not be used on buffers created from Mempool.

Overwriting the contents of the memory pool before it is completely freed may cause graphical glitches due to the possible corruption of data while the compositor is reading it.

Mempool requires a callback that will be called when the pool becomes free, this happens when all the pools buffers are released by the server.

Fields§

§inner: Inner§buffer_count: Rc<RefCell<u32>>§callback: Rc<RefCell<dyn FnMut(DispatchData<'_>)>>

Implementations§

source§

impl MemPool

source

pub fn new<F>(shm: Attached<WlShm>, callback: F) -> Result<MemPool>where F: FnMut(DispatchData<'_>) + 'static,

Create a new memory pool associated with given shm

source

pub fn resize(&mut self, newsize: usize) -> Result<()>

Resize the memory pool

This affect the size as it is seen by the wayland server. Even if you extend the temporary file size by writing to it, you need to call this method otherwise the server won’t see the new size.

Memory pools can only be extented, as such this method will do nothing if the requested new size is smaller than the current size.

This method allows you to ensure the underlying pool is large enough to hold what you want to write to it.

source

pub fn buffer( &self, offset: i32, width: i32, height: i32, stride: i32, format: Format ) -> WlBuffer

Create a new buffer to this pool

The parameters are:

  • offset: the offset (in bytes) from the beginning of the pool at which this buffer starts
  • width: the width of this buffer (in pixels)
  • height: the height of this buffer (in pixels)
  • stride: distance (in bytes) between the beginning of a row and the next one
  • format: the encoding format of the pixels. Using a format that was not advertised to the wl_shm global by the server is a protocol error and will terminate your connection
source

pub fn mmap(&mut self) -> &mut MmapMut

Uses the memmap2 crate to map the underlying shared memory file

source

pub fn is_used(&self) -> bool

Returns true if the pool contains buffers that are currently in use by the server

Trait Implementations§

source§

impl Debug for MemPool

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Seek for MemPool

source§

fn seek(&mut self, pos: SeekFrom) -> Result<u64>

Seek to an offset, in bytes, in a stream. Read more
1.55.0 · source§

fn rewind(&mut self) -> Result<(), Error>

Rewind to the beginning of a stream. Read more
source§

fn stream_len(&mut self) -> Result<u64, Error>

🔬This is a nightly-only experimental API. (seek_stream_len)
Returns the length of this stream (in bytes). Read more
1.51.0 · source§

fn stream_position(&mut self) -> Result<u64, Error>

Returns the current seek position from the start of the stream. Read more
source§

impl Write for MemPool

source§

fn write(&mut self, buf: &[u8]) -> Result<usize>

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn flush(&mut self) -> Result<()>

Flush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
1.36.0 · source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
1.0.0 · source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error encountered. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Selfwhere Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more

Auto Trait Implementations§

§

impl !RefUnwindSafe for MemPool

§

impl !Send for MemPool

§

impl !Sync for MemPool

§

impl Unpin for MemPool

§

impl !UnwindSafe for MemPool

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.