1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use super::{bindless::*, object::*, policy::*, state::*, types::*}; use crate::uses::*; pub struct Mapping<'l, T: State + Buffer, D> { o: &'l ArrObject<T, D>, size: usize, pub raw_mem: *const D, } impl<'l, T: State + Buffer, D> Mapping<'l, T, D> { pub fn new(o: &'l mut ArrObject<T, D>, offset: isize, len: usize, access: GLbitfield) -> Self { let raw_mem = GLCheck!(glMapBufferRange(T::TYPE, o.obj, offset, isize::to(len), access)) as *const D; Self { o, size: len / type_size!(D), raw_mem, } } pub fn mem(&self) -> &'l [D] { unsafe { slice::from_raw_parts(self.raw_mem, self.size) } } } impl<'l, T: State + Buffer, D> Drop for Mapping<'l, T, D> { fn drop(&mut self) { let _valid = GLCheck!(glUnmapBuffer(T::TYPE, self.o.obj)); ASSERT!(_valid == gl::TRUE, "Buffer memory was corrupted by OS"); } } pub struct MappingMut<'l, T: State + Buffer, D> { o: &'l ArrObject<T, D>, size: usize, pub raw_mem: *mut D, } impl<'l, T: State + Buffer, D> MappingMut<'l, T, D> { pub fn new(o: &'l mut ArrObject<T, D>, offset: isize, len: usize, access: GLbitfield) -> Self { let raw_mem = GLCheck!(glMapBufferRange(T::TYPE, o.obj, offset, isize::to(len), access)) as *mut D; Self { o, size: len / type_size!(D), raw_mem, } } pub fn mem(&self) -> &'l mut [D] { unsafe { slice::from_raw_parts_mut(self.raw_mem, self.size) } } } impl<'l, T: State + Buffer, D> Drop for MappingMut<'l, T, D> { fn drop(&mut self) { let _valid = GLCheck!(glUnmapBuffer(T::TYPE, self.o.obj)); ASSERT!(_valid == gl::TRUE, "Buffer memory was corrupted by OS"); } }