Bug 1458870 - Update Cargo lockfiles and re-vendor rust dependencies. r?jrmuizel draft
authorKartikaya Gupta <kgupta@mozilla.com>
Tue, 08 May 2018 10:36:19 -0400
changeset 792540 694a42241e714023b1822b976a78aec64e27477e
parent 792539 3a81b4d88b8da9ebe020fd0741f6db4f2cb37d59
child 792541 847391c98e9069ff40237b9b3c0b8145c4a9c7a8
push id109129
push userkgupta@mozilla.com
push dateTue, 08 May 2018 14:36:53 +0000
reviewersjrmuizel
bugs1458870
milestone62.0a1
Bug 1458870 - Update Cargo lockfiles and re-vendor rust dependencies. r?jrmuizel MozReview-Commit-ID: GQilwX8rUAR
Cargo.lock
third_party/rust/gleam/.cargo-checksum.json
third_party/rust/gleam/Cargo.toml
third_party/rust/gleam/src/gl.rs
third_party/rust/gleam/src/gl_fns.rs
third_party/rust/gleam/src/gles_fns.rs
--- 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 {