Bug 1615694. Declare our render targets up front to ANGLE. r=kvark
☠☠ backed out by 9571edde56aa ☠ ☠
authorJeff Muizelaar <jrmuizel@gmail.com>
Tue, 18 Feb 2020 14:59:03 +0000
changeset 514404 106776ac6c2056323c24fbc1e57c9eaee537e64c
parent 514403 3b2e49d603db90472eac3d558231f2448e86fb4c
child 514405 594359eaca6aeb7d0c3e97160ea5e845f8f99cd6
push id37135
push useropoprus@mozilla.com
push dateTue, 18 Feb 2020 21:33:59 +0000
treeherdermozilla-central@df596657bebc [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskvark
bugs1615694
milestone75.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1615694. Declare our render targets up front to ANGLE. r=kvark This should remove the allocation and copy in TextureD3D::ensureRenderTarget() in some situations. Differential Revision: https://phabricator.services.mozilla.com/D62952
Cargo.lock
gfx/webrender_bindings/Cargo.toml
gfx/wr/Cargo.lock
gfx/wr/direct-composition/Cargo.toml
gfx/wr/example-compositor/compositor/Cargo.toml
gfx/wr/examples/Cargo.toml
gfx/wr/webrender/Cargo.toml
gfx/wr/webrender/src/device/gl.rs
gfx/wr/wrench/Cargo.toml
third_party/rust/gl_generator/.cargo-checksum.json
third_party/rust/gl_generator/Cargo.toml
third_party/rust/gl_generator/generators/debug_struct_gen.rs
third_party/rust/gl_generator/generators/global_gen.rs
third_party/rust/gl_generator/generators/struct_gen.rs
third_party/rust/gl_generator/generators/templates/types/gl.rs
third_party/rust/gl_generator/registry/parse.rs
third_party/rust/gleam/.cargo-checksum.json
third_party/rust/gleam/Cargo.toml
third_party/rust/gleam/build.rs
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
@@ -1632,30 +1632,30 @@ name = "gkrust_utils"
 version = "0.1.0"
 dependencies = [
  "nsstring",
  "uuid 0.8.1",
 ]
 
 [[package]]
 name = "gl_generator"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39a23d5e872a275135d66895d954269cf5e8661d234eb1c2480f4ce0d586acbd"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
 dependencies = [
  "khronos_api",
  "log",
  "xml-rs",
 ]
 
 [[package]]
 name = "gleam"
-version = "0.6.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f46fd8874e043ffac0d638ed1567a2584f7814f6d72b4db37ab1689004a26c4"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "332d1f4e6c6181ed07178f84a552b2387d43ecf6821a86c22cfb3883ea3fb1b9"
 dependencies = [
  "gl_generator",
 ]
 
 [[package]]
 name = "glean-core"
 version = "24.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
--- a/gfx/webrender_bindings/Cargo.toml
+++ b/gfx/webrender_bindings/Cargo.toml
@@ -8,17 +8,17 @@ license = "MPL-2.0"
 webrender_debugger = ["webrender/debugger"]
 
 [dependencies]
 rayon = "1"
 num_cpus = "1.7.0"
 thread_profiler = "0.1.1"
 euclid = { version = "0.20.0", features = ["serde"] }
 app_units = "0.7"
-gleam = "0.6.14"
+gleam = "0.9.2"
 log = "0.4"
 nsstring = { path = "../../xpcom/rust/nsstring" }
 bincode = "1.0"
 uuid = { version = "0.8", features = ["v4"] }
 fxhash = "0.2.1"
 
 [dependencies.webrender]
 path = "../wr/webrender"
--- a/gfx/wr/Cargo.lock
+++ b/gfx/wr/Cargo.lock
@@ -183,17 +183,17 @@ name = "cfg-if"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cgl"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "clap"
 version = "2.31.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -237,17 +237,17 @@ dependencies = [
  "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "compositor"
 version = "0.1.0"
 dependencies = [
  "compositor-windows 0.1.0",
- "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.61.0",
 ]
 
 [[package]]
 name = "compositor-windows"
 version = "0.1.0"
 dependencies = [
  "cc 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -410,17 +410,17 @@ dependencies = [
  "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "direct-composition"
 version = "0.1.0"
 dependencies = [
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozangle 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.61.0",
  "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "winit 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "dlib"
@@ -588,21 +588,39 @@ version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "khronos_api 3.1.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "gleam"
-version = "0.6.17"
+name = "gl_generator"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "khronos_api 3.1.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.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gleam"
+version = "0.6.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gl_generator 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gleam"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gl_generator 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "glutin"
 version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "android_glue 0.2.3 (git+https://github.com/rust-windowing/android-rs-glue.git?rev=e3ac6edea5814e1faca0c31ea8fac6877cb929ea)",
@@ -1748,17 +1766,17 @@ dependencies = [
  "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (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.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozangle 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "plane-split 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1782,17 +1800,17 @@ dependencies = [
 [[package]]
 name = "webrender-examples"
 version = "0.1.0"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.61.0",
  "winit 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender_api"
@@ -1909,17 +1927,17 @@ dependencies = [
  "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "font-loader 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozangle 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "osmesa-src 0.1.1 (git+https://github.com/servo/osmesa-src)",
  "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2054,17 +2072,19 @@ dependencies = [
 "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
 "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
 "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
 "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
 "checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
 "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592"
 "checksum gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39a23d5e872a275135d66895d954269cf5e8661d234eb1c2480f4ce0d586acbd"
 "checksum gl_generator 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ca98bbde17256e02d17336a6bdb5a50f7d0ccacee502e191d3e3d0ec2f96f84a"
-"checksum gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7f46fd8874e043ffac0d638ed1567a2584f7814f6d72b4db37ab1689004a26c4"
+"checksum gl_generator 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
+"checksum gleam 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "cae10d7c99d0e77b4766e850a60898a17c1abaf01075531f1066f03dc7dc5fc5"
+"checksum gleam 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332d1f4e6c6181ed07178f84a552b2387d43ecf6821a86c22cfb3883ea3fb1b9"
 "checksum glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb26027a84c3b9e1949ef0df0b6a3db8d0c124243a5c161ea25c7def90cb1474"
 "checksum glutin_egl_sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "23f48987ab6cb2b61ad903b59e54a2fd0c380a7baff68cffd6826b69a73dd326"
 "checksum glutin_emscripten_sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "245b3fdb08df6ffed7585365851f8404af9c7e2dd4b59f15262e968b6a95a0c7"
 "checksum glutin_gles2_sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "89996c30857ae1b4de4b5189abf1ea822a20a9fe9e1c93e5e7b862ff0bdd5cdf"
 "checksum glutin_glx_sys 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1290a5ca5e46fcfa7f66f949cc9d9194b2cb6f2ed61892c8c2b82343631dba57"
 "checksum glutin_wgl_sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f801bbc91efc22dd1c4818a47814fc72bf74d024510451b119381579bfa39021"
 "checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37"
 "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
--- a/gfx/wr/direct-composition/Cargo.toml
+++ b/gfx/wr/direct-composition/Cargo.toml
@@ -2,13 +2,13 @@
 name = "direct-composition"
 version = "0.1.0"
 authors = ["Simon Sapin <simon.sapin@exyr.org>"]
 license = "MPL-2.0"
 edition = "2018"
 
 [target.'cfg(windows)'.dependencies]
 euclid = "0.20"
-gleam = "0.6.2"
+gleam = "0.9.2"
 mozangle = {version = "0.3.1", features = ["egl"]}
 webrender = {path = "../webrender"}
 winapi = {version = "0.3", features = ["winerror", "d3d11", "dcomp"]}
 winit = "0.19"
--- a/gfx/wr/example-compositor/compositor/Cargo.toml
+++ b/gfx/wr/example-compositor/compositor/Cargo.toml
@@ -2,12 +2,12 @@
 name = "compositor"
 version = "0.1.0"
 authors = ["Glenn Watson <gw@intuitionlibrary.com>"]
 edition = "2018"
 license = "MPL-2.0"
 
 [dependencies]
 webrender = { path = "../../webrender" }
-gleam = "0.6.2"
+gleam = "0.9.2"
 
 [target.'cfg(windows)'.dependencies]
 compositor-windows = { path = "../compositor-windows" }
--- a/gfx/wr/examples/Cargo.toml
+++ b/gfx/wr/examples/Cargo.toml
@@ -56,16 +56,16 @@ path = "yuv.rs"
 
 [features]
 debug = ["webrender/capture", "webrender/debugger", "webrender/profiler"]
 
 [dependencies]
 app_units = "0.7"
 env_logger = "0.5"
 euclid = "0.20"
-gleam = "0.6.2"
+gleam = "0.9.2"
 glutin = "0.21"
 rayon = "1"
 webrender = { path = "../webrender" }
 winit = "0.19"
 
 [target.'cfg(target_os = "macos")'.dependencies]
 core-foundation = "0.6.4"
--- a/gfx/wr/webrender/Cargo.toml
+++ b/gfx/wr/webrender/Cargo.toml
@@ -27,17 +27,17 @@ webrender_build = { version = "0.0.1", p
 base64 = { optional = true, version = "0.10" }
 bincode = "1.0"
 bitflags = "1.2"
 byteorder = "1.0"
 cfg-if = "0.1.2"
 cstr = "0.1.2"
 euclid = { version = "0.20.0", features = ["serde"] }
 fxhash = "0.2.1"
-gleam = "0.6.17"
+gleam = "0.9.2"
 image_loader = { optional = true, version = "0.22", package = "image", default-features = false, features = ["png_codec"] }
 lazy_static = "1"
 log = "0.4"
 malloc_size_of_derive = "0.1"
 num-traits = "0.2"
 plane-split = "0.15"
 png = { optional = true, version = "0.15" }
 rayon = "1"
--- a/gfx/wr/webrender/src/device/gl.rs
+++ b/gfx/wr/webrender/src/device/gl.rs
@@ -944,16 +944,18 @@ pub struct Capabilities {
     /// Whether KHR_debug is supported for getting debug messages from
     /// the driver.
     pub supports_khr_debug: bool,
     /// Whether we can configure texture units to do swizzling on sampling.
     pub supports_texture_swizzle: bool,
     /// Whether the driver supports uploading to textures from a non-zero
     /// offset within a PBO.
     pub supports_nonzero_pbo_offsets: bool,
+    /// Whether the driver supports specifying the texture usage up front.
+    pub supports_texture_usage: bool,
 }
 
 #[derive(Clone, Debug)]
 pub enum ShaderError {
     Compilation(String, String), // name, error message
     Link(String, String),        // name, error message
 }
 
@@ -1304,16 +1306,18 @@ impl Device {
                 panic!("Caught GL error {:x} at {}", code, name);
             });
         }
 
         if supports_extension(&extensions, "GL_ANGLE_provoking_vertex") {
             gl.provoking_vertex_angle(gl::FIRST_VERTEX_CONVENTION);
         }
 
+        let supports_texture_usage = supports_extension(&extensions, "GL_ANGLE_texture_usage");
+
         // Our common-case image data in Firefox is BGRA, so we make an effort
         // to use BGRA as the internal texture storage format to avoid the need
         // to swizzle during upload. Currently we only do this on GLES (and thus
         // for Windows, via ANGLE).
         //
         // On Mac, Apple docs [1] claim that BGRA is a more efficient internal
         // format, but they don't support it with glTextureStorage. As a workaround,
         // we pretend that it's RGBA8 for the purposes of texture transfers,
@@ -1475,16 +1479,17 @@ impl Device {
                 supports_multisampling: false, //TODO
                 supports_copy_image_sub_data,
                 supports_blit_to_texture_array,
                 supports_pixel_local_storage,
                 supports_advanced_blend_equation,
                 supports_khr_debug,
                 supports_texture_swizzle,
                 supports_nonzero_pbo_offsets,
+                supports_texture_usage,
             },
 
             color_formats,
             bgra_formats,
             swizzle_settings: SwizzleSettings {
                 bgra8_sampling_swizzle,
             },
 
@@ -2079,16 +2084,20 @@ impl Device {
             fbos_with_depth: vec![],
             blit_workaround_buffer: None,
             last_frame_used: self.frame_id,
             flags: TextureFlags::default(),
         };
         self.bind_texture(DEFAULT_TEXTURE, &texture, Swizzle::default());
         self.set_texture_parameters(texture.target, filter);
 
+        if self.capabilities.supports_texture_usage && render_target.is_some() {
+            self.gl.tex_parameter_i(texture.target, gl::TEXTURE_USAGE_ANGLE, gl::FRAMEBUFFER_ATTACHMENT_ANGLE as gl::GLint);
+        }
+
         // Allocate storage.
         let desc = self.gl_describe_format(texture.format);
         let is_array = match texture.target {
             gl::TEXTURE_2D_ARRAY => true,
             gl::TEXTURE_2D | gl::TEXTURE_RECTANGLE | gl::TEXTURE_EXTERNAL_OES => false,
             _ => panic!("BUG: Unexpected texture target!"),
         };
         assert!(is_array || texture.layer_count == 1);
--- a/gfx/wr/wrench/Cargo.toml
+++ b/gfx/wr/wrench/Cargo.toml
@@ -7,17 +7,17 @@ license = "MPL-2.0"
 edition = "2018"
 
 [dependencies]
 base64 = "0.10"
 bincode = "1.0"
 byteorder = "1.0"
 env_logger = { version = "0.5", optional = true }
 euclid = "0.20"
-gleam = "0.6.2"
+gleam = "0.9.2"
 glutin = "0.21"
 app_units = "0.7"
 clap = { version = "2", features = ["yaml"] }
 log = "0.4"
 yaml-rust = "0.4"
 serde_json = "1.0"
 ron = "0.1.5"
 time = "0.1"
--- a/third_party/rust/gl_generator/.cargo-checksum.json
+++ b/third_party/rust/gl_generator/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"e1a5f54814bdc0073585819a8bf8cbdba3e9b1cfb7fa1a5bd7fbb8d8670a3673","README.md":"52d8fee4681c879f2c964fd30e3faf0c907e8bf676eab7b44beab5c5bbd5c284","generators/debug_struct_gen.rs":"73164956c9c5fe848a568aac1a7518947a0786ad6118618d78b4f0208c3f442e","generators/global_gen.rs":"486384b1d7fc234dbe55815bd99e5fbd69144f361f8cefdf4aa9841db1d7832a","generators/mod.rs":"100a1da965bf11eaa9fad48a06c7856b60f48363a4a707e34ba97938bedae0b8","generators/static_gen.rs":"925a9401e27358a466baadfb660056a24394cf2fa21f5613e2d7f50ab8935e71","generators/static_struct_gen.rs":"eb08e6e59b0e0947c4ab263a0749efbb28430c5741634c413a2be011fcdad88f","generators/struct_gen.rs":"13444b524e992d88fdd2f4b0990e06bdee292b076047b274b7f607f3de12a85d","generators/templates/types/egl.rs":"d1785a30f1098e101302ba74ba4c22cf95ac44b17edf221dbb9d890f4bd635a2","generators/templates/types/gl.rs":"f71f3a2200c0fa13f09687ef05e51c28c5b11c1bb841acd402c0097d8f9130bd","generators/templates/types/glx.rs":"f444166d117b96afed2d8d13db6cd3369d6c59704f296e76202269f411bbd4a8","generators/templates/types/wgl.rs":"9d626e0959374c694c19a36d4dd34dae2f37acf3cb94e9bd4d242a16b41a970d","lib.rs":"6f47da878479b503b5202bda84ad8935607264ac03c0b68203109fad9cd479db","registry/mod.rs":"84eed5c113b322e5267b2b130987e6bb726b4e7c38ce50292cd6cc57b8e06994","registry/parse.rs":"c201ee463663878d4546a7d94194303a3d3c27f2bcb2cdbedd892f0446583795"},"package":"39a23d5e872a275135d66895d954269cf5e8661d234eb1c2480f4ce0d586acbd"}
\ No newline at end of file
+{"files":{"Cargo.toml":"f586015aa2816b3c34d89f5e6a6539172efcd7f3ed055a0fab433ea83e2a0f0f","README.md":"52d8fee4681c879f2c964fd30e3faf0c907e8bf676eab7b44beab5c5bbd5c284","generators/debug_struct_gen.rs":"6fecccf8e57d4be93ea2657328d6e111ca44bc69542a5522cd7360d80ca64630","generators/global_gen.rs":"1696013af16bb92a3fa7cf3802a57ec6f7ba460322ede33aa2af30fc9911bd98","generators/mod.rs":"100a1da965bf11eaa9fad48a06c7856b60f48363a4a707e34ba97938bedae0b8","generators/static_gen.rs":"925a9401e27358a466baadfb660056a24394cf2fa21f5613e2d7f50ab8935e71","generators/static_struct_gen.rs":"eb08e6e59b0e0947c4ab263a0749efbb28430c5741634c413a2be011fcdad88f","generators/struct_gen.rs":"fa1bcda4501a597922be7c7ef4ad13738536a9c97529996671e264acd709c680","generators/templates/types/egl.rs":"d1785a30f1098e101302ba74ba4c22cf95ac44b17edf221dbb9d890f4bd635a2","generators/templates/types/gl.rs":"d72f91355febec875c40899a44c5575bd04993f7cf5c6e289eec872a2a161b20","generators/templates/types/glx.rs":"f444166d117b96afed2d8d13db6cd3369d6c59704f296e76202269f411bbd4a8","generators/templates/types/wgl.rs":"9d626e0959374c694c19a36d4dd34dae2f37acf3cb94e9bd4d242a16b41a970d","lib.rs":"6f47da878479b503b5202bda84ad8935607264ac03c0b68203109fad9cd479db","registry/mod.rs":"84eed5c113b322e5267b2b130987e6bb726b4e7c38ce50292cd6cc57b8e06994","registry/parse.rs":"5cb781082014f143b06ef7d3678f3c4ca59133a5732d4e136fd750b78fb9453f"},"package":"1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"}
\ No newline at end of file
--- a/third_party/rust/gl_generator/Cargo.toml
+++ b/third_party/rust/gl_generator/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 = "gl_generator"
-version = "0.11.0"
+version = "0.14.0"
 authors = ["Brendan Zabarauskas <bjzaba@yahoo.com.au>", "Corey Richardson", "Arseny Kapoulkine"]
 description = "Code generators for creating bindings to the Khronos OpenGL APIs."
 homepage = "https://github.com/brendanzab/gl-rs/"
 documentation = "https://docs.rs/gl_generator"
 readme = "README.md"
 keywords = ["gl", "egl", "opengl", "khronos"]
 categories = ["api-bindings", "rendering::graphics-api"]
 license = "Apache-2.0"
--- a/third_party/rust/gl_generator/generators/debug_struct_gen.rs
+++ b/third_party/rust/gl_generator/generators/debug_struct_gen.rs
@@ -182,17 +182,17 @@ where
             /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
             ///
             /// ~~~ignore
             /// let gl = Gl::load_with(|s| glfw.get_proc_address(s));
             /// ~~~
             #[allow(dead_code, unused_variables)]
             pub fn load_with<F>(mut loadfn: F) -> {api} where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void {{
                 #[inline(never)]
-                fn do_metaloadfn(loadfn: &mut FnMut(&'static str) -> *const __gl_imports::raw::c_void,
+                fn do_metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void,
                                  symbol: &'static str,
                                  symbols: &[&'static str])
                                  -> *const __gl_imports::raw::c_void {{
                     let mut ptr = loadfn(symbol);
                     if ptr.is_null() {{
                         for &sym in symbols {{
                             ptr = loadfn(sym);
                             if !ptr.is_null() {{ break; }}
--- a/third_party/rust/gl_generator/generators/global_gen.rs
+++ b/third_party/rust/gl_generator/generators/global_gen.rs
@@ -58,17 +58,17 @@ where
 fn write_metaloadfn<W>(dest: &mut W) -> io::Result<()>
 where
     W: io::Write,
 {
     writeln!(
         dest,
         r#"
         #[inline(never)]
-        fn metaloadfn(loadfn: &mut FnMut(&'static str) -> *const __gl_imports::raw::c_void,
+        fn metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void,
                       symbol: &'static str,
                       fallbacks: &[&'static str]) -> *const __gl_imports::raw::c_void {{
             let mut ptr = loadfn(symbol);
             if ptr.is_null() {{
                 for &sym in fallbacks {{
                     ptr = loadfn(sym);
                     if !ptr.is_null() {{ break; }}
                 }}
@@ -280,25 +280,30 @@ where
                   "
         /// Load each OpenGL symbol using a custom load function. This allows for the
         /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
         /// ~~~ignore
         /// gl::load_with(|s| glfw.get_proc_address(s));
         /// ~~~
         #[allow(dead_code)]
         pub fn load_with<F>(mut loadfn: F) where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void {{
+            #[inline(never)]
+            fn inner(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void) {{
     "));
 
     for c in &registry.cmds {
         try!(writeln!(
             dest,
-            "{cmd_name}::load_with(&mut loadfn);",
+            "{cmd_name}::load_with(&mut *loadfn);",
             cmd_name = &c.proto.ident[..]
         ));
     }
 
     writeln!(
         dest,
         "
+            }}
+
+            inner(&mut loadfn)
         }}
     "
     )
 }
--- a/third_party/rust/gl_generator/generators/struct_gen.rs
+++ b/third_party/rust/gl_generator/generators/struct_gen.rs
@@ -182,17 +182,17 @@ where
             /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
             ///
             /// ~~~ignore
             /// let gl = Gl::load_with(|s| glfw.get_proc_address(s));
             /// ~~~
             #[allow(dead_code, unused_variables)]
             pub fn load_with<F>(mut loadfn: F) -> {api} where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void {{
                 #[inline(never)]
-                fn do_metaloadfn(loadfn: &mut FnMut(&'static str) -> *const __gl_imports::raw::c_void,
+                fn do_metaloadfn(loadfn: &mut dyn FnMut(&'static str) -> *const __gl_imports::raw::c_void,
                                  symbol: &'static str,
                                  symbols: &[&'static str])
                                  -> *const __gl_imports::raw::c_void {{
                     let mut ptr = loadfn(symbol);
                     if ptr.is_null() {{
                         for &sym in symbols {{
                             ptr = loadfn(sym);
                             if !ptr.is_null() {{ break; }}
--- a/third_party/rust/gl_generator/generators/templates/types/gl.rs
+++ b/third_party/rust/gl_generator/generators/templates/types/gl.rs
@@ -41,37 +41,37 @@ pub type GLuint64EXT = u64;
 
 pub enum __GLsync {}
 pub type GLsync = *const __GLsync;
 
 // compatible with OpenCL cl_context
 pub enum _cl_context {}
 pub enum _cl_event {}
 
-pub type GLDEBUGPROC = extern "system" fn(source: GLenum,
-                                          gltype: GLenum,
-                                          id: GLuint,
-                                          severity: GLenum,
-                                          length: GLsizei,
-                                          message: *const GLchar,
-                                          userParam: *mut super::__gl_imports::raw::c_void);
-pub type GLDEBUGPROCARB = extern "system" fn(source: GLenum,
-                                             gltype: GLenum,
-                                             id: GLuint,
-                                             severity: GLenum,
-                                             length: GLsizei,
-                                             message: *const GLchar,
-                                             userParam: *mut super::__gl_imports::raw::c_void);
-pub type GLDEBUGPROCKHR = extern "system" fn(source: GLenum,
-                                             gltype: GLenum,
-                                             id: GLuint,
-                                             severity: GLenum,
-                                             length: GLsizei,
-                                             message: *const GLchar,
-                                             userParam: *mut super::__gl_imports::raw::c_void);
+pub type GLDEBUGPROC = Option<extern "system" fn(source: GLenum,
+                                                 gltype: GLenum,
+                                                 id: GLuint,
+                                                 severity: GLenum,
+                                                 length: GLsizei,
+                                                 message: *const GLchar,
+                                                 userParam: *mut super::__gl_imports::raw::c_void)>;
+pub type GLDEBUGPROCARB = Option<extern "system" fn(source: GLenum,
+                                                    gltype: GLenum,
+                                                    id: GLuint,
+                                                    severity: GLenum,
+                                                    length: GLsizei,
+                                                    message: *const GLchar,
+                                                    userParam: *mut super::__gl_imports::raw::c_void)>;
+pub type GLDEBUGPROCKHR = Option<extern "system" fn(source: GLenum,
+                                                    gltype: GLenum,
+                                                    id: GLuint,
+                                                    severity: GLenum,
+                                                    length: GLsizei,
+                                                    message: *const GLchar,
+                                                    userParam: *mut super::__gl_imports::raw::c_void)>;
 
 // GLES 1 types
 // "pub type GLclampx = i32;",
 
 // GLES 1/2 types (tagged for GLES 1)
 // "pub type GLbyte = i8;",
 // "pub type GLubyte = u8;",
 // "pub type GLfloat = GLfloat;",
@@ -93,16 +93,16 @@ pub type GLDEBUGPROCKHR = extern "system
 // "pub type GLint64EXT = i64;",
 // "pub type GLuint64EXT = u64;",
 // "pub type GLintptr = intptr_t;",
 // "pub type GLsizeiptr = ssize_t;",
 
 // GLES 2 types (none currently)
 
 // Vendor extension types
-pub type GLDEBUGPROCAMD = extern "system" fn(id: GLuint,
-                                             category: GLenum,
-                                             severity: GLenum,
-                                             length: GLsizei,
-                                             message: *const GLchar,
-                                             userParam: *mut super::__gl_imports::raw::c_void);
+pub type GLDEBUGPROCAMD = Option<extern "system" fn(id: GLuint,
+                                                    category: GLenum,
+                                                    severity: GLenum,
+                                                    length: GLsizei,
+                                                    message: *const GLchar,
+                                                    userParam: *mut super::__gl_imports::raw::c_void)>;
 pub type GLhalfNV = super::__gl_imports::raw::c_ushort;
 pub type GLvdpauSurfaceNV = GLintptr;
--- a/third_party/rust/gl_generator/registry/parse.rs
+++ b/third_party/rust/gl_generator/registry/parse.rs
@@ -196,17 +196,17 @@ fn make_egl_enum(ident: String, ty: Opti
                 let value = working[i + 1..].to_string();
 
                 (Cow::Owned(ty), value, true)
             } else {
                 panic!("Unexpected value format: {}", value)
             }
         } else {
             match value.chars().next() {
-                Some('-') | Some('0'...'9') => (),
+                Some('-') | Some('0'..='9') => (),
                 _ => panic!("Unexpected value format: {}", value),
             }
 
             let ty = match ty {
                 Some(ref ty) if ty == "ull" => "EGLuint64KHR",
                 Some(ty) => panic!("Unhandled enum type: {}", ty),
                 None if value.starts_with('-') => "EGLint",
                 None if ident == "TRUE" || ident == "FALSE" => "EGLBoolean",
@@ -1036,16 +1036,17 @@ pub fn to_rust_ty<T: AsRef<str>>(ty: T) 
         "NativeWindowType" => "types::NativeWindowType",
         //"Bool"                      => "types::Bool",
         "EGLBoolean" => "types::EGLBoolean",
         "EGLenum" => "types::EGLenum",
         "EGLAttribKHR" => "types::EGLAttribKHR",
         "EGLAttrib" => "types::EGLAttrib",
         "EGLAttrib *" => "*mut types::EGLAttrib",
         "const EGLAttrib *" => "*const types::EGLAttrib",
+        "const EGLattrib *" => "*const types::EGLAttrib", // Due to a typo in khronos_api/api_angle/scripts/egl_angle_ext.xml - see brendanzab/gl-rs#491
         "EGLConfig" => "types::EGLConfig",
         "EGLConfig *" => "*mut types::EGLConfig",
         "EGLContext" => "types::EGLContext",
         "EGLDeviceEXT" => "types::EGLDeviceEXT",
         "EGLDisplay" => "types::EGLDisplay",
         "EGLSurface" => "types::EGLSurface",
         "EGLClientBuffer" => "types::EGLClientBuffer",
         "__eglMustCastToProperFunctionPointerType" => {
--- a/third_party/rust/gleam/.cargo-checksum.json
+++ b/third_party/rust/gleam/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"40dda1b03ff20d8a3b4b544683f37a8d2b2137cfbb4d545122167352690d6b16","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"1acb12040be43a3582d5897f11870b3ffdcd7ce0f4f32de158175bb6b33ec0b7","build.rs":"2d3833a24fee9d1f669f4cd7347b4ca8444a138d473ab9188f4d65f6981c4191","rustfmt.toml":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/gl.rs":"b7791f77dbbea690a7a0d33e3c083337a6b04a233a192dc8c96d4fe481a4a7ed","src/gl_fns.rs":"f88cd940691e0fca169cabbe2a95418300d09392d91a020079cfbdd5bacd753b","src/gles_fns.rs":"3766f2b76aa4038774a4754ce89cdcbb50286ab5bcf07cb0bb6e88f0de31f96f","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"7f46fd8874e043ffac0d638ed1567a2584f7814f6d72b4db37ab1689004a26c4"}
\ No newline at end of file
+{"files":{"COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"834f409ac81917f5b5730483c90611e3193a8fb7400c87d30e7988d866bc5740","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"1acb12040be43a3582d5897f11870b3ffdcd7ce0f4f32de158175bb6b33ec0b7","build.rs":"b6b30972ee2be2e151af0ca93b30ccc3c8bce2cfeef4217244d6b413b6bd0c9d","rustfmt.toml":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/gl.rs":"e923f4ccfeae5112e6cea8f78ff279e8a26c041dcfb5cfb63d9713e733d249c3","src/gl_fns.rs":"67b5eac2a686f4a58201b8d51fc27db1aca6d597dfaa5c8ad4007170ffb18887","src/gles_fns.rs":"1c206adf96e6b9767d526aad54ddfb48e99aa0f5766d3cb72019470f4bdd88f9","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"332d1f4e6c6181ed07178f84a552b2387d43ecf6821a86c22cfb3883ea3fb1b9"}
\ 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.6.17"
+version = "0.9.2"
 authors = ["The Servo Project Developers"]
 build = "build.rs"
 description = "Generated OpenGL bindings and wrapper for Servo."
 documentation = "https://doc.servo.org/gleam/"
 license = "Apache-2.0/MIT"
 repository = "https://github.com/servo/gleam"
 [build-dependencies.gl_generator]
-version = "0.11"
+version = "0.14"
--- a/third_party/rust/gleam/build.rs
+++ b/third_party/rust/gleam/build.rs
@@ -12,16 +12,17 @@ fn main() {
     let mut file_gl = File::create(&Path::new(&dest).join("gl_bindings.rs")).unwrap();
     let mut file_gles = File::create(&Path::new(&dest).join("gles_bindings.rs")).unwrap();
 
     // OpenGL 3.3 bindings
     let gl_extensions = [
         "GL_APPLE_client_storage",
         "GL_APPLE_fence",
         "GL_APPLE_texture_range",
+        "GL_APPLE_vertex_array_object",
         "GL_ARB_blend_func_extended",
         "GL_ARB_copy_image",
         "GL_ARB_get_program_binary",
         "GL_ARB_invalidate_subdata",
         "GL_ARB_texture_rectangle",
         "GL_ARB_texture_storage",
         "GL_EXT_debug_marker",
         "GL_EXT_texture_filter_anisotropic",
@@ -49,16 +50,18 @@ fn main() {
         "GL_EXT_texture_filter_anisotropic",
         "GL_EXT_texture_format_BGRA8888",
         "GL_EXT_texture_storage",
         "GL_OES_EGL_image_external",
         "GL_OES_EGL_image",
         "GL_OES_texture_half_float",
         "GL_EXT_shader_pixel_local_storage",
         "GL_ANGLE_provoking_vertex",
+        "GL_ANGLE_texture_usage",
+        "GL_CHROMIUM_copy_texture",
         "GL_KHR_debug",
         "GL_KHR_blend_equation_advanced",
         "GL_KHR_blend_equation_advanced_coherent",
     ];
     let gles_reg = Registry::new(
         Api::Gles2,
         (3, 0),
         Profile::Core,
--- a/third_party/rust/gleam/src/gl.rs
+++ b/third_party/rust/gleam/src/gl.rs
@@ -18,17 +18,17 @@ use std::str;
 use std::time::{Duration, Instant};
 
 pub use ffi::types::*;
 pub use ffi::*;
 
 pub use ffi_gl::Gl as GlFfi;
 pub use ffi_gles::Gles2 as GlesFfi;
 
-#[derive(Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
 pub enum GlType {
     Gl,
     Gles,
 }
 
 impl Default for GlType {
     #[cfg(any(target_os = "android", target_os = "ios"))]
     fn default() -> GlType {
@@ -69,42 +69,53 @@ fn calculate_length(width: GLsizei, heig
 pub struct DebugMessage {
     pub message: String,
     pub source: GLenum,
     pub ty: GLenum,
     pub id: GLenum,
     pub severity: GLenum,
 }
 
+mod private {
+    // Private marker trait extended by the Gl public trait so that no one
+    // else outside this crate can implement Gl. Why? So that adding new methods
+    // to it don't lead to a breaking change.
+    pub trait Sealed {}
+}
+use self::private::Sealed;
+
 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 {
+        pub trait Gl: Sealed {
             $($(unsafe $($garbo)*)* fn $name(&self $(, $arg:$t)*) $(-> $retty)* ;)+
         }
 
+        impl Sealed for ErrorCheckingGl {}
         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
             })+
         }
 
-        impl<F: Fn(&Gl, &str, GLenum)> Gl for ErrorReactingGl<F> {
+        impl<F> Sealed for ErrorReactingGl<F> {}
+        impl<F: Fn(&dyn Gl, &str, GLenum)> Gl for ErrorReactingGl<F> {
             $($(unsafe $($garbo)*)* fn $name(&self $(, $arg:$t)*) $(-> $retty)* {
                 let rv = self.gl.$name($($arg,)*);
                 let error = self.gl.get_error();
                 if error != 0 {
                     (self.callback)(&*self.gl, stringify!($name), error);
                 }
                 rv
             })+
         }
 
+        impl<F> Sealed for ProfilingGl<F> {}
         impl<F: Fn(&str, Duration)> Gl for ProfilingGl<F> {
             $($(unsafe $($garbo)*)* fn $name(&self $(, $arg:$t)*) $(-> $retty)* {
                 let start = Instant::now();
                 let rv = self.gl.$name($($arg,)*);
                 let duration = Instant::now() - start;
                 if duration > self.threshold {
                     (self.callback)(stringify!($name), duration);
                 }
@@ -164,26 +175,28 @@ declare_gl_apis! {
     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>;
+    fn gen_vertex_arrays_apple(&self, n: GLsizei) -> Vec<GLuint>;
     fn gen_queries(&self, n: GLsizei) -> Vec<GLuint>;
     fn begin_query(&self, target: GLenum, id: GLuint);
     fn end_query(&self, target: GLenum);
     fn query_counter(&self, id: GLuint, target: GLenum);
     fn get_query_object_iv(&self, id: GLuint, pname: GLenum) -> i32;
     fn get_query_object_uiv(&self, id: GLuint, pname: GLenum) -> u32;
     fn get_query_object_i64v(&self, id: GLuint, pname: GLenum) -> i64;
     fn get_query_object_ui64v(&self, id: GLuint, pname: GLenum) -> u64;
     fn delete_queries(&self, queries: &[GLuint]);
     fn delete_vertex_arrays(&self, vertex_arrays: &[GLuint]);
+    fn delete_vertex_arrays_apple(&self, vertex_arrays: &[GLuint]);
     fn delete_buffers(&self, buffers: &[GLuint]);
     fn delete_renderbuffers(&self, renderbuffers: &[GLuint]);
     fn delete_framebuffers(&self, framebuffers: &[GLuint]);
     fn delete_textures(&self, textures: &[GLuint]);
     fn framebuffer_renderbuffer(&self,
                                 target: GLenum,
                                 attachment: GLenum,
                                 renderbuffertarget: GLenum,
@@ -204,16 +217,17 @@ declare_gl_apis! {
     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);
     fn bind_buffer(&self, target: GLenum, buffer: GLuint);
     fn bind_vertex_array(&self, vao: GLuint);
+    fn bind_vertex_array_apple(&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,
                     level: GLint,
                     internal_format: GLint,
@@ -544,16 +558,17 @@ declare_gl_apis! {
     fn get_error(&self) -> GLenum;
     fn stencil_mask(&self, mask: GLuint);
     fn stencil_mask_separate(&self, face: GLenum, mask: GLuint);
     fn stencil_func(&self, func: GLenum, ref_: GLint, mask: GLuint);
     fn stencil_func_separate(&self, face: GLenum, func: GLenum, ref_: GLint, mask: GLuint);
     fn stencil_op(&self, sfail: GLenum, dpfail: GLenum, dppass: GLenum);
     fn stencil_op_separate(&self, face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum);
     fn egl_image_target_texture2d_oes(&self, target: GLenum, image: GLeglImageOES);
+    fn egl_image_target_renderbuffer_storage_oes(&self, target: GLenum, image: GLeglImageOES);
     fn generate_mipmap(&self, target: GLenum);
     fn insert_event_marker_ext(&self, message: &str);
     fn push_group_marker_ext(&self, message: &str);
     fn pop_group_marker_ext(&self);
     fn debug_message_insert_khr(&self, source: GLenum, type_: GLenum, id: GLuint, severity: GLenum, message: &str);
     fn push_debug_group_khr(&self, source: GLenum, id: GLuint, message: &str);
     fn pop_debug_group_khr(&self);
     fn fence_sync(&self, condition: GLenum, flags: GLbitfield) -> GLsync;
@@ -583,79 +598,91 @@ declare_gl_apis! {
         &self,
         program: GLuint,
         name: &str,
     ) -> GLint;
 
     // GL_KHR_debug
     fn get_debug_messages(&self) -> Vec<DebugMessage>;
 
-    // GL_ANGLE_provoking_vertex.
+    // GL_ANGLE_provoking_vertex
     fn provoking_vertex_angle(&self, mode: GLenum);
+
+    // GL_CHROMIUM_copy_texture
+    fn copy_texture_chromium(&self,
+        source_id: GLuint, source_level: GLint,
+        dest_target: GLenum, dest_id: GLuint, dest_level: GLint,
+        internal_format: GLint, dest_type: GLenum,
+        unpack_flip_y: GLboolean, unpack_premultiply_alpha: GLboolean, unpack_unmultiply_alpha: GLboolean);
+    fn copy_sub_texture_chromium(&self,
+        source_id: GLuint, source_level: GLint,
+        dest_target: GLenum, dest_id: GLuint, dest_level: GLint,
+        x_offset: GLint, y_offset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei,
+        unpack_flip_y: GLboolean, unpack_premultiply_alpha: GLboolean, unpack_unmultiply_alpha: GLboolean);
 }
 
 //#[deprecated(since = "0.6.11", note = "use ErrorReactingGl instead")]
 pub struct ErrorCheckingGl {
-    gl: Rc<Gl>,
+    gl: Rc<dyn Gl>,
 }
 
 impl ErrorCheckingGl {
-    pub fn wrap(fns: Rc<Gl>) -> Rc<Gl> {
-        Rc::new(ErrorCheckingGl { gl: fns }) as Rc<Gl>
+    pub fn wrap(fns: Rc<dyn Gl>) -> Rc<dyn Gl> {
+        Rc::new(ErrorCheckingGl { gl: fns }) as Rc<dyn Gl>
     }
 }
 
 /// A wrapper around GL context that calls a specified callback on each GL error.
 pub struct ErrorReactingGl<F> {
-    gl: Rc<Gl>,
+    gl: Rc<dyn Gl>,
     callback: F,
 }
 
-impl<F: 'static + Fn(&Gl, &str, GLenum)> ErrorReactingGl<F> {
-    pub fn wrap(fns: Rc<Gl>, callback: F) -> Rc<Gl> {
-        Rc::new(ErrorReactingGl { gl: fns, callback }) as Rc<Gl>
+impl<F: 'static + Fn(&dyn Gl, &str, GLenum)> ErrorReactingGl<F> {
+    pub fn wrap(fns: Rc<dyn Gl>, callback: F) -> Rc<dyn Gl> {
+        Rc::new(ErrorReactingGl { gl: fns, callback }) as Rc<dyn Gl>
     }
 }
 
 /// A wrapper around GL context that times each call and invokes the callback
 /// if the call takes longer than the threshold.
 pub struct ProfilingGl<F> {
-    gl: Rc<Gl>,
+    gl: Rc<dyn Gl>,
     threshold: Duration,
     callback: F,
 }
 
 impl<F: 'static + Fn(&str, Duration)> ProfilingGl<F> {
-    pub fn wrap(fns: Rc<Gl>, threshold: Duration, callback: F) -> Rc<Gl> {
-        Rc::new(ProfilingGl { gl: fns, threshold, callback }) as Rc<Gl>
+    pub fn wrap(fns: Rc<dyn Gl>, threshold: Duration, callback: F) -> Rc<dyn Gl> {
+        Rc::new(ProfilingGl { gl: fns, threshold, callback }) as Rc<dyn Gl>
     }
 }
 
 #[inline]
-pub fn buffer_data<T>(gl_: &Gl, target: GLenum, data: &[T], usage: GLenum) {
+pub fn buffer_data<T>(gl_: &dyn 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,
     )
 }
 
 #[inline]
-pub fn buffer_data_raw<T>(gl_: &Gl, target: GLenum, data: &T, usage: GLenum) {
+pub fn buffer_data_raw<T>(gl_: &dyn Gl, target: GLenum, data: &T, usage: GLenum) {
     gl_.buffer_data_untyped(
         target,
         size_of::<T>() as GLsizeiptr,
         data as *const T as *const GLvoid,
         usage,
     )
 }
 
 #[inline]
-pub fn buffer_sub_data<T>(gl_: &Gl, target: GLenum, offset: isize, data: &[T]) {
+pub fn buffer_sub_data<T>(gl_: &dyn Gl, target: GLenum, offset: isize, data: &[T]) {
     gl_.buffer_sub_data_untyped(
         target,
         offset,
         (data.len() * size_of::<T>()) as GLsizeiptr,
         data.as_ptr() as *const GLvoid,
     );
 }
 
--- a/third_party/rust/gleam/src/gl_fns.rs
+++ b/third_party/rust/gleam/src/gl_fns.rs
@@ -7,25 +7,26 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
 pub struct GlFns {
     ffi_gl_: GlFfi,
 }
 
 impl GlFns {
-    pub unsafe fn load_with<'a, F>(loadfn: F) -> Rc<Gl>
+    pub unsafe fn load_with<'a, F>(loadfn: F) -> Rc<dyn Gl>
     where
         F: FnMut(&str) -> *const c_void,
     {
         let ffi_gl_ = GlFfi::load_with(loadfn);
-        Rc::new(GlFns { ffi_gl_: ffi_gl_ }) as Rc<Gl>
+        Rc::new(GlFns { ffi_gl_: ffi_gl_ }) as Rc<dyn Gl>
     }
 }
 
+impl Sealed for GlFns {}
 impl Gl for GlFns {
     fn get_type(&self) -> GlType {
         GlType::Gl
     }
 
     fn buffer_data_untyped(
         &self,
         target: GLenum,
@@ -216,17 +217,25 @@ impl Gl for GlFns {
             self.ffi_gl_.GenTextures(n, result.as_mut_ptr());
         }
         result
     }
 
     fn gen_vertex_arrays(&self, n: GLsizei) -> Vec<GLuint> {
         let mut result = vec![0 as GLuint; n as usize];
         unsafe {
-            self.ffi_gl_.GenVertexArrays(n, result.as_mut_ptr());
+            self.ffi_gl_.GenVertexArrays(n, result.as_mut_ptr())
+        }
+        result
+    }
+
+    fn gen_vertex_arrays_apple(&self, n: GLsizei) -> Vec<GLuint> {
+        let mut result = vec![0 as GLuint; n as usize];
+        unsafe {
+            self.ffi_gl_.GenVertexArraysAPPLE(n, result.as_mut_ptr())
         }
         result
     }
 
     fn gen_queries(&self, n: GLsizei) -> Vec<GLuint> {
         let mut result = vec![0 as GLuint; n as usize];
         unsafe {
             self.ffi_gl_.GenQueries(n, result.as_mut_ptr());
@@ -293,16 +302,23 @@ impl Gl for GlFns {
 
     fn delete_vertex_arrays(&self, vertex_arrays: &[GLuint]) {
         unsafe {
             self.ffi_gl_
                 .DeleteVertexArrays(vertex_arrays.len() as GLsizei, vertex_arrays.as_ptr());
         }
     }
 
+    fn delete_vertex_arrays_apple(&self, vertex_arrays: &[GLuint]) {
+        unsafe {
+            self.ffi_gl_
+                .DeleteVertexArraysAPPLE(vertex_arrays.len() as GLsizei, vertex_arrays.as_ptr());
+        }
+    }
+
     fn delete_buffers(&self, buffers: &[GLuint]) {
         unsafe {
             self.ffi_gl_
                 .DeleteBuffers(buffers.len() as GLsizei, buffers.as_ptr());
         }
     }
 
     fn delete_renderbuffers(&self, renderbuffers: &[GLuint]) {
@@ -459,16 +475,22 @@ impl Gl for GlFns {
     }
 
     fn bind_vertex_array(&self, vao: GLuint) {
         unsafe {
             self.ffi_gl_.BindVertexArray(vao);
         }
     }
 
+    fn bind_vertex_array_apple(&self, vao: GLuint) {
+        unsafe {
+            self.ffi_gl_.BindVertexArrayAPPLE(vao)
+        }
+    }
+
     fn bind_renderbuffer(&self, target: GLenum, renderbuffer: GLuint) {
         unsafe {
             self.ffi_gl_.BindRenderbuffer(target, renderbuffer);
         }
     }
 
     fn bind_framebuffer(&self, target: GLenum, framebuffer: GLuint) {
         unsafe {
@@ -1911,16 +1933,21 @@ impl Gl for GlFns {
         unsafe { self.ffi_gl_.StencilOpSeparate(face, sfail, dpfail, dppass) }
     }
 
     #[allow(unused_variables)]
     fn egl_image_target_texture2d_oes(&self, target: GLenum, image: GLeglImageOES) {
         panic!("not supported")
     }
 
+    #[allow(unused_variables)]
+    fn egl_image_target_renderbuffer_storage_oes(&self, target: GLenum, image: GLeglImageOES) {
+        panic!("not supported")
+    }
+
     fn generate_mipmap(&self, target: GLenum) {
         unsafe { self.ffi_gl_.GenerateMipmap(target) }
     }
 
     fn insert_event_marker_ext(&self, message: &str) {
         if self.ffi_gl_.InsertEventMarkerEXT.is_loaded() {
             unsafe {
                 self.ffi_gl_
@@ -2148,9 +2175,27 @@ impl Gl for GlFns {
     // GL_KHR_blend_equation_advanced
     fn blend_barrier_khr(&self) {
         if self.ffi_gl_.BlendBarrierKHR.is_loaded() {
             unsafe {
                 self.ffi_gl_.BlendBarrierKHR();
             }
         }
     }
+
+    // GL_CHROMIUM_copy_texture
+    fn copy_texture_chromium(&self,
+        _source_id: GLuint, _source_level: GLint,
+        _dest_target: GLenum, _dest_id: GLuint, _dest_level: GLint,
+        _internal_format: GLint, _dest_type: GLenum,
+        _unpack_flip_y: GLboolean, _unpack_premultiply_alpha: GLboolean, _unpack_unmultiply_alpha: GLboolean)
+    {
+        unimplemented!("This extension is GLES only");
+    }
+    fn copy_sub_texture_chromium(&self,
+        _source_id: GLuint, _source_level: GLint,
+        _dest_target: GLenum, _dest_id: GLuint, _dest_level: GLint,
+        _x_offset: GLint, _y_offset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei,
+        _unpack_flip_y: GLboolean, _unpack_premultiply_alpha: GLboolean, _unpack_unmultiply_alpha: GLboolean)
+    {
+        unimplemented!("This extension is GLES only");
+    }
 }
--- a/third_party/rust/gleam/src/gles_fns.rs
+++ b/third_party/rust/gleam/src/gles_fns.rs
@@ -7,25 +7,26 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
 pub struct GlesFns {
     ffi_gl_: GlesFfi,
 }
 
 impl GlesFns {
-    pub unsafe fn load_with<'a, F>(loadfn: F) -> Rc<Gl>
+    pub unsafe fn load_with<'a, F>(loadfn: F) -> Rc<dyn Gl>
     where
         F: FnMut(&str) -> *const c_void,
     {
         let ffi_gl_ = GlesFfi::load_with(loadfn);
-        Rc::new(GlesFns { ffi_gl_: ffi_gl_ }) as Rc<Gl>
+        Rc::new(GlesFns { ffi_gl_: ffi_gl_ }) as Rc<dyn Gl>
     }
 }
 
+impl Sealed for GlesFns {}
 impl Gl for GlesFns {
     fn get_type(&self) -> GlType {
         GlType::Gles
     }
 
     fn buffer_data_untyped(
         &self,
         target: GLenum,
@@ -216,16 +217,20 @@ impl Gl for GlesFns {
     fn gen_vertex_arrays(&self, n: GLsizei) -> Vec<GLuint> {
         let mut result = vec![0 as GLuint; n as usize];
         unsafe {
             self.ffi_gl_.GenVertexArrays(n, result.as_mut_ptr());
         }
         result
     }
 
+    fn gen_vertex_arrays_apple(&self, _n: GLsizei) -> Vec<GLuint> {
+        panic!("not supported")
+    }
+
     fn gen_queries(&self, n: GLsizei) -> Vec<GLuint> {
         if !self.ffi_gl_.GenQueriesEXT.is_loaded() {
             return Vec::new();
         }
         let mut result = vec![0 as GLuint; n as usize];
         unsafe {
             self.ffi_gl_.GenQueriesEXT(n, result.as_mut_ptr());
         }
@@ -315,16 +320,20 @@ impl Gl for GlesFns {
 
     fn delete_vertex_arrays(&self, vertex_arrays: &[GLuint]) {
         unsafe {
             self.ffi_gl_
                 .DeleteVertexArrays(vertex_arrays.len() as GLsizei, vertex_arrays.as_ptr());
         }
     }
 
+    fn delete_vertex_arrays_apple(&self, _vertex_arrays: &[GLuint]) {
+        panic!("not supported")
+    }
+
     fn delete_buffers(&self, buffers: &[GLuint]) {
         unsafe {
             self.ffi_gl_
                 .DeleteBuffers(buffers.len() as GLsizei, buffers.as_ptr());
         }
     }
 
     fn delete_renderbuffers(&self, renderbuffers: &[GLuint]) {
@@ -481,16 +490,20 @@ impl Gl for GlesFns {
     }
 
     fn bind_vertex_array(&self, vao: GLuint) {
         unsafe {
             self.ffi_gl_.BindVertexArray(vao);
         }
     }
 
+    fn bind_vertex_array_apple(&self, _vao: GLuint) {
+        panic!("not supported")
+    }
+
     fn bind_renderbuffer(&self, target: GLenum, renderbuffer: GLuint) {
         unsafe {
             self.ffi_gl_.BindRenderbuffer(target, renderbuffer);
         }
     }
 
     fn bind_framebuffer(&self, target: GLenum, framebuffer: GLuint) {
         unsafe {
@@ -1917,16 +1930,22 @@ impl Gl for GlesFns {
     }
 
     fn egl_image_target_texture2d_oes(&self, target: GLenum, image: GLeglImageOES) {
         unsafe {
             self.ffi_gl_.EGLImageTargetTexture2DOES(target, image);
         }
     }
 
+    fn egl_image_target_renderbuffer_storage_oes(&self, target: GLenum, image: GLeglImageOES) {
+        unsafe {
+            self.ffi_gl_.EGLImageTargetRenderbufferStorageOES(target, image);
+        }
+    }
+
     fn generate_mipmap(&self, target: GLenum) {
         unsafe { self.ffi_gl_.GenerateMipmap(target) }
     }
 
     fn insert_event_marker_ext(&self, message: &str) {
         if self.ffi_gl_.InsertEventMarkerEXT.is_loaded() {
             unsafe {
                 self.ffi_gl_
@@ -2115,9 +2134,37 @@ impl Gl for GlesFns {
     // GL_KHR_blend_equation_advanced
     fn blend_barrier_khr(&self) {
         if self.ffi_gl_.BlendBarrierKHR.is_loaded() {
             unsafe {
                 self.ffi_gl_.BlendBarrierKHR();
             }
         }
     }
+
+    // GL_CHROMIUM_copy_texture
+    fn copy_texture_chromium(&self,
+        source_id: GLuint, source_level: GLint,
+        dest_target: GLenum, dest_id: GLuint, dest_level: GLint,
+        internal_format: GLint, dest_type: GLenum,
+        unpack_flip_y: GLboolean, unpack_premultiply_alpha: GLboolean, unpack_unmultiply_alpha: GLboolean)
+    {
+        unsafe {
+            self.ffi_gl_.CopyTextureCHROMIUM(source_id, source_level, dest_target, dest_id, dest_level,
+                internal_format, dest_type,
+                unpack_flip_y, unpack_premultiply_alpha, unpack_unmultiply_alpha,
+            );
+        }
+    }
+    fn copy_sub_texture_chromium(&self,
+        source_id: GLuint, source_level: GLint,
+        dest_target: GLenum, dest_id: GLuint, dest_level: GLint,
+        x_offset: GLint, y_offset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei,
+        unpack_flip_y: GLboolean, unpack_premultiply_alpha: GLboolean, unpack_unmultiply_alpha: GLboolean)
+    {
+        unsafe {
+            self.ffi_gl_.CopySubTextureCHROMIUM(source_id, source_level, dest_target, dest_id, dest_level,
+                x_offset, y_offset, x, y, width, height,
+                unpack_flip_y, unpack_premultiply_alpha, unpack_unmultiply_alpha,
+            );
+        }
+    }
 }