mallumo_gls/buffer/
immutable_buffer.rs

1use super::Buffer;
2use super::errors::*;
3
4use std::mem::size_of;
5
6use raw::{create_buffer, delete_buffer, named_buffer_storage, BufferData, BufferId, BufferMutability};
7
8#[derive(Debug)]
9pub struct ImmutableBuffer {
10    id: BufferId,
11}
12
13impl ImmutableBuffer {
14    /// Creates new buffer and copies `data` to its memory on GPU
15    ///
16    /// # Errors
17    /// - BufferCreationError(GL_OUT_OF_MEMORY) - if the buffer cannot be created
18    ///
19    pub fn new<T>(data: &[T]) -> Result<ImmutableBuffer> {
20        if data.len() * size_of::<T>() == 0 {
21            bail!("Buffer size must be greater than 0");
22        }
23
24        let id = create_buffer();
25
26        unsafe {
27            named_buffer_storage(
28                id,
29                BufferData::Data(data),
30                BufferMutability::Immutable,
31                None,
32            ).chain_err(|| ErrorKind::BufferCreationError)?;
33        }
34
35        Ok(ImmutableBuffer { id: id })
36    }
37}
38
39impl Buffer for ImmutableBuffer {
40    fn get_id(&self) -> BufferId {
41        self.id
42    }
43}
44
45impl Drop for ImmutableBuffer {
46    fn drop(&mut self) {
47        unsafe {
48            delete_buffer(self.id);
49        }
50    }
51}