Skip to content

Commit

Permalink
Add program binary functions
Browse files Browse the repository at this point in the history
  • Loading branch information
sotaroikeda committed Nov 8, 2017
1 parent 8a4f08b commit 2cecc19
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "gleam"
version = "0.4.12"
version = "0.4.13"
license = "Apache-2.0/MIT"
authors = ["The Servo Project Developers"]
build = "build.rs"
Expand Down
3 changes: 2 additions & 1 deletion build.rs
Expand Up @@ -17,7 +17,8 @@ fn main() {
"GL_EXT_debug_marker",
"GL_APPLE_client_storage",
"GL_APPLE_texture_range",
"GL_APPLE_fence"];
"GL_APPLE_fence",
"GL_ARB_get_program_binary"];
let gl_reg = Registry::new(Api::Gl, (3, 3), Profile::Core, Fallbacks::All, gl_extensions);
gl_reg.write_bindings(gl_generator::StructGenerator, &mut file_gl)
.unwrap();
Expand Down
3 changes: 3 additions & 0 deletions src/gl.rs
Expand Up @@ -376,6 +376,9 @@ pub trait Gl {
fn get_uniform_location(&self, program: GLuint, name: &str) -> c_int;
fn get_program_info_log(&self, program: GLuint) -> String;
fn get_program_iv(&self, program: GLuint, pname: GLenum) -> GLint;
fn get_program_binary(&self, program: GLuint) -> (Vec<u8>, GLenum);
fn program_binary(&self, program: GLuint, format: GLenum, binary: &[u8]);
fn program_parameter_i(&self, program: GLuint, pname: GLenum, value: GLint);
fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum) -> GLint;
fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum) -> Vec<GLfloat>;
fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr;
Expand Down
47 changes: 47 additions & 0 deletions src/gl_fns.rs
Expand Up @@ -1149,6 +1149,53 @@ impl Gl for GlFns {
}
}

fn get_program_binary(&self, program: GLuint) -> (Vec<u8>, GLenum) {
if !self.ffi_gl_.GetProgramBinary.is_loaded() {
return (Vec::new(), NONE);
}
let len = self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH);
if len <= 0 {
return (Vec::new(), NONE);
}
let mut binary: Vec<u8> = Vec::with_capacity(len as usize);
let mut format = NONE;
let mut out_len = 0;
unsafe {
binary.set_len(len as usize);
self.ffi_gl_.GetProgramBinary(program,
len,
&mut out_len as *mut GLsizei,
&mut format,
binary.as_mut_ptr() as *mut c_void);
}
if len != out_len {
return (Vec::new(), NONE);
}

(binary, format)
}

fn program_binary(&self, program: GLuint, format: GLenum, binary: &[u8]) {
if !self.ffi_gl_.ProgramBinary.is_loaded() {
return;
}
unsafe {
self.ffi_gl_.ProgramBinary(program,
format,
binary.as_ptr() as *const c_void,
binary.len() as GLsizei);
}
}

fn program_parameter_i(&self, program: GLuint, pname: GLenum, value: GLint) {
if !self.ffi_gl_.ProgramParameteri.is_loaded() {
return;
}
unsafe {
self.ffi_gl_.ProgramParameteri(program, pname, value);
}
}

fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum) -> GLint {
unsafe {
let mut result: GLint = 0 as GLint;
Expand Down
38 changes: 38 additions & 0 deletions src/gles_fns.rs
Expand Up @@ -1121,6 +1121,44 @@ impl Gl for GlesFns {
}
}

fn get_program_binary(&self, program: GLuint) -> (Vec<u8>, GLenum) {
let len = self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH);
if len <= 0 {
return (Vec::new(), NONE);
}
let mut binary: Vec<u8> = Vec::with_capacity(len as usize);
let mut format = NONE;
let mut out_len = 0;
unsafe {
binary.set_len(len as usize);
self.ffi_gl_.GetProgramBinary(program,
len,
&mut out_len as *mut GLsizei,
&mut format,
binary.as_mut_ptr() as *mut c_void);
}
if len != out_len {
return (Vec::new(), NONE);
}

(binary, format)
}

fn program_binary(&self, program: GLuint, format: GLenum, binary: &[u8]) {
unsafe {
self.ffi_gl_.ProgramBinary(program,
format,
binary.as_ptr() as *const c_void,
binary.len() as GLsizei);
}
}

fn program_parameter_i(&self, program: GLuint, pname: GLenum, value: GLint) {
unsafe {
self.ffi_gl_.ProgramParameteri(program, pname, value);
}
}

fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum) -> GLint {
unsafe {
let mut result: GLint = 0 as GLint;
Expand Down

0 comments on commit 2cecc19

Please sign in to comment.