--- a/Cargo.lock
+++ b/Cargo.lock
@@ -849,17 +849,17 @@ source = "registry+https://github.com/ru
dependencies = [
"khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "gleam"
-version = "0.4.32"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "glob"
version = "0.2.11"
@@ -2281,17 +2281,17 @@ dependencies = [
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-text 9.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"dwrote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
"freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.4.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
"plane-split 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2323,17 +2323,17 @@ name = "webrender_bindings"
version = "0.1.0"
dependencies = [
"app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"dwrote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
"foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.4.32 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"webrender 0.57.2",
]
[[package]]
name = "which"
@@ -2531,17 +2531,17 @@ dependencies = [
"checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159"
"checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82"
"checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7"
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
"checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
-"checksum gleam 0.4.32 (registry+https://github.com/rust-lang/crates.io-index)" = "70363479f033b72dbd558fd3b6f153dd824bf4f9dcd05dfcff6cd29a3eb9a63d"
+"checksum gleam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e47b39459e47b76be4d2c82702932cdc66df09dcb8f813424167991adb8b3380"
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
"checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07"
"checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2"
"checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
"checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
"checksum itertools 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3f2be4da1690a039e9ae5fd575f706a63ad5a2120f161b1d653c9da3930dd21"
--- a/third_party/rust/gleam/.cargo-checksum.json
+++ b/third_party/rust/gleam/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"29b74b95210896ce634c11a9037638668473b5a1b3b1716c505cb04dbb6341fa","COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"7eb0bbf4c4679d7be4c073b22b77036fa5f89264ee615bbf1f93bdbcc1b9fe75","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"2de24b7458d6b88f20324303a48acf64a4f2bbfb83d2ec4d6ff2b4f4a1fd2275","build.rs":"a1616d76f35b3a6015c2ee22ecf13eb225095b22e4190ef5ef2fcd9197b43ad1","src/gl.rs":"982935c8c519e749b42f124ed105a3cacefc186d597f476bd72ea7c88a3e5070","src/gl_fns.rs":"ea24ea0c6deb06af7809140facd5e0f7fce2bb5b340ef425ce0b10029e95294a","src/gles_fns.rs":"aaced55ced12f5dcbeec9ee88eb91696ab65ca24c41cb6fd7f2bdf380641ceb7","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"70363479f033b72dbd558fd3b6f153dd824bf4f9dcd05dfcff6cd29a3eb9a63d"}
\ No newline at end of file
+{"files":{".travis.yml":"29b74b95210896ce634c11a9037638668473b5a1b3b1716c505cb04dbb6341fa","COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"96141412a2322a5dfe693d87d5792e7c9859340f751109856024b9870d2289d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"2de24b7458d6b88f20324303a48acf64a4f2bbfb83d2ec4d6ff2b4f4a1fd2275","build.rs":"a1616d76f35b3a6015c2ee22ecf13eb225095b22e4190ef5ef2fcd9197b43ad1","src/gl.rs":"0a2f631a09ddfa267d6dcf2274342529b6f487e1cb982b92e1111a64c1d7437e","src/gl_fns.rs":"ead6bbdc6a937264275e849ed84ab9b1be83624fcea31aa7bde2d933390ee151","src/gles_fns.rs":"ba64f9a124af370121ba526c262ccb0f87ebf6f99115fc25e2a9ae5a8d39af34","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"e47b39459e47b76be4d2c82702932cdc66df09dcb8f813424167991adb8b3380"}
\ No newline at end of file
--- a/third_party/rust/gleam/Cargo.toml
+++ b/third_party/rust/gleam/Cargo.toml
@@ -7,17 +7,17 @@
#
# If you believe there's an error in this file please file an
# issue against the rust-lang/cargo repository. If you're
# editing this file be aware that the upstream Cargo.toml
# will likely look very different (and much more reasonable)
[package]
name = "gleam"
-version = "0.4.32"
+version = "0.5.0"
authors = ["The Servo Project Developers"]
build = "build.rs"
description = "Generated OpenGL bindings and wrapper for Servo."
documentation = "http://doc.servo.org/gleam/"
license = "Apache-2.0/MIT"
repository = "https://github.com/servo/gleam"
[build-dependencies.gl_generator]
version = "0.9"
--- a/third_party/rust/gleam/src/gl.rs
+++ b/third_party/rust/gleam/src/gl.rs
@@ -96,47 +96,64 @@ fn get_uniform_fv_vector_length(uniform_
pub struct DebugMessage {
pub message: String,
pub source: GLenum,
pub ty: GLenum,
pub id: GLenum,
pub severity: GLenum,
}
-pub trait Gl {
+macro_rules! declare_gl_apis {
+ // garbo is a hack to handle unsafe methods.
+ ($($(unsafe $([$garbo:expr])*)* fn $name:ident(&self $(, $arg:ident: $t:ty)* $(,)*) $(-> $retty:ty)* ;)+) => {
+ pub trait Gl {
+ $($(unsafe $($garbo)*)* fn $name(&self $(, $arg:$t)*) $(-> $retty)* ;)+
+ }
+
+ impl Gl for ErrorCheckingGl {
+ $($(unsafe $($garbo)*)* fn $name(&self $(, $arg:$t)*) $(-> $retty)* {
+ let rv = self.gl.$name($($arg,)*);
+ assert_eq!(self.gl.get_error(), 0);
+ rv
+ })+
+ }
+ }
+}
+
+declare_gl_apis! {
fn get_type(&self) -> GlType;
fn buffer_data_untyped(&self,
- target: GLenum,
- size: GLsizeiptr,
- data: *const GLvoid,
- usage: GLenum);
+ target: GLenum,
+ size: GLsizeiptr,
+ data: *const GLvoid,
+ usage: GLenum);
fn buffer_sub_data_untyped(&self,
- target: GLenum,
- offset: isize,
- size: GLsizeiptr,
- data: *const GLvoid);
+ target: GLenum,
+ offset: isize,
+ size: GLsizeiptr,
+ data: *const GLvoid);
fn tex_buffer(&self, target: GLenum, internal_format: GLenum, buffer: GLuint);
fn shader_source(&self, shader: GLuint, strings: &[&[u8]]);
fn read_buffer(&self, mode: GLenum);
fn read_pixels_into_buffer(&self,
- x: GLint,
- y: GLint,
- width: GLsizei,
- height: GLsizei,
- format: GLenum,
- pixel_type: GLenum,
- dst_buffer: &mut [u8]);
+ x: GLint,
+ y: GLint,
+ width: GLsizei,
+ height: GLsizei,
+ format: GLenum,
+ pixel_type: GLenum,
+ dst_buffer: &mut [u8]);
fn read_pixels(&self,
- x: GLint,
- y: GLint,
- width: GLsizei,
- height: GLsizei,
- format: GLenum,
- pixel_type: GLenum)
- -> Vec<u8>;
+ x: GLint,
+ y: GLint,
+ width: GLsizei,
+ height: GLsizei,
+ format: GLenum,
+ pixel_type: GLenum)
+ -> Vec<u8>;
fn sample_coverage(&self, value: GLclampf, invert: bool);
fn polygon_offset(&self, factor: GLfloat, units: GLfloat);
fn pixel_store_i(&self, name: GLenum, param: GLint);
fn gen_buffers(&self, n: GLsizei) -> Vec<GLuint>;
fn gen_renderbuffers(&self, n: GLsizei) -> Vec<GLuint>;
fn gen_framebuffers(&self, n: GLsizei) -> Vec<GLuint>;
fn gen_textures(&self, n: GLsizei) -> Vec<GLuint>;
fn gen_vertex_arrays(&self, n: GLsizei) -> Vec<GLuint>;
@@ -170,19 +187,19 @@ pub trait Gl {
fn bind_attrib_location(&self, program: GLuint, index: GLuint, name: &str);
fn get_uniform_iv(&self, program: GLuint, location: GLint) -> Vec<GLint>;
fn get_uniform_fv(&self, program: GLuint, location: GLint) -> Vec<GLfloat>;
fn get_uniform_block_index(&self, program: GLuint, name: &str) -> GLuint;
fn get_uniform_indices(&self, program: GLuint, names: &[&str]) -> Vec<GLuint>;
fn bind_buffer_base(&self, target: GLenum, index: GLuint, buffer: GLuint);
fn bind_buffer_range(&self, target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr);
fn uniform_block_binding(&self,
- program: GLuint,
- uniform_block_index: GLuint,
- uniform_block_binding: GLuint);
+ program: GLuint,
+ uniform_block_index: GLuint,
+ uniform_block_binding: GLuint);
fn bind_buffer(&self, target: GLenum, buffer: GLuint);
fn bind_vertex_array(&self, vao: GLuint);
fn bind_renderbuffer(&self, target: GLenum, renderbuffer: GLuint);
fn bind_framebuffer(&self, target: GLenum, framebuffer: GLuint);
fn bind_texture(&self, target: GLenum, texture: GLuint);
fn draw_buffers(&self, bufs: &[GLenum]);
fn tex_image_2d(&self,
target: GLenum,
@@ -190,71 +207,71 @@ pub trait Gl {
internal_format: GLint,
width: GLsizei,
height: GLsizei,
border: GLint,
format: GLenum,
ty: GLenum,
opt_data: Option<&[u8]>);
fn compressed_tex_image_2d(&self,
- target: GLenum,
- level: GLint,
- internal_format: GLenum,
- width: GLsizei,
- height: GLsizei,
- border: GLint,
- data: &[u8]);
+ target: GLenum,
+ level: GLint,
+ internal_format: GLenum,
+ width: GLsizei,
+ height: GLsizei,
+ border: GLint,
+ data: &[u8]);
fn compressed_tex_sub_image_2d(&self,
- target: GLenum,
- level: GLint,
- xoffset: GLint,
- yoffset: GLint,
- width: GLsizei,
- height: GLsizei,
- format: GLenum,
- data: &[u8]);
+ target: GLenum,
+ level: GLint,
+ xoffset: GLint,
+ yoffset: GLint,
+ width: GLsizei,
+ height: GLsizei,
+ format: GLenum,
+ data: &[u8]);
fn tex_image_3d(&self,
target: GLenum,
level: GLint,
internal_format: GLint,
width: GLsizei,
height: GLsizei,
depth: GLsizei,
border: GLint,
format: GLenum,
ty: GLenum,
opt_data: Option<&[u8]>);
fn copy_tex_image_2d(&self,
- target: GLenum,
- level: GLint,
- internal_format: GLenum,
- x: GLint,
- y: GLint,
- width: GLsizei,
- height: GLsizei,
- border: GLint);
+ target: GLenum,
+ level: GLint,
+ internal_format: GLenum,
+ x: GLint,
+ y: GLint,
+ width: GLsizei,
+ height: GLsizei,
+ border: GLint);
fn copy_tex_sub_image_2d(&self,
- target: GLenum,
- level: GLint,
- xoffset: GLint,
- yoffset: GLint,
- x: GLint,
- y: GLint,
- width: GLsizei,
- height: GLsizei);
+ target: GLenum,
+ level: GLint,
+ xoffset: GLint,
+ yoffset: GLint,
+ x: GLint,
+ y: GLint,
+ width: GLsizei,
+ height: GLsizei);
fn copy_tex_sub_image_3d(&self,
- target: GLenum,
- level: GLint,
- xoffset: GLint,
- yoffset: GLint,
- zoffset: GLint,
- x: GLint,
- y: GLint,
- width: GLsizei,
- height: GLsizei);
+ target: GLenum,
+ level: GLint,
+ xoffset: GLint,
+ yoffset: GLint,
+ zoffset: GLint,
+ x: GLint,
+ y: GLint,
+ width: GLsizei,
+ height: GLsizei);
fn tex_sub_image_2d(&self,
target: GLenum,
level: GLint,
xoffset: GLint,
yoffset: GLint,
width: GLsizei,
height: GLsizei,
format: GLenum,
@@ -290,109 +307,113 @@ pub trait Gl {
zoffset: GLint,
width: GLsizei,
height: GLsizei,
depth: GLsizei,
format: GLenum,
ty: GLenum,
offset: usize);
fn get_tex_image_into_buffer(&self,
- target: GLenum,
- level: GLint,
- format: GLenum,
- ty: GLenum,
- output: &mut [u8]);
- fn get_integer_v(&self, name: GLenum) -> GLint;
- fn get_integer_64v(&self, name: GLenum) -> GLint64;
- fn get_integer_iv(&self, name: GLenum, index: GLuint) -> GLint;
- fn get_integer_64iv(&self, name: GLenum, index: GLuint) -> GLint64;
- fn get_boolean_v(&self, name: GLenum) -> GLboolean;
- fn get_float_v(&self, name: GLenum) -> GLfloat;
+ target: GLenum,
+ level: GLint,
+ format: GLenum,
+ ty: GLenum,
+ output: &mut [u8]);
+
+ unsafe fn get_integer_v(&self, name: GLenum, result: &mut [GLint]);
+ unsafe fn get_integer_64v(&self, name: GLenum, result: &mut [GLint64]);
+ unsafe fn get_integer_iv(&self, name: GLenum, index: GLuint, result: &mut [GLint]);
+ unsafe fn get_integer_64iv(&self, name: GLenum, index: GLuint, result: &mut [GLint64]);
+ unsafe fn get_boolean_v(&self, name: GLenum, result: &mut [GLboolean]);
+ unsafe fn get_float_v(&self, name: GLenum, result: &mut [GLfloat]);
+
fn get_framebuffer_attachment_parameter_iv(&self,
- target: GLenum,
- attachment: GLenum,
- pname: GLenum) -> GLint;
+ target: GLenum,
+ attachment: GLenum,
+ pname: GLenum) -> GLint;
+ fn get_renderbuffer_parameter_iv(&self,
+ target: GLenum,
+ pname: GLenum) -> GLint;
fn get_tex_parameter_iv(&self, target: GLenum, name: GLenum) -> GLint;
fn get_tex_parameter_fv(&self, target: GLenum, name: GLenum) -> GLfloat;
fn tex_parameter_i(&self, target: GLenum, pname: GLenum, param: GLint);
fn tex_parameter_f(&self, target: GLenum, pname: GLenum, param: GLfloat);
fn framebuffer_texture_2d(&self,
- target: GLenum,
- attachment: GLenum,
- textarget: GLenum,
- texture: GLuint,
- level: GLint);
+ target: GLenum,
+ attachment: GLenum,
+ textarget: GLenum,
+ texture: GLuint,
+ level: GLint);
fn framebuffer_texture_layer(&self,
- target: GLenum,
- attachment: GLenum,
- texture: GLuint,
- level: GLint,
- layer: GLint);
+ target: GLenum,
+ attachment: GLenum,
+ texture: GLuint,
+ level: GLint,
+ layer: GLint);
fn blit_framebuffer(&self,
src_x0: GLint,
src_y0: GLint,
src_x1: GLint,
src_y1: GLint,
dst_x0: GLint,
dst_y0: GLint,
dst_x1: GLint,
dst_y1: GLint,
mask: GLbitfield,
filter: GLenum);
fn vertex_attrib_4f(&self, index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat);
fn vertex_attrib_pointer_f32(&self,
- index: GLuint,
- size: GLint,
- normalized: bool,
- stride: GLsizei,
- offset: GLuint);
+ index: GLuint,
+ size: GLint,
+ normalized: bool,
+ stride: GLsizei,
+ offset: GLuint);
fn vertex_attrib_pointer(&self,
- index: GLuint,
- size: GLint,
- type_: GLenum,
- normalized: bool,
- stride: GLsizei,
- offset: GLuint);
+ index: GLuint,
+ size: GLint,
+ type_: GLenum,
+ normalized: bool,
+ stride: GLsizei,
+ offset: GLuint);
fn vertex_attrib_i_pointer(&self,
- index: GLuint,
- size: GLint,
- type_: GLenum,
- stride: GLsizei,
- offset: GLuint);
+ index: GLuint,
+ size: GLint,
+ type_: GLenum,
+ stride: GLsizei,
+ offset: GLuint);
fn vertex_attrib_divisor(&self, index: GLuint, divisor: GLuint);
fn viewport(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei);
- fn get_viewport(&self) -> (GLint, GLint, GLsizei, GLsizei);
fn scissor(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei);
fn line_width(&self, width: GLfloat);
fn use_program(&self, program: GLuint);
fn validate_program(&self, program: GLuint);
fn draw_arrays(&self, mode: GLenum, first: GLint, count: GLsizei);
fn draw_arrays_instanced(&self,
- mode: GLenum,
- first: GLint,
- count: GLsizei,
- primcount: GLsizei);
+ mode: GLenum,
+ first: GLint,
+ count: GLsizei,
+ primcount: GLsizei);
fn draw_elements(&self,
- mode: GLenum,
- count: GLsizei,
- element_type: GLenum,
- indices_offset: GLuint);
+ mode: GLenum,
+ count: GLsizei,
+ element_type: GLenum,
+ indices_offset: GLuint);
fn draw_elements_instanced(&self,
- mode: GLenum,
- count: GLsizei,
- element_type: GLenum,
- indices_offset: GLuint,
- primcount: GLsizei);
+ mode: GLenum,
+ count: GLsizei,
+ element_type: GLenum,
+ indices_offset: GLuint,
+ primcount: GLsizei);
fn blend_color(&self, r: f32, g: f32, b: f32, a: f32);
fn blend_func(&self, sfactor: GLenum, dfactor: GLenum);
fn blend_func_separate(&self,
- src_rgb: GLenum,
- dest_rgb: GLenum,
- src_alpha: GLenum,
- dest_alpha: GLenum);
+ src_rgb: GLenum,
+ dest_rgb: GLenum,
+ src_alpha: GLenum,
+ dest_alpha: GLenum);
fn blend_equation(&self, mode: GLenum);
fn blend_equation_separate(&self, mode_rgb: GLenum, mode_alpha: GLenum);
fn color_mask(&self, r: bool, g: bool, b: bool, a: bool);
fn cull_face(&self, mode: GLenum);
fn front_face(&self, mode: GLenum);
fn enable(&self, cap: GLenum);
fn disable(&self, cap: GLenum);
fn hint(&self, param_name: GLenum, param_val: GLenum);
@@ -434,32 +455,32 @@ pub trait Gl {
fn get_active_uniforms_iv(&self, program: GLuint, indices: Vec<GLuint>, pname: GLenum) -> Vec<GLint>;
fn get_active_uniform_block_i(&self, program: GLuint, index: GLuint, pname: GLenum) -> GLint;
fn get_active_uniform_block_iv(&self, program: GLuint, index: GLuint, pname: GLenum) -> Vec<GLint>;
fn get_active_uniform_block_name(&self, program: GLuint, index: GLuint) -> String;
fn get_attrib_location(&self, program: GLuint, name: &str) -> c_int;
fn get_frag_data_location(&self, program: GLuint, name: &str) -> c_int;
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;
+ unsafe fn get_program_iv(&self, program: GLuint, pname: GLenum, result: &mut [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>;
+ unsafe fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum, result: &mut [GLint]);
+ unsafe fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum, result: &mut [GLfloat]);
fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr;
fn get_buffer_parameter_iv(&self, target: GLuint, pname: GLenum) -> GLint;
fn get_shader_info_log(&self, shader: GLuint) -> String;
fn get_string(&self, which: GLenum) -> String;
fn get_string_i(&self, which: GLenum, index: GLuint) -> String;
- fn get_shader_iv(&self, shader: GLuint, pname: GLenum) -> GLint;
+ unsafe fn get_shader_iv(&self, shader: GLuint, pname: GLenum, result: &mut [GLint]);
fn get_shader_precision_format(&self,
- shader_type: GLuint,
- precision_type: GLuint)
- -> (GLint, GLint, GLint);
+ shader_type: GLuint,
+ precision_type: GLuint)
+ -> (GLint, GLint, GLint);
fn compile_shader(&self, shader: GLuint);
fn create_program(&self) -> GLuint;
fn delete_program(&self, program: GLuint);
fn create_shader(&self, shader_type: GLenum) -> GLuint;
fn delete_shader(&self, shader: GLuint);
fn detach_shader(&self, program: GLuint, shader: GLuint);
fn link_program(&self, program: GLuint);
fn clear_color(&self, r: f32, g: f32, b: f32, a: f32);
@@ -500,25 +521,30 @@ pub trait Gl {
name: &str,
);
fn get_frag_data_index(
&self,
program: GLuint,
name: &str,
) -> GLint;
- fn alias_point_size_range(&self) -> (GLfloat, GLfloat);
-
- /// Returns the the maximum supported width and height of the viewport.
- fn max_viewport_dims(&self) -> (GLint, GLint);
-
// GL_KHR_debug
fn get_debug_messages(&self) -> Vec<DebugMessage>;
}
+pub struct ErrorCheckingGl {
+ gl: Rc<Gl>,
+}
+
+impl ErrorCheckingGl {
+ pub fn wrap(fns: Rc<Gl>) -> Rc<Gl> {
+ Rc::new(ErrorCheckingGl { gl: fns }) as Rc<Gl>
+ }
+}
+
#[inline]
pub fn buffer_data<T>(gl_: &Gl, target: GLenum, data: &[T], usage: GLenum) {
gl_.buffer_data_untyped(target,
(data.len() * size_of::<T>()) as GLsizeiptr,
data.as_ptr() as *const GLvoid,
usage)
}
--- a/third_party/rust/gleam/src/gl_fns.rs
+++ b/third_party/rust/gleam/src/gl_fns.rs
@@ -650,72 +650,68 @@ impl Gl for GlFns {
self.ffi_gl_.GetTexImage(target,
level,
format,
ty,
output.as_mut_ptr() as *mut _);
}
}
- fn get_integer_v(&self, name: GLenum) -> GLint {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetIntegerv(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_v(&self, name: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetIntegerv(name, result.as_mut_ptr());
}
- fn get_integer_64v(&self, name: GLenum) -> GLint64 {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetInteger64v(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_64v(&self, name: GLenum, result: &mut [GLint64]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetInteger64v(name, result.as_mut_ptr());
}
- fn get_integer_iv(&self, name: GLenum, index: GLuint) -> GLint {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetIntegeri_v(name, index, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_iv(&self, name: GLenum, index: GLuint, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetIntegeri_v(name, index, result.as_mut_ptr());
}
- fn get_integer_64iv(&self, name: GLenum, index: GLuint) -> GLint64 {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetInteger64i_v(name, index, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_64iv(&self, name: GLenum, index: GLuint, result: &mut [GLint64]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetInteger64i_v(name, index, result.as_mut_ptr());
}
- fn get_boolean_v(&self, name: GLenum) -> GLboolean {
- let mut result = 0 as GLboolean;
- unsafe {
- self.ffi_gl_.GetBooleanv(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_boolean_v(&self, name: GLenum, result: &mut [GLboolean]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetBooleanv(name, result.as_mut_ptr());
}
- fn get_float_v(&self, name: GLenum) -> GLfloat {
- let mut result = 0 as GLfloat;
- unsafe {
- self.ffi_gl_.GetFloatv(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_float_v(&self, name: GLenum, result: &mut [GLfloat]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetFloatv(name, result.as_mut_ptr());
}
fn get_framebuffer_attachment_parameter_iv(&self, target: GLenum, attachment: GLenum, pname: GLenum) -> GLint {
let mut result: GLint = 0;
unsafe {
self.ffi_gl_.GetFramebufferAttachmentParameteriv(target, attachment, pname, &mut result);
}
result
}
+ fn get_renderbuffer_parameter_iv(&self, target: GLenum, pname: GLenum) -> GLint {
+ let mut result: GLint = 0;
+ unsafe {
+ self.ffi_gl_.GetRenderbufferParameteriv(target, pname, &mut result);
+ }
+ result
+ }
+
fn get_tex_parameter_iv(&self, target: GLenum, pname: GLenum) -> GLint {
let mut result: GLint = 0;
unsafe {
self.ffi_gl_.GetTexParameteriv(target, pname, &mut result);
}
result
}
@@ -852,24 +848,16 @@ impl Gl for GlFns {
}
fn viewport(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
unsafe {
self.ffi_gl_.Viewport(x, y, width, height);
}
}
- fn get_viewport(&self) -> (GLint, GLint, GLsizei, GLsizei) {
- unsafe {
- let mut ret = [0; 4];
- self.ffi_gl_.GetIntegerv(ffi::VIEWPORT, ret.as_mut_ptr());
- (ret[0], ret[1], ret[2], ret[3])
- }
- }
-
fn scissor(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
unsafe {
self.ffi_gl_.Scissor(x, y, width, height);
}
}
fn line_width(&self, width: GLfloat) {
unsafe {
@@ -1207,38 +1195,59 @@ impl Gl for GlFns {
fn depth_range(&self, near: f64, far: f64) {
unsafe {
self.ffi_gl_.DepthRange(near as GLclampd, far as GLclampd);
}
}
fn get_active_attrib(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
- let buf_size = self.get_program_iv(program, ffi::ACTIVE_ATTRIBUTE_MAX_LENGTH);
- let mut name = vec![0u8; buf_size as usize];
+ let mut buf_size = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::ACTIVE_ATTRIBUTE_MAX_LENGTH, &mut buf_size);
+ }
+ let mut name = vec![0u8; buf_size[0] as usize];
let mut length = 0 as GLsizei;
let mut size = 0 as i32;
let mut type_ = 0 as u32;
unsafe {
- self.ffi_gl_.GetActiveAttrib(program, index, buf_size, &mut length, &mut size, &mut type_, name.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetActiveAttrib(
+ program,
+ index,
+ buf_size[0],
+ &mut length,
+ &mut size,
+ &mut type_,
+ name.as_mut_ptr() as *mut GLchar,
+ );
}
name.truncate(if length > 0 {length as usize} else {0});
(size, type_, String::from_utf8(name).unwrap())
}
fn get_active_uniform(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
- let buf_size = self.get_program_iv(program, ffi::ACTIVE_UNIFORM_MAX_LENGTH);
- let mut name = vec![0 as u8; buf_size as usize];
+ let mut buf_size = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::ACTIVE_UNIFORM_MAX_LENGTH, &mut buf_size);
+ }
+ let mut name = vec![0 as u8; buf_size[0] as usize];
let mut length: GLsizei = 0;
let mut size: i32 = 0;
let mut type_: u32 = 0;
unsafe {
- self.ffi_gl_.GetActiveUniform(program, index, buf_size, &mut length, &mut size,
- &mut type_, name.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetActiveUniform(
+ program,
+ index,
+ buf_size[0],
+ &mut length,
+ &mut size,
+ &mut type_,
+ name.as_mut_ptr() as *mut GLchar,
+ );
}
name.truncate(if length > 0 { length as usize } else { 0 });
(size, type_, String::from_utf8(name).unwrap())
}
fn get_active_uniforms_iv(&self, program: GLuint, indices: Vec<GLuint>, pname: GLenum) -> Vec<GLint> {
@@ -1305,57 +1314,65 @@ impl Gl for GlFns {
fn get_uniform_location(&self, program: GLuint, name: &str) -> c_int {
let name = CString::new(name).unwrap();
unsafe {
self.ffi_gl_.GetUniformLocation(program, name.as_ptr())
}
}
fn get_program_info_log(&self, program: GLuint) -> String {
- let max_len = self.get_program_iv(program, ffi::INFO_LOG_LENGTH);
- let mut result = vec![0u8; max_len as usize];
+ let mut max_len = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::INFO_LOG_LENGTH, &mut max_len);
+ }
+ let mut result = vec![0u8; max_len[0] as usize];
let mut result_len = 0 as GLsizei;
unsafe {
- self.ffi_gl_.GetProgramInfoLog(program,
- max_len as GLsizei,
- &mut result_len,
- result.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetProgramInfoLog(
+ program,
+ max_len[0] as GLsizei,
+ &mut result_len,
+ result.as_mut_ptr() as *mut GLchar,
+ );
}
result.truncate(if result_len > 0 {result_len as usize} else {0});
String::from_utf8(result).unwrap()
}
- fn get_program_iv(&self, program: GLuint, pname: GLenum) -> GLint {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetProgramiv(program, pname, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_program_iv(&self, program: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetProgramiv(program, pname, result.as_mut_ptr());
}
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 {
+ let mut len = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH, &mut len);
+ }
+ if len[0] <= 0 {
return (Vec::new(), NONE);
}
- let mut binary: Vec<u8> = Vec::with_capacity(len as usize);
+ let mut binary: Vec<u8> = Vec::with_capacity(len[0] 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);
+ binary.set_len(len[0] as usize);
+ self.ffi_gl_.GetProgramBinary(
+ program,
+ len[0],
+ &mut out_len as *mut GLsizei,
+ &mut format,
+ binary.as_mut_ptr() as *mut c_void,
+ );
}
- if len != out_len {
+ if len[0] != 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() {
@@ -1373,30 +1390,26 @@ impl Gl for GlFns {
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 {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetVertexAttribiv(index, pname, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetVertexAttribiv(index, pname, result.as_mut_ptr());
}
- fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum) -> Vec<GLfloat> {
- let mut result = vec![0 as GLfloat; 4];
- unsafe {
- self.ffi_gl_.GetVertexAttribfv(index, pname, result.as_mut_ptr());
- }
- result
+ #[inline]
+ unsafe fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum, result: &mut [GLfloat]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetVertexAttribfv(index, pname, result.as_mut_ptr());
}
fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr {
let mut result = 0 as *mut GLvoid;
unsafe {
self.ffi_gl_.GetVertexAttribPointerv(index, pname, &mut result)
}
result as GLsizeiptr
@@ -1406,24 +1419,29 @@ impl Gl for GlFns {
let mut result = 0 as GLint;
unsafe {
self.ffi_gl_.GetBufferParameteriv(target, pname, &mut result);
}
result
}
fn get_shader_info_log(&self, shader: GLuint) -> String {
- let max_len = self.get_shader_iv(shader, ffi::INFO_LOG_LENGTH);
- let mut result = vec![0u8; max_len as usize];
+ let mut max_len = [0];
+ unsafe {
+ self.get_shader_iv(shader, ffi::INFO_LOG_LENGTH, &mut max_len);
+ }
+ let mut result = vec![0u8; max_len[0] as usize];
let mut result_len = 0 as GLsizei;
unsafe {
- self.ffi_gl_.GetShaderInfoLog(shader,
- max_len as GLsizei,
- &mut result_len,
- result.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetShaderInfoLog(
+ shader,
+ max_len[0] as GLsizei,
+ &mut result_len,
+ result.as_mut_ptr() as *mut GLchar,
+ );
}
result.truncate(if result_len > 0 {result_len as usize} else {0});
String::from_utf8(result).unwrap()
}
fn get_string(&self, which: GLenum) -> String {
unsafe {
let llstr = self.ffi_gl_.GetString(which);
@@ -1441,22 +1459,19 @@ impl Gl for GlFns {
if !llstr.is_null() {
str::from_utf8_unchecked(CStr::from_ptr(llstr as *const c_char).to_bytes()).to_string()
} else {
"".to_string()
}
}
}
- fn get_shader_iv(&self, shader: GLuint, pname: GLenum) -> GLint {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetShaderiv(shader, pname, &mut result);
- }
- result
+ unsafe fn get_shader_iv(&self, shader: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetShaderiv(shader, pname, result.as_mut_ptr());
}
fn get_shader_precision_format(&self, _shader_type: GLuint, precision_type: GLuint) -> (GLint, GLint, GLint) {
// gl.GetShaderPrecisionFormat is not available until OpenGL 4.1.
// Fallback to OpenGL standard precissions that most desktop hardware support.
match precision_type {
ffi::LOW_FLOAT | ffi::MEDIUM_FLOAT | ffi::HIGH_FLOAT => {
// Fallback to IEEE 754 single precision
@@ -1745,32 +1760,16 @@ impl Gl for GlFns {
unsafe {
self.ffi_gl_.GetFragDataIndex(
program,
c_string.as_ptr(),
)
}
}
- fn alias_point_size_range(&self) -> (GLfloat, GLfloat) {
- unsafe {
- let mut ret = [0.; 2];
- self.ffi_gl_.GetFloatv(ffi::ALIASED_POINT_SIZE_RANGE, ret.as_mut_ptr());
- (ret[0], ret[1])
- }
- }
-
- fn max_viewport_dims(&self) -> (GLint, GLint) {
- unsafe {
- let mut ret = [0; 2];
- self.ffi_gl_.GetIntegerv(ffi::MAX_VIEWPORT_DIMS, ret.as_mut_ptr());
- (ret[0], ret[1])
- }
- }
-
// GL_KHR_debug
fn get_debug_messages(&self) -> Vec<DebugMessage> {
if !self.ffi_gl_.GetDebugMessageLog.is_loaded() {
return Vec::new();
}
let mut max_message_len = 0;
unsafe {
--- a/third_party/rust/gleam/src/gles_fns.rs
+++ b/third_party/rust/gleam/src/gles_fns.rs
@@ -669,61 +669,56 @@ impl Gl for GlesFns {
target: GLenum,
level: GLint,
format: GLenum,
ty: GLenum,
output: &mut [u8]) {
panic!("not supported");
}
-
- fn get_integer_v(&self, name: GLenum) -> GLint {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetIntegerv(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_v(&self, name: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetIntegerv(name, result.as_mut_ptr());
}
- fn get_integer_64v(&self, name: GLenum) -> GLint64 {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetInteger64v(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_64v(&self, name: GLenum, result: &mut [GLint64]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetInteger64v(name, result.as_mut_ptr());
+ }
+
+ #[inline]
+ unsafe fn get_integer_iv(&self, name: GLenum, index: GLuint, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetIntegeri_v(name, index, result.as_mut_ptr());
}
- fn get_integer_iv(&self, name: GLenum, index: GLuint) -> GLint {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetIntegeri_v(name, index, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_integer_64iv(&self, name: GLenum, index: GLuint, result: &mut [GLint64]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetInteger64i_v(name, index, result.as_mut_ptr());
}
- fn get_integer_64iv(&self, name: GLenum, index: GLuint) -> GLint64 {
- let mut result = 0;
- unsafe {
- self.ffi_gl_.GetInteger64i_v(name, index, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_boolean_v(&self, name: GLenum, result: &mut [GLboolean]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetBooleanv(name, result.as_mut_ptr());
}
- fn get_boolean_v(&self, name: GLenum) -> GLboolean {
- let mut result = 0 as GLboolean;
- unsafe {
- self.ffi_gl_.GetBooleanv(name, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_float_v(&self, name: GLenum, result: &mut [GLfloat]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetFloatv(name, result.as_mut_ptr());
}
- fn get_float_v(&self, name: GLenum) -> GLfloat {
- let mut result = 0 as GLfloat;
+ fn get_renderbuffer_parameter_iv(&self, target: GLenum, pname: GLenum) -> GLint {
+ let mut result: GLint = 0;
unsafe {
- self.ffi_gl_.GetFloatv(name, &mut result);
+ self.ffi_gl_.GetRenderbufferParameteriv(target, pname, &mut result);
}
result
}
fn get_framebuffer_attachment_parameter_iv(&self, target: GLenum, attachment: GLenum, pname: GLenum) -> GLint {
let mut result: GLint = 0;
unsafe {
self.ffi_gl_.GetFramebufferAttachmentParameteriv(target, attachment, pname, &mut result);
@@ -872,24 +867,16 @@ impl Gl for GlesFns {
}
fn viewport(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
unsafe {
self.ffi_gl_.Viewport(x, y, width, height);
}
}
- fn get_viewport(&self) -> (GLint, GLint, GLsizei, GLsizei) {
- unsafe {
- let mut ret = [0; 4];
- self.ffi_gl_.GetIntegerv(ffi::VIEWPORT, ret.as_mut_ptr());
- (ret[0], ret[1], ret[2], ret[3])
- }
- }
-
fn scissor(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
unsafe {
self.ffi_gl_.Scissor(x, y, width, height);
}
}
fn line_width(&self, width: GLfloat) {
unsafe {
@@ -1223,38 +1210,59 @@ impl Gl for GlesFns {
fn depth_range(&self, near: f64, far: f64) {
unsafe {
self.ffi_gl_.DepthRangef(near as GLclampf, far as GLclampf);
}
}
fn get_active_attrib(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
- let buf_size = self.get_program_iv(program, ffi::ACTIVE_ATTRIBUTE_MAX_LENGTH);
- let mut name = vec![0u8; buf_size as usize];
+ let mut buf_size = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::ACTIVE_ATTRIBUTE_MAX_LENGTH, &mut buf_size);
+ }
+ let mut name = vec![0u8; buf_size[0] as usize];
let mut length = 0 as GLsizei;
let mut size = 0 as i32;
let mut type_ = 0 as u32;
unsafe {
- self.ffi_gl_.GetActiveAttrib(program, index, buf_size, &mut length, &mut size, &mut type_, name.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetActiveAttrib(
+ program,
+ index,
+ buf_size[0],
+ &mut length,
+ &mut size,
+ &mut type_,
+ name.as_mut_ptr() as *mut GLchar,
+ );
}
name.truncate(if length > 0 {length as usize} else {0});
(size, type_, String::from_utf8(name).unwrap())
}
fn get_active_uniform(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
- let buf_size = self.get_program_iv(program, ffi::ACTIVE_UNIFORM_MAX_LENGTH);
- let mut name = vec![0 as u8; buf_size as usize];
+ let mut buf_size = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::ACTIVE_UNIFORM_MAX_LENGTH, &mut buf_size);
+ }
+ let mut name = vec![0 as u8; buf_size[0] as usize];
let mut length: GLsizei = 0;
let mut size: i32 = 0;
let mut type_: u32 = 0;
unsafe {
- self.ffi_gl_.GetActiveUniform(program, index, buf_size, &mut length, &mut size,
- &mut type_, name.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetActiveUniform(
+ program,
+ index,
+ buf_size[0],
+ &mut length,
+ &mut size,
+ &mut type_,
+ name.as_mut_ptr() as *mut GLchar,
+ );
}
name.truncate(if length > 0 { length as usize } else { 0 });
(size, type_, String::from_utf8(name).unwrap())
}
fn get_active_uniforms_iv(&self, program: GLuint, indices: Vec<GLuint>, pname: GLenum) -> Vec<GLint> {
@@ -1319,54 +1327,62 @@ impl Gl for GlesFns {
fn get_uniform_location(&self, program: GLuint, name: &str) -> c_int {
let name = CString::new(name).unwrap();
unsafe {
self.ffi_gl_.GetUniformLocation(program, name.as_ptr())
}
}
fn get_program_info_log(&self, program: GLuint) -> String {
- let max_len = self.get_program_iv(program, ffi::INFO_LOG_LENGTH);
- let mut result = vec![0u8; max_len as usize];
+ let mut max_len = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::INFO_LOG_LENGTH, &mut max_len);
+ }
+ let mut result = vec![0u8; max_len[0] as usize];
let mut result_len = 0 as GLsizei;
unsafe {
- self.ffi_gl_.GetProgramInfoLog(program,
- max_len as GLsizei,
- &mut result_len,
- result.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetProgramInfoLog(
+ program,
+ max_len[0] as GLsizei,
+ &mut result_len,
+ result.as_mut_ptr() as *mut GLchar,
+ );
}
result.truncate(if result_len > 0 {result_len as usize} else {0});
String::from_utf8(result).unwrap()
}
- fn get_program_iv(&self, program: GLuint, pname: GLenum) -> GLint {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetProgramiv(program, pname, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_program_iv(&self, program: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetProgramiv(program, pname, result.as_mut_ptr());
}
fn get_program_binary(&self, program: GLuint) -> (Vec<u8>, GLenum) {
- let len = self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH);
- if len <= 0 {
+ let mut len = [0];
+ unsafe {
+ self.get_program_iv(program, ffi::PROGRAM_BINARY_LENGTH, &mut len);
+ }
+ if len[0] <= 0 {
return (Vec::new(), NONE);
}
- let mut binary: Vec<u8> = Vec::with_capacity(len as usize);
+ let mut binary: Vec<u8> = Vec::with_capacity(len[0] 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);
+ binary.set_len(len[0] as usize);
+ self.ffi_gl_.GetProgramBinary(
+ program,
+ len[0],
+ &mut out_len as *mut GLsizei,
+ &mut format,
+ binary.as_mut_ptr() as *mut c_void,
+ );
}
- if len != out_len {
+ if len[0] != out_len {
return (Vec::new(), NONE);
}
(binary, format)
}
fn program_binary(&self, program: GLuint, format: GLenum, binary: &[u8]) {
unsafe {
@@ -1378,30 +1394,26 @@ impl Gl for GlesFns {
}
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 {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetVertexAttribiv(index, pname, &mut result);
- }
- result
+ #[inline]
+ unsafe fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetVertexAttribiv(index, pname, result.as_mut_ptr());
}
- fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum) -> Vec<GLfloat> {
- let mut result = vec![0 as GLfloat; 4];
- unsafe {
- self.ffi_gl_.GetVertexAttribfv(index, pname, result.as_mut_ptr());
- }
- result
+ #[inline]
+ unsafe fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum, result: &mut [GLfloat]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetVertexAttribfv(index, pname, result.as_mut_ptr());
}
fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr {
let mut result = 0 as *mut GLvoid;
unsafe {
self.ffi_gl_.GetVertexAttribPointerv(index, pname, &mut result)
}
result as GLsizeiptr
@@ -1411,24 +1423,29 @@ impl Gl for GlesFns {
let mut result = 0 as GLint;
unsafe {
self.ffi_gl_.GetBufferParameteriv(target, pname, &mut result);
}
result
}
fn get_shader_info_log(&self, shader: GLuint) -> String {
- let max_len = self.get_shader_iv(shader, ffi::INFO_LOG_LENGTH);
- let mut result = vec![0u8; max_len as usize];
+ let mut max_len = [0];
+ unsafe {
+ self.get_shader_iv(shader, ffi::INFO_LOG_LENGTH, &mut max_len);
+ }
+ let mut result = vec![0u8; max_len[0] as usize];
let mut result_len = 0 as GLsizei;
unsafe {
- self.ffi_gl_.GetShaderInfoLog(shader,
- max_len as GLsizei,
- &mut result_len,
- result.as_mut_ptr() as *mut GLchar);
+ self.ffi_gl_.GetShaderInfoLog(
+ shader,
+ max_len[0] as GLsizei,
+ &mut result_len,
+ result.as_mut_ptr() as *mut GLchar,
+ );
}
result.truncate(if result_len > 0 {result_len as usize} else {0});
String::from_utf8(result).unwrap()
}
fn get_string(&self, which: GLenum) -> String {
unsafe {
let llstr = self.ffi_gl_.GetString(which);
@@ -1446,22 +1463,19 @@ impl Gl for GlesFns {
if !llstr.is_null() {
str::from_utf8_unchecked(CStr::from_ptr(llstr as *const c_char).to_bytes()).to_string()
} else {
"".to_string()
}
}
}
- fn get_shader_iv(&self, shader: GLuint, pname: GLenum) -> GLint {
- let mut result = 0 as GLint;
- unsafe {
- self.ffi_gl_.GetShaderiv(shader, pname, &mut result);
- }
- result
+ unsafe fn get_shader_iv(&self, shader: GLuint, pname: GLenum, result: &mut [GLint]) {
+ assert!(!result.is_empty());
+ self.ffi_gl_.GetShaderiv(shader, pname, result.as_mut_ptr());
}
fn get_shader_precision_format(&self,
shader_type: GLuint,
precision_type: GLuint)
-> (GLint, GLint, GLint) {
let mut range = [0 as GLint, 0];
let mut precision = 0 as GLint;
@@ -1706,32 +1720,16 @@ impl Gl for GlesFns {
fn get_frag_data_index(
&self,
_program: GLuint,
_name: &str,
) -> GLint {
panic!("not supported");
}
- fn alias_point_size_range(&self) -> (GLfloat, GLfloat) {
- unsafe {
- let mut ret = [0.; 2];
- self.ffi_gl_.GetFloatv(ffi::ALIASED_POINT_SIZE_RANGE, ret.as_mut_ptr());
- (ret[0], ret[1])
- }
- }
-
- fn max_viewport_dims(&self) -> (GLint, GLint) {
- unsafe {
- let mut ret = [0; 2];
- self.ffi_gl_.GetIntegerv(ffi::MAX_VIEWPORT_DIMS, ret.as_mut_ptr());
- (ret[0], ret[1])
- }
- }
-
// GL_KHR_debug
fn get_debug_messages(&self) -> Vec<DebugMessage> {
if !self.ffi_gl_.GetDebugMessageLog.is_loaded() {
return Vec::new();
}
let mut max_message_len = 0;
unsafe {