1use super::*;
2
3pub type Buffer = gl::types::GLuint;
4
5impl Context {
6 pub fn bind_buffer(&self, target: Enum, buffer: &Buffer) {
7 unsafe {
8 gl::BindBuffer(target, *buffer);
9 }
10 }
11
12 pub fn buffer_data<T>(&self, target: Enum, data: &[T], usage: Enum) {
13 unsafe {
14 gl::BufferData(
15 target,
16 std::mem::size_of_val(data) as SizeIPtr,
17 data.as_ptr() as _,
18 usage,
19 );
20 }
21 }
22
23 pub fn buffer_sub_data<T>(&self, target: Enum, offset: IntPtr, data: &[T]) {
24 unsafe {
25 gl::BufferSubData(
26 target,
27 offset,
28 std::mem::size_of_val(data) as SizeIPtr,
29 data.as_ptr() as _,
30 );
31 }
32 }
33
34 pub fn create_buffer(&self) -> Option<Buffer> {
35 let mut handle = std::mem::MaybeUninit::uninit();
36 unsafe {
37 gl::GenBuffers(1, handle.as_mut_ptr());
38 }
39 let handle = unsafe { handle.assume_init() };
40 if handle == 0 {
41 None
42 } else {
43 Some(handle)
44 }
45 }
46
47 pub fn delete_buffer(&self, buffer: &Buffer) {
48 unsafe {
49 gl::DeleteBuffers(1, buffer);
50 }
51 }
52}