From 2cecc1957410a7acdc75bd81b6525e80d160dd64 Mon Sep 17 00:00:00 2001 From: Sotaro Ikeda Date: Wed, 8 Nov 2017 11:01:07 +0900 Subject: [PATCH] Add program binary functions --- Cargo.toml | 2 +- build.rs | 3 ++- src/gl.rs | 3 +++ src/gl_fns.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/gles_fns.rs | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fd52633..22fdc56 100644 --- a/Cargo.toml +++ b/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" diff --git a/build.rs b/build.rs index eb28641..a3ac957 100644 --- a/build.rs +++ b/build.rs @@ -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(); diff --git a/src/gl.rs b/src/gl.rs index cd6b05a..9862f82 100644 --- a/src/gl.rs +++ b/src/gl.rs @@ -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, 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; fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr; diff --git a/src/gl_fns.rs b/src/gl_fns.rs index 43254f2..5868a19 100644 --- a/src/gl_fns.rs +++ b/src/gl_fns.rs @@ -1149,6 +1149,53 @@ impl Gl for GlFns { } } + fn get_program_binary(&self, program: GLuint) -> (Vec, 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 = 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; diff --git a/src/gles_fns.rs b/src/gles_fns.rs index 00e49ed..db512f0 100644 --- a/src/gles_fns.rs +++ b/src/gles_fns.rs @@ -1121,6 +1121,44 @@ impl Gl for GlesFns { } } + fn get_program_binary(&self, program: GLuint) -> (Vec, GLenum) { + let len = self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH); + if len <= 0 { + return (Vec::new(), NONE); + } + let mut binary: Vec = 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;