mallumo_gls/buffer/
mapped_mutable_buffer.rs1use 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 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 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}