Skip to main content

closed_gl/
functions.rs

1use std::ffi::c_void;
2
3use crate::{GLbitfield, GLenum, GLerror, GLint, GLintptr, GLsizei, GLsizeiptr, GLuint, constants::GL_FALSE};
4
5pub fn gl_get_error() -> GLenum {
6    unsafe { gl::GetError() }
7}
8
9pub fn gl_load_with<F: FnMut(&'static str) -> *const c_void>(loadfn: F) {
10    gl::load_with(loadfn);
11}
12
13pub fn check_errors<T>(output: T) -> Result<T, GLerror> {
14    let err: GLenum = gl_get_error();
15
16    if err == 0 {
17        return Ok(output);
18    } else {
19        Err(GLerror::from_gl_error(err))
20    }    
21}
22
23pub fn gl_create_shader(shader_type: GLenum) -> Result<GLuint, GLerror> {
24    let output: u32 = unsafe { gl::CreateShader(shader_type) };
25
26    if output == 0 {
27       return Err(GLerror::CreateShaderFail);
28    }
29
30    return Ok(output);
31}
32
33pub fn gl_shader_source(shader: GLuint, count: GLsizei, string: &str, length: &mut GLint) {
34    let str_ptr: [*const i8; 1] = [string.as_ptr() as *const i8];
35    unsafe { gl::ShaderSource(shader, count, str_ptr.as_ptr(), length); };
36}
37
38pub fn gl_compile_shader(shader: GLuint) {
39    unsafe { gl::CompileShader(shader) };
40}
41
42pub fn gl_create_program() -> Result<GLuint, GLerror> {
43    let output: GLuint = unsafe { gl::CreateProgram() };
44
45    if output == 0 {
46        return Err(GLerror::CreateProgramFail);
47    }
48
49    return Ok(output);
50}
51
52pub fn gl_attach_shader(program: GLuint, shader: GLuint) {
53    unsafe { gl::AttachShader(program, shader) };
54}
55
56pub fn gl_link_program(program: GLuint) {
57    unsafe { gl::LinkProgram(program) };
58}
59
60pub fn gl_delete_shader(shader: GLuint) {
61    unsafe { gl::DeleteShader(shader) };
62}
63
64pub fn gl_use_program(program: GLuint) {
65    unsafe { gl::UseProgram(program) };
66}
67
68pub fn gl_dispatch_compute(num_groups_x: GLuint, num_groups_y: GLuint, num_groups_z: GLuint, ) {
69    unsafe { gl::DispatchCompute(num_groups_x, num_groups_y, num_groups_z) };
70}
71
72pub fn gl_gen_buffers(n: GLsizei, buffers: &mut [GLuint]) {
73    unsafe { gl::GenBuffers(n, buffers.as_mut_ptr()); }
74}
75
76pub fn gl_bind_buffer(target: GLenum, buffer: GLuint) {
77    unsafe { gl::BindBuffer(target, buffer); }
78}
79
80pub fn gl_buffer_data<T>(target: GLenum, data: &[T], usage: GLenum) {
81    unsafe { gl::BufferData(target, (data.len() * size_of::<T>()) as GLsizeiptr, data.as_ptr() as *const c_void, usage); }
82}
83
84pub fn gl_bind_buffer_base(target: GLenum, index: GLuint, buffer: GLuint) {
85    unsafe { gl::BindBufferBase(target, index, buffer); }
86}
87
88pub fn gl_memory_barrier(barriers: GLbitfield) {
89    unsafe { gl::MemoryBarrier(barriers); }
90}
91
92pub fn gl_unmap_buffer(target: GLenum) -> Result<(), GLerror> {
93    let output = unsafe { gl::UnmapBuffer(target) };
94
95    if output == GL_FALSE {
96        check_errors(())
97    } else {
98        Ok(())
99    }
100}
101
102pub fn gl_delete_program(program: GLuint) {
103    unsafe { gl::DeleteProgram(program); }
104}
105
106pub fn gl_delete_buffers(n: GLsizei, buffers: &mut [GLuint]) {
107    unsafe { gl::DeleteBuffers(n, buffers.as_mut_ptr()); }
108}
109
110pub fn gl_map_buffer_range<T>(target: GLenum, offset: GLintptr, length: GLsizeiptr, access: GLbitfield) -> Vec<T> {
111    let ptr: *mut T = unsafe { gl::MapBufferRange(target, offset, length, access)  as *mut T };
112
113    unsafe { Vec::from_raw_parts(ptr, length as usize, (length as usize) * size_of::<T>()) }
114}