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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use super::enums::*;

use gl;
use gl::types::*;
use std::ffi::CString;
use std::ptr;

#[derive(Clone, Copy)]
pub struct GLShader(GLuint);

pub fn gl_create_program() -> GLShader {
    unsafe { GLShader(gl::CreateProgram()) }
}

pub fn gl_create_shader(type_: GLShaderType) -> GLShader {
    unsafe { GLShader(gl::CreateShader(type_ as GLenum)) }
}

/// TODO: MISSING TWO PARAMS (to do with count)
pub fn gl_shader_source(shader: GLShader, source: &str) {
    unsafe {
        gl::ShaderSource(
            shader.0,
            1,
            &CString::new(source).unwrap().as_ptr(),
            ptr::null(),
        );
    }
}

pub fn gl_compile_shader(shader: GLShader) {
    unsafe {
        gl::CompileShader(shader.0);
    }
}

pub fn gl_get_shader_iv(shader: GLShader, parameter: GLShaderInfoParam, status: &mut GLint) {
    unsafe {
        gl::GetShaderiv(shader.0, parameter as GLenum, status);
    }
}

pub fn gl_get_shader_info_log(
    shader: GLShader,
    buffer_size: GLsizei,
    length: &mut GLsizei,
    info_log: &mut Vec<GLchar>,
) {
    unsafe {
        gl::GetShaderInfoLog(
            shader.0,
            buffer_size,
            length,
            info_log.as_mut_ptr() as *mut GLchar,
        );
    }
}

pub fn gl_attach_shader(program: GLShader, shader: GLShader) {
    unsafe {
        gl::AttachShader(program.0, shader.0);
    }
}

pub fn gl_link_program(program: GLShader) {
    unsafe {
        gl::LinkProgram(program.0);
    }
}

pub fn gl_use_program(program: GLShader) {
    unsafe {
        gl::UseProgram(program.0);
    }
}

pub fn gl_delete_program(program: GLShader) {
    unsafe {
        gl::DeleteProgram(program.0);
    }
}

pub fn gl_delete_shader(shader: GLShader) {
    unsafe {
        gl::DeleteShader(shader.0);
    }
}