use std::os::raw::c_char;
use std::{ptr, str};
use gl::types::*;
use gl;
pub fn compile_shader(src: *const c_char, ty: GLenum) -> GLuint {
unsafe {
let shader = gl::CreateShader(ty);
gl::ShaderSource(shader, 1, &src, ptr::null());
gl::CompileShader(shader);
let mut status = gl::FALSE as GLint;
gl::GetShaderiv(shader, gl::COMPILE_STATUS, &mut status);
if status != (gl::TRUE as GLint) {
let mut len = 0;
gl::GetShaderiv(shader, gl::INFO_LOG_LENGTH, &mut len);
let mut buf = Vec::with_capacity(len as usize - 1);
buf.set_len(len as usize - 1); gl::GetShaderInfoLog(shader, len, ptr::null_mut(), buf.as_mut_ptr() as *mut GLchar);
panic!("{}", str::from_utf8(&buf).ok().expect("glGetShaderInfoLog returned invalid utf8"));
}
shader
}
}
pub fn link_program(vs: GLuint, fs: GLuint) -> GLuint {
unsafe {
let program = gl::CreateProgram();
gl::AttachShader(program, vs);
gl::AttachShader(program, fs);
gl::LinkProgram(program);
let mut status = gl::FALSE as GLint;
gl::GetProgramiv(program, gl::LINK_STATUS, &mut status);
if status != (gl::TRUE as GLint) {
let mut len: GLint = 0;
gl::GetProgramiv(program, gl::INFO_LOG_LENGTH, &mut len);
let mut buf = Vec::with_capacity(len as usize - 1);
buf.set_len(len as usize - 1); gl::GetProgramInfoLog(program, len, ptr::null_mut(), buf.as_mut_ptr() as *mut GLchar);
panic!("{}", str::from_utf8(&buf).ok().expect("glGetProgramInfoLog returned invalid utf8"));
}
program
}
}