Skip to main content

grafix_toolbox/kit/opengl/buffer/
mapping.rs

1use super::*;
2
3impl<T: Buffer, D> ArrObj<T, D> {
4	pub fn new(args: impl AllocArgs<D>) -> Self {
5		let (ptr, size, usage) = args.geta();
6		let o = Self::new_empty(size);
7		GL!(glBufferStorage(T::TYPE, o.obj, isize(o.size()), ptr, usage));
8		o
9	}
10	pub fn Update(&mut self, args: impl UpdateArgs<D>) {
11		let (ptr, size, offset) = args.getu();
12		ASSERT!(
13			offset + size <= self.len,
14			"GL {} buffer {} update {} oob, len {}",
15			type_name::<T>(),
16			self.obj,
17			offset + size,
18			self.len
19		);
20		let s = type_size::<D>();
21		GL!(glBufferSubData(T::TYPE, self.obj, isize(offset * s), isize(size * s), ptr));
22	}
23	pub fn Map(&mut self, args: impl MappingArgs) -> Mapping<T, D> {
24		let (offset, len, access) = get_mapping_args(self, args);
25		Mapping::new(self, offset, len, access | gl::MAP_READ_BIT)
26	}
27	pub fn MapMut(&mut self, args: impl MappingArgs) -> MappingMut<T, D> {
28		let (offset, len, access) = get_mapping_args(self, args);
29		MappingMut::new(self, offset, len, access | gl::MAP_WRITE_BIT)
30	}
31}
32
33pub struct Mapping<'l, T: Buffer, D> {
34	o: &'l ArrObj<T, D>,
35	size: usize,
36	pub raw_mem: *const D,
37}
38impl<'l, T: Buffer, D> Mapping<'l, T, D> {
39	pub fn new(o: &'l ArrObj<T, D>, offset: isize, len: usize, access: GLbitfield) -> Self {
40		let raw_mem = GL!(glMapBufferRange(T::TYPE, o.obj, offset, isize(len), access)) as *const D;
41		Self { o, size: len / type_size::<D>(), raw_mem }
42	}
43	pub fn mem(&self) -> &'l [D] {
44		unsafe { std::slice::from_raw_parts(self.raw_mem, self.size) }
45	}
46}
47impl<T: Buffer, D> Drop for Mapping<'_, T, D> {
48	fn drop(&mut self) {
49		let _valid = GL!(glUnmapBuffer(T::TYPE, self.o.obj));
50		ASSERT!(_valid == gl::TRUE, "GL {} buffer {} memory corruption", type_name::<T>(), self.o.obj);
51	}
52}
53
54pub struct MappingMut<'l, T: Buffer, D> {
55	o: &'l ArrObj<T, D>,
56	size: usize,
57	pub raw_mem: *mut D,
58}
59impl<'l, T: Buffer, D> MappingMut<'l, T, D> {
60	pub fn new(o: &'l mut ArrObj<T, D>, offset: isize, len: usize, access: GLbitfield) -> Self {
61		let raw_mem = GL!(glMapBufferRange(T::TYPE, o.obj, offset, isize(len), access)) as *mut D;
62		Self { o, size: len / type_size::<D>(), raw_mem }
63	}
64	pub fn mem(&self) -> &'l mut [D] {
65		unsafe { std::slice::from_raw_parts_mut(self.raw_mem, self.size) }
66	}
67}
68impl<T: Buffer, D> Drop for MappingMut<'_, T, D> {
69	fn drop(&mut self) {
70		let _valid = GL!(glUnmapBuffer(T::TYPE, self.o.obj));
71		ASSERT!(_valid == gl::TRUE, "GL {} buffer {} mut memory corruption", type_name::<T>(), self.o.obj);
72	}
73}