mallumo_gls/buffer/
mapped_mutable_buffer.rs

1use super::Buffer;
2use super::errors::*;
3
4use std::mem::size_of;
5use std::os::raw::c_void;
6
7use raw::{create_buffer, delete_buffer, map_named_buffer_range, named_buffer_storage, BufferData, BufferId, BufferMap,
8          BufferMutability};
9
10#[derive(Debug)]
11pub struct MappedMutableBuffer {
12    id: BufferId,
13}
14
15impl MappedMutableBuffer {
16    /// Creates new buffer and copies `data` to its memory on GPU
17    ///
18    /// # Errors
19    /// - GL_OUT_OF_MEMORY - if the buffer cannot be created
20    ///
21    pub fn new<T>(data: &[T]) -> Result<MappedMutableBuffer> {
22        if data.len() * size_of::<T>() == 0 {
23            bail!("Buffer size must be greater than 0");
24        }
25
26        let id = create_buffer();
27
28        unsafe {
29            named_buffer_storage(
30                id,
31                BufferData::Data(data),
32                BufferMutability::Mutable,
33                BufferMap::ReadWrite,
34            ).chain_err(|| ErrorKind::BufferCreationError)?;
35        }
36
37        Ok(MappedMutableBuffer { id: id })
38    }
39
40    /// Creates new empty buffer
41    ///
42    /// # Errors
43    /// - BufferCreationError(GL_OUT_OF_MEMORY) - if the buffer cannot be created
44    ///
45    pub fn new_empty(size: usize) -> Result<MappedMutableBuffer> {
46        if size == 0 {
47            bail!("Buffer size must be greater than 0");
48        }
49
50        let id = create_buffer();
51
52        unsafe {
53            named_buffer_storage::<u8, Option<BufferMap>>(
54                id,
55                BufferData::Empty(size),
56                BufferMutability::Mutable,
57                Some(BufferMap::ReadWrite),
58            ).chain_err(|| ErrorKind::BufferCreationError)?;
59        }
60
61        Ok(MappedMutableBuffer { id: id })
62    }
63
64    pub unsafe fn get_pointer(&self, length: usize, offset: usize) -> Result<*mut c_void> {
65        let pointer: *mut c_void = map_named_buffer_range(self.get_id(), offset, length, BufferMap::ReadWrite)
66            .chain_err(|| ErrorKind::BufferGetPointerError)?;
67        Ok(pointer)
68    }
69}
70
71impl Buffer for MappedMutableBuffer {
72    fn get_id(&self) -> BufferId {
73        self.id
74    }
75}
76
77impl Drop for MappedMutableBuffer {
78    fn drop(&mut self) {
79        unsafe {
80            delete_buffer(self.id);
81        }
82    }
83}