Merge mozilla-central to autoland.
authorCosmin Sabou <csabou@mozilla.com>
Wed, 28 Nov 2018 00:12:05 +0200
changeset 507598 54e6db47c59eecfccc644236eb86255d903fcb79
parent 507597 193a2a5ad0e6148fa266929af17ff2d897af9f12 (diff)
parent 507576 204cda7581188cfc8c8ef11dce4680dadf2b43bb (current diff)
child 507599 74216c81fc8d385d94e1f7ea6b0c2377aca65953
push id1905
push userffxbld-merge
push dateMon, 21 Jan 2019 12:33:13 +0000
treeherdermozilla-release@c2fca1944d8c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone65.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
Merge mozilla-central to autoland.
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1059,30 +1059,30 @@ dependencies = [
  "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "u2fhid 0.2.2",
  "webrender_bindings 0.1.0",
  "xpcom 0.1.0",
 ]
 
 [[package]]
 name = "gl_generator"
-version = "0.9.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "xml-rs 0.7.0 (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.3"
+version = "0.6.8"
 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)",
+ "gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "glob"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1246,17 +1246,17 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "khronos_api"
-version = "2.2.0"
+version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lalrpop"
 version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2943,17 +2943,17 @@ dependencies = [
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.6.1 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "plane-split 0.13.3 (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.80 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2987,17 +2987,17 @@ dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.19.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
  "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)",
  "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.57.2",
 ]
 
@@ -3060,21 +3060,18 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "xml-rs"
-version = "0.7.0"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
 
 [[package]]
 name = "xpcom"
 version = "0.1.0"
 dependencies = [
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
@@ -3216,33 +3213,33 @@ dependencies = [
 "checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
 "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 futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "884dbe32a6ae4cd7da5c6db9b78114449df9953b8d490c9d7e1b51720b922c62"
 "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 generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
-"checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
-"checksum gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2260952cc0393ca6f183e1a91a035c65c85ddb02505f3d53e5a775eb05946f44"
+"checksum gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0ffaf173cf76c73a73e080366bf556b4776ece104b06961766ff11449f38604"
+"checksum gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4b47f5b15742aee359c7895ab98cf2cceecc89bb4feb6f4e42f802d7899877da"
 "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
 "checksum goblin 0.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5911d7df7b8f65ab676c5327b50acea29d3c6a1a4ad05e444cf5dce321b26db2"
 "checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c"
 "checksum http 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "dca621d0fa606a5ff2850b6e337b57ad6137ee4d67e940449643ff45af6874c6"
 "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.12.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c087746de95e20e4dabe86606c3a019964a8fde2d5f386152939063c116c5971"
 "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 indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220"
 "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
 "checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
 "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554"
+"checksum khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49"
 "checksum lalrpop 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9f7014afd5642680074fd5dcc624d544f9eabfa281cba2c3ac56c3db6d21ad1b"
 "checksum lalrpop-snap 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b85aa455529344133d7ecaaac04c01ed87f459deeaa0fe5422885e2095d8cdc"
 "checksum lalrpop-util 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2400aeebcd11259370d038c24821b93218dd2f33a53f53e9c8fcccca70be6696"
 "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739"
 "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
 "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef"
 "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
 "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
@@ -3402,11 +3399,11 @@ dependencies = [
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)" = "<none>"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)" = "<none>"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)" = "<none>"
 "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767"
 "checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
-"checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2"
+"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
 "checksum yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57ab38ee1a4a266ed033496cf9af1828d8d6e6c1cfa5f643a2809effcae4d628"
 "checksum zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "36b9e08fb518a65cf7e08a1e482573eb87a2f4f8c6619316612a3c1f162fe822"
--- a/browser/components/extensions/parent/ext-browser.js
+++ b/browser/components/extensions/parent/ext-browser.js
@@ -483,17 +483,17 @@ class TabTracker extends TabTrackerBase 
       case "TabSelect":
         // Because we are delaying calling emitCreated above, we also need to
         // delay sending this event because it shouldn't fire before onCreated.
         Promise.resolve().then(() => {
           if (!nativeTab.parentNode) {
             // If the tab is already be destroyed, do nothing.
             return;
           }
-          this.emitActivated(nativeTab);
+          this.emitActivated(nativeTab, event.detail.previousTab);
         });
         break;
 
       case "TabMultiSelect":
         if (this.has("tabs-highlighted")) {
           // Because we are delaying calling emitCreated above, we also need to
           // delay sending this event because it shouldn't fire before onCreated.
           Promise.resolve().then(() => {
@@ -566,21 +566,24 @@ class TabTracker extends TabTrackerBase 
     }
   }
 
   /**
    * Emits a "tab-activated" event for the given tab element.
    *
    * @param {NativeTab} nativeTab
    *        The tab element which has been activated.
+   * @param {NativeTab} previousTab
+   *        The tab element which was previously activated.
    * @private
    */
-  emitActivated(nativeTab) {
+  emitActivated(nativeTab, previousTab = undefined) {
     this.emit("tab-activated", {
       tabId: this.getId(nativeTab),
+      previousTabId: previousTab && !previousTab.closing ? this.getId(previousTab) : undefined,
       windowId: windowTracker.getId(nativeTab.ownerGlobal)});
   }
 
   /**
    * Emits a "tabs-highlighted" event for the given tab element.
    *
    * @param {ChromeWindow} window
    *        The window in which the active tab or the set of multiselected tabs changed.
@@ -772,16 +775,21 @@ class Tab extends TabBase {
   get isArticle() {
     return this.nativeTab.linkedBrowser.isArticle;
   }
 
   get isInReaderMode() {
     return this.url && this.url.startsWith(READER_MODE_PREFIX);
   }
 
+  get successorTabId() {
+    const {successor} = this.nativeTab;
+    return successor ? tabTracker.getId(successor) : -1;
+  }
+
   /**
    * Converts session store data to an object compatible with the return value
    * of the convert() method, representing that data.
    *
    * @param {Extension} extension
    *        The extension for which to convert the data.
    * @param {Object} tabData
    *        Session store data for a closed tab, as returned by
--- a/browser/components/extensions/parent/ext-tabs.js
+++ b/browser/components/extensions/parent/ext-tabs.js
@@ -26,16 +26,18 @@ var {
 } = ExtensionUtils;
 
 const TABHIDE_PREFNAME = "extensions.webextensions.tabhide.enabled";
 const MULTISELECT_PREFNAME = "browser.tabs.multiselect";
 XPCOMUtils.defineLazyPreferenceGetter(this, "gMultiSelectEnabled", MULTISELECT_PREFNAME, false);
 
 const TAB_HIDE_CONFIRMED_TYPE = "tabHideNotification";
 
+const TAB_ID_NONE = -1;
+
 
 XPCOMUtils.defineLazyGetter(this, "tabHidePopup", () => {
   return new ExtensionControlledPopup({
     confirmedType: TAB_HIDE_CONFIRMED_TYPE,
     anchorId: "alltabs-button",
     popupnotificationId: "extension-tab-hide-notification",
     descriptionId: "extension-tab-hide-notification-description",
     descriptionMessageId: "tabHideControlled.message",
@@ -722,16 +724,29 @@ this.tabs = class extends ExtensionAPI {
           }
           if (updateProperties.openerTabId !== null) {
             let opener = tabTracker.getTab(updateProperties.openerTabId);
             if (opener.ownerDocument !== nativeTab.ownerDocument) {
               return Promise.reject({message: "Opener tab must be in the same window as the tab being updated"});
             }
             tabTracker.setOpener(nativeTab, opener);
           }
+          if (updateProperties.successorTabId !== null) {
+            let successor = null;
+            if (updateProperties.successorTabId !== TAB_ID_NONE) {
+              successor = tabTracker.getTab(updateProperties.successorTabId, null);
+              if (!successor) {
+                throw new ExtensionError("Invalid successorTabId");
+              }
+              if (successor.ownerDocument !== nativeTab.ownerDocument) {
+                throw new ExtensionError("Successor tab must be in the same window as the tab being updated");
+              }
+            }
+            tabbrowser.setSuccessor(nativeTab, successor);
+          }
 
           return tabManager.convert(nativeTab);
         },
 
         async reload(tabId, reloadProperties) {
           let nativeTab = getTabOrActive(tabId);
 
           let flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
@@ -1235,16 +1250,67 @@ this.tabs = class extends ExtensionAPI {
           if (!tab.isInReaderMode && !tab.isArticle) {
             throw new ExtensionError("The specified tab cannot be placed into reader mode.");
           }
           tab = getTabOrActive(tabId);
 
           tab.linkedBrowser.messageManager.sendAsyncMessage("Reader:ToggleReaderMode");
         },
 
+        moveInSuccession(tabIds, tabId, options) {
+          const {insert, append} = options || {};
+          const tabIdSet = new Set(tabIds);
+          if (tabIdSet.size !== tabIds.length) {
+            throw new ExtensionError("IDs must not occur more than once in tabIds");
+          }
+          if ((append || insert) && tabIdSet.has(tabId)) {
+            throw new ExtensionError("Value of tabId must not occur in tabIds if append or insert is true");
+          }
+
+          const referenceTab = tabTracker.getTab(tabId, null);
+          let referenceWindow = referenceTab && referenceTab.ownerGlobal;
+          let previousTab, lastSuccessor;
+          if (append) {
+            previousTab = referenceTab;
+            lastSuccessor = (insert && referenceTab && referenceTab.successor) || null;
+          } else {
+            lastSuccessor = referenceTab;
+          }
+
+          let firstTab;
+          for (const tabId of tabIds) {
+            const tab = tabTracker.getTab(tabId, null);
+            if (tab === null) {
+              continue;
+            }
+            if (referenceWindow === null) {
+              referenceWindow = tab.ownerGlobal;
+            } else if (tab.ownerGlobal !== referenceWindow) {
+              continue;
+            }
+            referenceWindow.gBrowser.replaceInSuccession(tab, tab.successor);
+            if (append && tab === lastSuccessor) {
+              lastSuccessor = tab.successor;
+            }
+            if (previousTab) {
+              referenceWindow.gBrowser.setSuccessor(previousTab, tab);
+            } else {
+              firstTab = tab;
+            }
+            previousTab = tab;
+          }
+
+          if (previousTab) {
+            if (!append && insert && lastSuccessor !== null) {
+              referenceWindow.gBrowser.replaceInSuccession(lastSuccessor, firstTab);
+            }
+            referenceWindow.gBrowser.setSuccessor(previousTab, lastSuccessor);
+          }
+        },
+
         show(tabIds) {
           if (!Services.prefs.getBoolPref(TABHIDE_PREFNAME, false)) {
             throw new ExtensionError(`tabs.show is currently experimental and must be enabled with the ${TABHIDE_PREFNAME} preference.`);
           }
 
           if (!Array.isArray(tabIds)) {
             tabIds = [tabIds];
           }
--- a/browser/components/extensions/schemas/tabs.json
+++ b/browser/components/extensions/schemas/tabs.json
@@ -97,17 +97,18 @@
           "width": {"type": "integer", "optional": true, "description": "The width of the tab in pixels."},
           "height": {"type": "integer", "optional": true, "description": "The height of the tab in pixels."},
           "hidden": {"type": "boolean", "optional": true, "description": "True if the tab is hidden."},
           "sessionId": {"type": "string", "optional": true, "description": "The session ID used to uniquely identify a Tab obtained from the $(ref:sessions) API."},
           "cookieStoreId": {"type": "string", "optional": true, "description": "The CookieStoreId used for the tab."},
           "isArticle": {"type": "boolean", "optional": true, "description": "Whether the document in the tab can be rendered in reader mode."},
           "isInReaderMode": {"type": "boolean", "optional": true, "description": "Whether the document in the tab is being rendered in reader mode."},
           "sharingState": {"$ref": "SharingState", "optional": true, "description": "Current tab sharing state for screen, microphone and camera."},
-          "attention": {"type": "boolean", "optional": true, "description": "Whether the tab is drawing attention."}
+          "attention": {"type": "boolean", "optional": true, "description": "Whether the tab is drawing attention."},
+          "successorTabId": {"type": "integer", "optional": true, "minimum": -1, "description": "The ID of this tab's successor, if any; $(ref:tabs.TAB_ID_NONE) otherwise."}
         }
       },
       {
         "id": "ZoomSettingsMode",
         "type": "string",
         "description": "Defines how zoom changes are handled, i.e. which entity is responsible for the actual scaling of the page; defaults to <code>automatic</code>.",
         "enum": [
           {
@@ -883,16 +884,22 @@
                 "minimum": 0,
                 "optional": true,
                 "description": "The ID of the tab that opened this tab. If specified, the opener tab must be in the same window as this tab."
               },
               "loadReplace": {
                 "type": "boolean",
                 "optional": true,
                 "description": "Whether the load should replace the current history entry for the tab."
+              },
+              "successorTabId": {
+                "type": "integer",
+                "minimum": -1,
+                "optional": true,
+                "description": "The ID of this tab's successor. If specified, the successor tab must be in the same window as this tab."
               }
             }
           },
           {
             "type": "function",
             "name": "callback",
             "optional": true,
             "parameters": [
@@ -1391,16 +1398,58 @@
             "name": "tabIds",
             "description": "The TAB ID or list of TAB IDs to hide.",
             "choices": [
               {"type": "integer", "minimum": 0},
               {"type": "array", "items": {"type": "integer", "minimum": 0}}
             ]
           }
         ]
+      },
+      {
+        "name": "moveInSuccession",
+        "type": "function",
+        "async": true,
+        "description": "Removes an array of tabs from their lines of succession and prepends or appends them in a chain to another tab.",
+        "parameters": [
+          {
+            "name": "tabIds",
+            "type": "array",
+            "items": { "type": "integer", "minimum": 0 },
+            "minItems": 1,
+            "description": "An array of tab IDs to move in the line of succession. For each tab in the array, the tab's current predecessors will have their successor set to the tab's current successor, and each tab will then be set to be the successor of the previous tab in the array. Any tabs not in the same window as the tab indicated by the second argument (or the first tab in the array, if no second argument) will be skipped."
+          },
+          {
+            "name": "tabId",
+            "type": "integer",
+            "optional": true,
+            "default": -1,
+            "minimum": -1,
+            "description": "The ID of a tab to set as the successor of the last tab in the array, or $(ref:tabs.TAB_ID_NONE) to leave the last tab without a successor. If options.append is true, then this tab is made the predecessor of the first tab in the array instead."
+          },
+          {
+            "name": "options",
+            "type": "object",
+            "optional": true,
+            "properties": {
+              "append": {
+                "type": "boolean",
+                "optional": true,
+                "default": false,
+                "description": "Whether to move the tabs before (false) or after (true) tabId in the succession. Defaults to false."
+              },
+              "insert": {
+                "type": "boolean",
+                "optional": true,
+                "default": false,
+                "description": "Whether to link up the current predecessors or successor (depending on options.append) of tabId to the other side of the chain after it is prepended or appended. If true, one of the following happens: if options.append is false, the first tab in the array is set as the successor of any current predecessors of tabId; if options.append is true, the current successor of tabId is set as the successor of the last tab in the array. Defaults to false."
+              }
+            }
+          }
+        ]
       }
     ],
     "events": [
       {
         "name": "onCreated",
         "type": "function",
         "description": "Fired when a tab is created. Note that the tab's URL may not be set at the time this event fired, but you can listen to onUpdated events to be notified when a URL is set.",
         "parameters": [
@@ -1580,16 +1629,22 @@
             "type": "object",
             "name": "activeInfo",
             "properties": {
               "tabId": {
                 "type": "integer",
                 "minimum": 0,
                 "description": "The ID of the tab that has become active."
               },
+              "previousTabId": {
+                "type": "integer",
+                "minimum": 0,
+                "optional": true,
+                "description": "The ID of the tab that was previously active, if that tab is still open."
+              },
               "windowId": {
                 "type": "integer",
                 "minimum": 0,
                 "description": "The ID of the window the active tab changed inside of."
               }
             }
           }
         ]
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -217,16 +217,17 @@ skip-if = (verify && !debug && (os == 'm
 [browser_ext_tabs_query.js]
 [browser_ext_tabs_readerMode.js]
 [browser_ext_tabs_reload.js]
 [browser_ext_tabs_reload_bypass_cache.js]
 [browser_ext_tabs_saveAsPDF.js]
 skip-if = os == 'mac' # Save as PDF not supported on Mac OS X
 [browser_ext_tabs_sendMessage.js]
 [browser_ext_tabs_sharingState.js]
+[browser_ext_tabs_successors.js]
 [browser_ext_tabs_cookieStoreId.js]
 [browser_ext_tabs_update.js]
 [browser_ext_tabs_update_highlighted.js]
 [browser_ext_tabs_update_url.js]
 [browser_ext_tabs_zoom.js]
 [browser_ext_themes_icons.js]
 [browser_ext_themes_validation.js]
 [browser_ext_url_overrides_newtab.js]
--- a/browser/components/extensions/test/browser/browser_ext_tabs_events.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_events.js
@@ -369,18 +369,19 @@ add_task(async function testTabCreateRel
 
   await extension.awaitMessage("tabRemoved");
   await extension.unload();
 
   BrowserTestUtils.removeTab(openerTab);
 });
 
 add_task(async function testLastTabRemoval() {
+  const CLOSE_WINDOW_PREF = "browser.tabs.closeWindowWithLastTab";
   await SpecialPowers.pushPrefEnv({set: [
-    ["browser.tabs.closeWindowWithLastTab", false],
+    [CLOSE_WINDOW_PREF, false],
   ]});
 
   async function background() {
     let windowId;
     browser.tabs.onCreated.addListener(tab => {
       browser.test.assertEq(windowId, tab.windowId,
                             "expecting onCreated after onRemoved on the same window");
       browser.test.sendMessage("tabCreated", `${tab.width}x${tab.height}`);
@@ -404,9 +405,87 @@ add_task(async function testLastTabRemov
   const expectedDims = `${oldBrowser.clientWidth}x${oldBrowser.clientHeight}`;
   BrowserTestUtils.removeTab(newWin.gBrowser.selectedTab);
 
   const actualDims = await extension.awaitMessage("tabCreated");
   is(actualDims, expectedDims, "created tab reports a size same to the removed last tab");
 
   await extension.unload();
   await BrowserTestUtils.closeWindow(newWin);
+  SpecialPowers.clearUserPref(CLOSE_WINDOW_PREF);
 });
+
+add_task(async function testTabActivationEvent() {
+  async function background() {
+    function makeExpectable() {
+      let expectation = null, resolver = null;
+      const expectable = param => {
+        if (expectation === null) {
+          browser.test.fail("unexpected call to expectable");
+        } else {
+          try {
+            resolver(expectation(param));
+          } catch (e) {
+            resolver(Promise.reject(e));
+          } finally {
+            expectation = null;
+          }
+        }
+      };
+      expectable.expect = e => {
+        expectation = e;
+        return new Promise(r => { resolver = r; });
+      };
+      return expectable;
+    }
+    try {
+      const listener = makeExpectable();
+      browser.tabs.onActivated.addListener(listener);
+
+      const [, {tabs: [tab1]}] = await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(undefined, info.previousTabId, "previousTabId should not be defined when window is first opened");
+        }),
+        browser.windows.create({url: "about:blank"}),
+      ]);
+      const [, tab2] = await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab1.id, info.previousTabId, "Got expected previousTabId");
+        }),
+        browser.tabs.create({url: "about:blank"}),
+      ]);
+
+      await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab1.id, info.tabId, "Got expected tabId");
+          browser.test.assertEq(tab2.id, info.previousTabId, "Got expected previousTabId");
+        }),
+        browser.tabs.update(tab1.id, {active: true}),
+      ]);
+
+      await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab2.id, info.tabId, "Got expected tabId");
+          browser.test.assertEq(undefined, info.previousTabId, "previousTabId should not be defined when previous tab was closed");
+        }),
+        browser.tabs.remove(tab1.id),
+      ]);
+
+      await browser.tabs.remove(tab2.id);
+
+      browser.test.notifyPass("tabs-events");
+    } catch (e) {
+      browser.test.fail(`${e} :: ${e.stack}`);
+      browser.test.notifyFail("tabs-events");
+    }
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+    background,
+  });
+
+  await extension.startup();
+  await extension.awaitFinish("tabs-events");
+  await extension.unload();
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_successors.js
@@ -0,0 +1,212 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+async function background(tabCount, testFn) {
+  try {
+    const {TAB_ID_NONE} = browser.tabs;
+    const tabIds = await Promise.all(Array.from({length: tabCount}, () => browser.tabs.create({url: "about:blank"}).then(t => t.id)));
+
+    const toTabIds = i => tabIds[i];
+
+    const setSuccessors = mapping => Promise.all(mapping.map((succ, i) =>
+      browser.tabs.update(tabIds[i], {successorTabId: tabIds[succ]})));
+
+    const verifySuccessors = async function(mapping, name) {
+      const promises = [], expected = [];
+      for (let i = 0; i < mapping.length; i++) {
+        if (mapping[i] !== undefined) {
+          promises.push(browser.tabs.get(tabIds[i]).then(t => t.successorTabId));
+          expected.push(mapping[i] === TAB_ID_NONE ? TAB_ID_NONE : tabIds[mapping[i]]);
+        }
+      }
+      const results = await Promise.all(promises);
+      for (let i = 0; i < results.length; i++) {
+        browser.test.assertEq(expected[i], results[i], `${name}: successorTabId of tab ${i} in mapping should be ${expected[i]}`);
+      }
+    };
+
+    await testFn({TAB_ID_NONE, tabIds, toTabIds, setSuccessors, verifySuccessors});
+
+    browser.test.notifyPass("background-script");
+  } catch (e) {
+    browser.test.fail(`${e} :: ${e.stack}`);
+    browser.test.notifyFail("background-script");
+  }
+}
+
+async function runTabTest(tabCount, testFn) {
+  const extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+    background: `(${background})(${tabCount}, ${testFn});`,
+  });
+
+  await extension.startup();
+  await extension.awaitFinish("background-script");
+  await extension.unload();
+}
+
+add_task(function testTabSuccessors() {
+  return runTabTest(3, async function({TAB_ID_NONE, tabIds}) {
+    const anotherWindow = await browser.windows.create({url: "about:blank"});
+
+    browser.test.assertEq(TAB_ID_NONE, (await browser.tabs.get(tabIds[0])).successorTabId, "Tabs default to an undefined successor");
+
+    // Basic getting and setting
+
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[1]});
+    browser.test.assertEq(tabIds[1], (await browser.tabs.get(tabIds[0])).successorTabId, "tabs.update assigned the correct successor");
+
+    await browser.tabs.update(tabIds[0], {successorTabId: browser.tabs.TAB_ID_NONE});
+    browser.test.assertEq(TAB_ID_NONE, (await browser.tabs.get(tabIds[0])).successorTabId, "tabs.update cleared successor");
+
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[1]});
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[0]});
+    browser.test.assertEq(TAB_ID_NONE, (await browser.tabs.get(tabIds[0])).successorTabId, "Setting a tab as its own successor clears the successor instead");
+
+    // Validation tests
+
+    await browser.test.assertRejects(
+      browser.tabs.update(tabIds[0], {successorTabId: 1e8}),
+      /Invalid successorTabId/,
+      "tabs.update should throw with an invalid successor tab ID");
+
+    await browser.test.assertRejects(
+      browser.tabs.update(tabIds[0], {successorTabId: anotherWindow.tabs[0].id}),
+      /Successor tab must be in the same window as the tab being updated/,
+      "tabs.update should throw with a successor tab ID from another window");
+
+    // Make sure the successor is truly being assigned
+
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[2], active: true});
+    await browser.tabs.remove(tabIds[0]);
+    browser.test.assertEq(tabIds[2], (await browser.tabs.query({active: true}))[0].id);
+
+
+    return browser.tabs.remove([tabIds[1], tabIds[2], anotherWindow.tabs[0].id]);
+  });
+});
+
+add_task(function testMoveInSuccession_appendFalse() {
+  return runTabTest(8, async function({TAB_ID_NONE, tabIds, toTabIds, setSuccessors, verifySuccessors}) {
+    await browser.tabs.moveInSuccession([1, 0].map(toTabIds), tabIds[0]);
+    await verifySuccessors([TAB_ID_NONE, 0], "scenario 1");
+
+    await browser.tabs.moveInSuccession([0, 1, 2, 3].map(toTabIds), tabIds[0]);
+    await verifySuccessors([1, 2, 3, 0], "scenario 2");
+
+    await browser.tabs.moveInSuccession([1, 0].map(toTabIds), tabIds[0]);
+    await verifySuccessors([TAB_ID_NONE, 0], "scenario 1 after tab 0 has a successor");
+
+    await browser.tabs.update(tabIds[7], {successorTabId: tabIds[0]});
+    await browser.tabs.moveInSuccession([4, 5, 6, 7].map(toTabIds));
+    await verifySuccessors(new Array(4).concat([5, 6, 7, TAB_ID_NONE]), "scenario 4");
+
+    await setSuccessors([7, 2, 3, 4, 3, 6, 7, 5]);
+    await browser.tabs.moveInSuccession([4, 6, 3, 2].map(toTabIds), tabIds[7]);
+    await verifySuccessors([7, TAB_ID_NONE, 7, 2, 6, 7, 3, 5], "scenario 5");
+
+    await setSuccessors([7, 2, 3, 4, 3, 6, 7, 5]);
+    await browser.tabs.moveInSuccession([4, 6, 3, 2].map(toTabIds), tabIds[7], {insert: true});
+    await verifySuccessors([4, TAB_ID_NONE, 7, 2, 6, 4, 3, 5], "insert = true");
+
+    await setSuccessors([1, 2, 3, 4, 0]);
+    await browser.tabs.moveInSuccession([3, 1, 2].map(toTabIds), tabIds[0], {insert: true});
+    await verifySuccessors([4, 2, 0, 1, 3], "insert = true, part 2");
+
+    await browser.tabs.moveInSuccession([tabIds[0], tabIds[1], 1e8, tabIds[2]]);
+    await verifySuccessors([1, 2, TAB_ID_NONE], "unknown tab ID");
+
+    browser.test.assertTrue(await browser.tabs.moveInSuccession([1e8]).then(() => true, () => false), "When all tab IDs are unknown, tabs.moveInSuccession should not throw");
+
+    // Validation tests
+
+    await browser.test.assertRejects(
+      browser.tabs.moveInSuccession([tabIds[0], tabIds[1], tabIds[0]]),
+      /IDs must not occur more than once in tabIds/,
+      "tabs.moveInSuccession should throw when a tab is referenced more than once in tabIds");
+
+    await browser.test.assertRejects(
+      browser.tabs.moveInSuccession([tabIds[0], tabIds[1]], tabIds[0], {insert: true}),
+      /Value of tabId must not occur in tabIds if append or insert is true/,
+      "tabs.moveInSuccession should throw when tabId occurs in tabIds and insert is true");
+
+
+    return browser.tabs.remove(tabIds);
+  });
+});
+
+add_task(function testMoveInSuccession_appendTrue() {
+  return runTabTest(8, async function({TAB_ID_NONE, tabIds, toTabIds, setSuccessors, verifySuccessors}) {
+    await browser.tabs.moveInSuccession([1].map(toTabIds), tabIds[0], {append: true});
+    await verifySuccessors([1, TAB_ID_NONE], "scenario 1");
+
+    await browser.tabs.update(tabIds[3], {successorTabId: tabIds[4]});
+    await browser.tabs.moveInSuccession([1, 2, 3].map(toTabIds), tabIds[0], {append: true});
+    await verifySuccessors([1, 2, 3, TAB_ID_NONE], "scenario 2");
+
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[1]});
+    await browser.tabs.moveInSuccession([1e8], tabIds[0], {append: true});
+    browser.test.assertEq(TAB_ID_NONE, (await browser.tabs.get(tabIds[0])).successorTabId, "If no tabs get appended after the reference tab, it should lose its successor");
+
+    await setSuccessors([7, 2, 3, 4, 3, 6, 7, 5]);
+    await browser.tabs.moveInSuccession([4, 6, 3, 2].map(toTabIds), tabIds[7], {append: true});
+    await verifySuccessors([7, TAB_ID_NONE, TAB_ID_NONE, 2, 6, 7, 3, 4], "scenario 3");
+
+    await setSuccessors([7, 2, 3, 4, 3, 6, 7, 5]);
+    await browser.tabs.moveInSuccession([4, 6, 3, 2].map(toTabIds), tabIds[7], {append: true, insert: true});
+    await verifySuccessors([7, TAB_ID_NONE, 5, 2, 6, 7, 3, 4], "insert = true");
+
+    await browser.tabs.moveInSuccession([0, 4].map(toTabIds), tabIds[7], {append: true, insert: true});
+    await verifySuccessors([4, undefined, undefined, undefined, 6, undefined, undefined, 0], "insert = true, part 2");
+
+    await setSuccessors([1, 2, 3, 4, 0]);
+    await browser.tabs.moveInSuccession([3, 1, 2].map(toTabIds), tabIds[0], {append: true, insert: true});
+    await verifySuccessors([3, 2, 4, 1, 0], "insert = true, part 3");
+
+    await browser.tabs.update(tabIds[0], {successorTabId: tabIds[1]});
+    await browser.tabs.moveInSuccession([1e8], tabIds[0], {append: true, insert: true});
+    browser.test.assertEq(tabIds[1], (await browser.tabs.get(tabIds[0])).successorTabId, "If no tabs get inserted after the reference tab, it should keep its successor");
+
+    // Validation tests
+
+    await browser.test.assertRejects(
+      browser.tabs.moveInSuccession([tabIds[0], tabIds[1]], tabIds[0], {append: true}),
+      /Value of tabId must not occur in tabIds if append or insert is true/,
+      "tabs.moveInSuccession should throw when tabId occurs in tabIds and insert is true");
+
+
+    return browser.tabs.remove(tabIds);
+  });
+});
+
+add_task(function testMoveInSuccession_ignoreTabsInOtherWindows() {
+  return runTabTest(2, async function({TAB_ID_NONE, tabIds, toTabIds, setSuccessors, verifySuccessors}) {
+    const anotherWindow = await browser.windows.create({url: Array.from({length: 3}, () => "about:blank")});
+    tabIds.push(...anotherWindow.tabs.map(t => t.id));
+
+    await setSuccessors([1, 0, 3, 4, 2]);
+    await browser.tabs.moveInSuccession([1, 3, 2].map(toTabIds), tabIds[4]);
+    await verifySuccessors([1, 0, 4, 2, TAB_ID_NONE], "first tab in another window");
+
+    await setSuccessors([1, 0, 3, 4, 2]);
+    await browser.tabs.moveInSuccession([3, 1, 2].map(toTabIds), tabIds[4]);
+    await verifySuccessors([1, 0, 4, 2, TAB_ID_NONE], "middle tab in another window");
+
+    await setSuccessors([1, 0, 3, 4, 2]);
+    await browser.tabs.moveInSuccession([3, 1, 2].map(toTabIds));
+    await verifySuccessors([1, 0, TAB_ID_NONE, 2, TAB_ID_NONE], "using the first tab to determine the window");
+
+    await setSuccessors([1, 0, 3, 4, 2]);
+    await browser.tabs.moveInSuccession([1, 3, 2].map(toTabIds), tabIds[4], {append: true});
+    await verifySuccessors([1, 0, TAB_ID_NONE, 2, 3], "first tab in another window, appending");
+
+    await setSuccessors([1, 0, 3, 4, 2]);
+    await browser.tabs.moveInSuccession([3, 1, 2].map(toTabIds), tabIds[4], {append: true});
+    await verifySuccessors([1, 0, TAB_ID_NONE, 2, 3], "middle tab in another window, appending");
+
+    return browser.tabs.remove(tabIds);
+  });
+});
--- a/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_update_highlighted.js
@@ -75,38 +75,38 @@ add_task(async function test_update_high
       await expectResults(async () => {
         await browser.tabs.update(tab2, {highlighted: false});
         return {active: tab2, highlighted: [tab2], events: []};
       }, "unhighlighting active tab with no multiselection");
 
       await expectResults(async () => {
         await browser.tabs.update(tab1, {highlighted: true});
         return {active: tab1, highlighted: [tab1, tab2], events: [
-          ["onActivated", {tabId: tab1, windowId}],
+          ["onActivated", {tabId: tab1, previousTabId: tab2, windowId}],
           ["onHighlighted", {tabIds: [tab1, tab2], windowId}],
         ]};
       }, "highlighting non-highlighted tab");
 
       await expectResults(async () => {
         await browser.tabs.update(tab2, {highlighted: true});
         return {active: tab1, highlighted: [tab1, tab2], events: []};
       }, "highlighting inactive highlighted tab");
 
       await expectResults(async () => {
         await browser.tabs.update(tab1, {highlighted: false});
         return {active: tab2, highlighted: [tab2], events: [
-          ["onActivated", {tabId: tab2, windowId}],
+          ["onActivated", {tabId: tab2, previousTabId: tab1, windowId}],
           ["onHighlighted", {tabIds: [tab2], windowId}],
         ]};
       }, "unhighlighting active tab with multiselection");
 
       await expectResults(async () => {
         await browser.tabs.update(tab1, {highlighted: true});
         return {active: tab1, highlighted: [tab1, tab2], events: [
-          ["onActivated", {tabId: tab1, windowId}],
+          ["onActivated", {tabId: tab1, previousTabId: tab2, windowId}],
           ["onHighlighted", {tabIds: [tab1, tab2], windowId}],
         ]};
       }, "highlighting non-highlighted tab");
 
       await expectResults(async () => {
         await browser.tabs.update(tab2, {highlighted: false});
         return {active: tab1, highlighted: [tab1], events: [
           ["onHighlighted", {tabIds: [tab1], windowId}],
@@ -118,25 +118,25 @@ add_task(async function test_update_high
         return {active: tab1, highlighted: [tab1, tab2], events: [
           ["onHighlighted", {tabIds: [tab1, tab2], windowId}],
         ]};
       }, "highlighting without activating non-highlighted tab");
 
       await expectResults(async () => {
         await browser.tabs.update(tab2, {highlighted: true, active: true});
         return {active: tab2, highlighted: [tab2], events: [
-          ["onActivated", {tabId: tab2, windowId}],
+          ["onActivated", {tabId: tab2, previousTabId: tab1, windowId}],
           ["onHighlighted", {tabIds: [tab2], windowId}],
         ]};
       }, "highlighting and activating inactive highlighted tab");
 
       await expectResults(async () => {
         await browser.tabs.update(tab1, {active: true, highlighted: true});
         return {active: tab1, highlighted: [tab1], events: [
-          ["onActivated", {tabId: tab1, windowId}],
+          ["onActivated", {tabId: tab1, previousTabId: tab2, windowId}],
           ["onHighlighted", {tabIds: [tab1], windowId}],
         ]};
       }, "highlighting and activating non-highlighted tab");
 
       await browser.tabs.remove([tab1, tab2]);
       browser.test.notifyPass("test-finished");
     },
   });
--- a/browser/components/extensions/test/mochitest/test_ext_all_apis.html
+++ b/browser/components/extensions/test/mochitest/test_ext_all_apis.html
@@ -31,16 +31,17 @@ let expectedBackgroundApisTargetSpecific
   "tabs.executeScript",
   "tabs.get",
   "tabs.getCurrent",
   "tabs.getZoom",
   "tabs.getZoomSettings",
   "tabs.highlight",
   "tabs.insertCSS",
   "tabs.move",
+  "tabs.moveInSuccession",
   "tabs.onActivated",
   "tabs.onAttached",
   "tabs.onCreated",
   "tabs.onDetached",
   "tabs.onHighlighted",
   "tabs.onMoved",
   "tabs.onRemoved",
   "tabs.onReplaced",
--- a/browser/modules/ExtensionsUI.jsm
+++ b/browser/modules/ExtensionsUI.jsm
@@ -360,17 +360,17 @@ var ExtensionsUI = {
     return promise;
   },
 
   showDefaultSearchPrompt(target, strings, icon) {
     return new Promise(resolve => {
       let popupOptions = {
         hideClose: true,
         popupIconURL: icon || DEFAULT_EXTENSION_ICON,
-        persistent: false,
+        persistent: true,
         removeOnDismissal: true,
         eventCallback(topic) {
           if (topic == "removed") {
             resolve(false);
           }
         },
         name: strings.addonName,
       };
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -282,16 +282,29 @@ nsDOMWindowUtils::GetWebRenderBridge()
         return wrlm->WrBridge();
       }
     }
   }
   return nullptr;
 }
 
 NS_IMETHODIMP
+nsDOMWindowUtils::SyncFlushCompositor()
+{
+  if (nsIWidget* widget = GetWidget()) {
+    if (LayerManager* lm = widget->GetLayerManager()) {
+      if (KnowsCompositor* kc = lm->AsKnowsCompositor()) {
+        kc->SyncWithCompositor();
+      }
+    }
+  }
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 nsDOMWindowUtils::GetImageAnimationMode(uint16_t *aMode)
 {
   NS_ENSURE_ARG_POINTER(aMode);
   *aMode = 0;
   nsPresContext* presContext = GetPresContext();
   if (presContext) {
     *aMode = presContext->ImageAnimationMode();
     return NS_OK;
--- a/dom/canvas/WebGL2ContextFramebuffers.cpp
+++ b/dom/canvas/WebGL2ContextFramebuffers.cpp
@@ -234,20 +234,16 @@ WebGLContext::ValidateInvalidateFramebuf
             }
             *out_glNumAttachments = scopedVector->size();
             *out_glAttachments = scopedVector->data();
         }
     }
 
     ////
 
-    if (!fb) {
-        mDefaultFB_IsInvalid = true;
-        mResolvedDefaultFB = nullptr;
-    }
     return true;
 }
 
 void
 WebGL2Context::InvalidateFramebuffer(GLenum target,
                                      const dom::Sequence<GLenum>& attachments,
                                      ErrorResult& rv)
 {
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl
+++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
@@ -1989,16 +1989,18 @@ interface nsIDOMWindowUtils : nsISupport
   const long MOUSE_BUTTONS_5TH_BUTTON = 0x10;
   // Buttons are not specified, will be calculated from |aButton|.
   const long MOUSE_BUTTONS_NOT_SPECIFIED = -1;
 
   // Return values for getDirectionFromText().
   const long DIRECTION_LTR = 0;
   const long DIRECTION_RTL = 1;
   const long DIRECTION_NOT_SET = 2;
+
+  void syncFlushCompositor();
 };
 
 [scriptable, uuid(c694e359-7227-4392-a138-33c0cc1f15a6)]
 interface nsITranslationNodeList : nsISupports {
   readonly attribute unsigned long length;
   Node item(in unsigned long index);
 
   // A translation root is a block element, or an inline element
--- a/gfx/webrender_bindings/Cargo.toml
+++ b/gfx/webrender_bindings/Cargo.toml
@@ -4,17 +4,17 @@ version = "0.1.0"
 authors = ["The Mozilla Project Developers"]
 license = "MPL-2.0"
 
 [dependencies]
 rayon = "1"
 thread_profiler = "0.1.1"
 euclid = { version = "0.19.3", features = ["serde"] }
 app_units = "0.7"
-gleam = "0.6.3"
+gleam = "0.6.8"
 log = "0.4"
 nsstring = { path = "../../servo/support/gecko/nsstring" }
 bincode = "1.0"
 uuid = { version = "0.6", features = ["v4"] }
 fxhash = "0.2.1"
 
 [dependencies.webrender]
 path = "../wr/webrender"
--- a/gfx/webrender_bindings/revision.txt
+++ b/gfx/webrender_bindings/revision.txt
@@ -1,1 +1,1 @@
-195582a8dc5b9c6d26d54ce8d70060ccc8f423d8
+586af96c22c8b05722534e98703bfb47f1d270a1
--- a/gfx/wr/Cargo.lock
+++ b/gfx/wr/Cargo.lock
@@ -113,17 +113,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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.42 (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 = [
@@ -303,17 +303,17 @@ dependencies = [
  "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "direct-composition"
 version = "0.1.0"
 dependencies = [
  "euclid 0.19.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozangle 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.57.2",
  "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "winit 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "dlib"
@@ -467,21 +467,31 @@ version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 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.6.3"
+name = "gl_generator"
+version = "0.10.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)",
+ "khronos_api 3.0.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.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "glutin"
 version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -604,16 +614,21 @@ dependencies = [
 ]
 
 [[package]]
 name = "khronos_api"
 version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "khronos_api"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "lazy_static"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1468,17 +1483,17 @@ dependencies = [
  "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.6.1 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.20.1 (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)",
  "mozangle 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "pathfinder_font_renderer 0.5.0 (git+https://github.com/pcwalton/pathfinder?branch=webrender)",
  "pathfinder_gfx_utils 0.2.0 (git+https://github.com/pcwalton/pathfinder?branch=webrender)",
  "pathfinder_partitioner 0.2.0 (git+https://github.com/pcwalton/pathfinder?branch=webrender)",
@@ -1498,17 +1513,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)",
  "env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.19.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "glutin 0.17.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.57.2",
  "winit 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender_api"
@@ -1598,17 +1613,17 @@ dependencies = [
  "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.6.1 (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.19.3 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "glutin 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.20.1 (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)",
  "mozangle 0.1.6 (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)",
@@ -1660,16 +1675,21 @@ dependencies = [
 name = "xml-rs"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "xml-rs"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "yaml-rust"
 version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "yaml-rust"
 version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1728,31 +1748,33 @@ dependencies = [
 "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
 "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 "checksum freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b659e75b7a7338fe75afd7f909fc2b71937845cffb6ebe54ba2e50f13d8e903d"
 "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 gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c"
+"checksum gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0ffaf173cf76c73a73e080366bf556b4776ece104b06961766ff11449f38604"
 "checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
-"checksum gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2260952cc0393ca6f183e1a91a035c65c85ddb02505f3d53e5a775eb05946f44"
+"checksum gleam 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4b47f5b15742aee359c7895ab98cf2cceecc89bb4feb6f4e42f802d7899877da"
 "checksum glutin 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a70c5fe78efbd5a3b243a804ea1032053c584510f8822819f94cfb29b2100317"
 "checksum half 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d5c5f71a723d10dfc58927cbed37c3071a50afc7f073d86fd7d3e5727db890f"
 "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"
 "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
 "checksum image 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44665b4395d1844c96e7dc8ed5754782a1cdfd9ef458a80bbe45702681450504"
 "checksum inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ec18d981200fd14e65ee8e35fb60ed1ce55227a02407303f3a72517c6146dcc"
 "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
 "checksum ipc-channel 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd75debad4ffd295c00c6e3634d254df30050b0837a85e5cd039ac424365f24a"
 "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
 "checksum jpeg-decoder 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0dfe27a6c0dabd772d0f9b9f8701c4ca12c4d1eebcadf2be1f6f70396f6a1434"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
 "checksum khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554"
+"checksum khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49"
 "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
 "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
 "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef"
 "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1"
 "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
 "checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd"
 "checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54"
 "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
@@ -1855,10 +1877,11 @@ dependencies = [
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767"
 "checksum winit 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec43db5991cc509f5b0c68cb0a0d3614f697c888999990a186a2e895c7f723c0"
 "checksum ws 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "89c48c53bf9dee34411a08993c10b879c36e105d609b46e25673befe3a5c1320"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum x11-dl 2.17.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3235540540fde1ae074c8df49054166c0e070407f1c6e1ee17b8c87c2c7bcc7d"
 "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2"
+"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
 "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992"
 "checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e"
--- a/gfx/wr/servo-tidy.toml
+++ b/gfx/wr/servo-tidy.toml
@@ -3,22 +3,25 @@ skip-check-length = false
 skip-check-licenses = false
 check-alphabetical-order = false
 
 [ignore]
 # Ignored packages with duplicated versions
 packages = [
     "crossbeam-epoch",
     "crossbeam-utils",
+    "gl_generator",
+    "khronos_api",
     "lazy_static",
     "log",
     "rand",
     "winapi",
     "core-graphics",
     "core-text",
+    "xml-rs",
     "yaml-rust",
 ]
 
 # Files that are ignored for all tidy and lint checks.
 files = [
     "./wrench/src/egl.rs",  # Copied from glutin
 ]
 
--- a/gfx/wr/webrender/Cargo.toml
+++ b/gfx/wr/webrender/Cargo.toml
@@ -21,17 +21,17 @@ serialize_program = ["serde"]
 [dependencies]
 app_units = "0.7"
 base64 = { optional = true, version = "0.9" }
 bincode = "1.0"
 bitflags = "1.0"
 byteorder = "1.0"
 cfg-if = "0.1.2"
 fxhash = "0.2.1"
-gleam = "0.6.3"
+gleam = "0.6.8"
 image = { optional = true, version = "0.20" }
 lazy_static = "1"
 log = "0.4"
 num-traits = "0.2"
 plane-split = "0.13.3"
 png = { optional = true, version = "0.12" }
 rayon = "1"
 ron = { optional = true, version = "0.1.7" }
--- a/gfx/wr/webrender/src/device/gl.rs
+++ b/gfx/wr/webrender/src/device/gl.rs
@@ -852,16 +852,19 @@ pub struct Device {
 
     /// When to use glTexStorage*. We prefer this over glTexImage* because it
     /// guarantees that mipmaps won't be generated (which they otherwise are on
     /// some drivers, particularly ANGLE). However, it is not always supported
     /// at all, or for BGRA8 format. If it's not supported for the required
     /// format, we fall back to glTexImage*.
     texture_storage_usage: TexStorageUsage,
 
+    /// Whether the function glCopyImageSubData is available.
+    supports_copy_image_sub_data: bool,
+
     // GL extensions
     extensions: Vec<String>,
 }
 
 /// Contains the parameters necessary to bind a draw target.
 #[derive(Clone, Copy)]
 pub enum DrawTarget<'a> {
     /// Use the device's default draw target, with the provided dimensions,
@@ -1019,16 +1022,19 @@ impl Device {
                 if supports_texture_storage {
                     TexStorageUsage::Always
                 } else {
                     TexStorageUsage::Never
                 },
             )
         };
 
+        let supports_copy_image_sub_data = supports_extension(&extensions, "GL_EXT_copy_image") ||
+            supports_extension(&extensions, "GL_ARB_copy_image");
+
         // Explicitly set some global states to the values we expect.
         gl.disable(gl::FRAMEBUFFER_SRGB);
         gl.disable(gl::MULTISAMPLE);
         gl.disable(gl::POLYGON_SMOOTH);
 
         Device {
             gl,
             resource_override_path,
@@ -1061,16 +1067,17 @@ impl Device {
 
             max_texture_size,
             max_texture_layers,
             renderer_name,
             cached_programs,
             frame_id: GpuFrameId(0),
             extensions,
             texture_storage_usage,
+            supports_copy_image_sub_data
         }
     }
 
     pub fn gl(&self) -> &gl::Gl {
         &*self.gl
     }
 
     pub fn rc_gl(&self) -> &Rc<gl::Gl> {
@@ -1616,25 +1623,37 @@ impl Device {
         dst: &mut Texture,
         src: &Texture,
     ) {
         debug_assert!(self.inside_frame);
         debug_assert!(dst.size.width >= src.size.width);
         debug_assert!(dst.size.height >= src.size.height);
         debug_assert!(dst.layer_count >= src.layer_count);
 
-        // Note that zip() truncates to the shorter of the two iterators.
-        let rect = DeviceIntRect::new(DeviceIntPoint::zero(), src.get_dimensions().to_i32());
-        for (read_fbo, draw_fbo) in src.fbos.iter().zip(&dst.fbos) {
-            self.bind_read_target_impl(*read_fbo);
-            self.bind_draw_target_impl(*draw_fbo);
-            self.blit_render_target(rect, rect);
+        if self.supports_copy_image_sub_data {
+            assert_ne!(src.id, dst.id,
+                    "glCopyImageSubData's behaviour is undefined if src and dst images are identical and the rectangles overlap.");
+            unsafe {
+                self.gl.copy_image_sub_data(src.id, src.target, 0,
+                                            0, 0, 0,
+                                            dst.id, dst.target, 0,
+                                            0, 0, 0,
+                                            src.size.width as _, src.size.height as _, src.layer_count);
+            }
+        } else {
+            // Note that zip() truncates to the shorter of the two iterators.
+            let rect = DeviceIntRect::new(DeviceIntPoint::zero(), src.get_dimensions().to_i32());
+            for (read_fbo, draw_fbo) in src.fbos.iter().zip(&dst.fbos) {
+                self.bind_read_target_impl(*read_fbo);
+                self.bind_draw_target_impl(*draw_fbo);
+                self.blit_render_target(rect, rect);
+            }
+            self.reset_draw_target();
+            self.reset_read_target();
         }
-        self.reset_draw_target();
-        self.reset_read_target();
     }
 
     /// Notifies the device that the contents of a render target are no longer
     /// needed.
     ///
     /// FIXME(bholley): We could/should invalidate the depth targets earlier
     /// than the color targets, i.e. immediately after each pass.
     pub fn invalidate_render_target(&mut self, texture: &Texture) {
--- a/layout/tools/reftest/reftest-content.js
+++ b/layout/tools/reftest/reftest-content.js
@@ -688,19 +688,17 @@ function WaitForTestEnd(contentRootEleme
             var flushWaiter = function(aSubject, aTopic, aData) {
                 if (aTopic) LogInfo("MakeProgress: apz-repaints-flushed fired");
                 os.removeObserver(flushWaiter, "apz-repaints-flushed");
                 state = STATE_WAITING_TO_FINISH;
                 MakeProgress();
             };
             os.addObserver(flushWaiter, "apz-repaints-flushed");
 
-            var willSnapshot = (gCurrentTestType != TYPE_SCRIPT) &&
-                               (gCurrentTestType != TYPE_LOAD) &&
-                               (gCurrentTestType != TYPE_PRINT);
+            var willSnapshot = IsSnapshottableTestType();
             var noFlush =
                 !(contentRootElement &&
                   contentRootElement.classList.contains("reftest-no-flush"));
             if (noFlush && willSnapshot && windowUtils().flushApzRepaints()) {
                 LogInfo("MakeProgress: done requesting APZ flush");
             } else {
                 LogInfo("MakeProgress: APZ flush not required");
                 flushWaiter(null, null, null);
@@ -749,16 +747,27 @@ function WaitForTestEnd(contentRootEleme
                 for (var i = 0; i < elements.length; ++i) {
                     if (!windowUtils().checkAndClearDisplayListState(elements[i])) {
                         SendFailedDisplayList();
                     }
                 }
               }
               CheckLayerAssertions(contentRootElement);
             }
+
+            if (!IsSnapshottableTestType()) {
+              // If we're not snapshotting the test, at least do a sync round-trip
+              // to the compositor to ensure that all the rendering messages
+              // related to this test get processed. Otherwise problems triggered
+              // by this test may only manifest as failures in a later test.
+              LogInfo("MakeProgress: Doing sync flush to compositor");
+              gFailureReason = "timed out while waiting for sync compositor flush"
+              windowUtils().syncFlushCompositor();
+            }
+
             LogInfo("MakeProgress: Completed");
             state = STATE_COMPLETED;
             gFailureReason = "timed out while taking snapshot (bug in harness?)";
             RemoveListeners();
             CheckForProcessCrashExpectation();
             setTimeout(RecordResult, 0);
             return;
         }
@@ -1089,24 +1098,29 @@ function LogInfo(str)
 {
     if (gVerbose) {
         sendSyncMessage("reftest:Log", { type: "info", msg: str });
     } else {
         sendAsyncMessage("reftest:Log", { type: "info", msg: str });
     }
 }
 
+function IsSnapshottableTestType()
+{
+    // Script, load-only, and PDF-print tests do not need any snapshotting.
+    return !(gCurrentTestType == TYPE_SCRIPT ||
+             gCurrentTestType == TYPE_LOAD ||
+             gCurrentTestType == TYPE_PRINT);
+}
+
 const SYNC_DEFAULT = 0x0;
 const SYNC_ALLOW_DISABLE = 0x1;
 function SynchronizeForSnapshot(flags)
 {
-    if (gCurrentTestType == TYPE_SCRIPT ||
-        gCurrentTestType == TYPE_LOAD ||
-        gCurrentTestType == TYPE_PRINT) {
-        // Script, load-only, and PDF-print tests do not need any snapshotting.
+    if (!IsSnapshottableTestType()) {
         return;
     }
 
     if (flags & SYNC_ALLOW_DISABLE) {
         var docElt = content.document.documentElement;
         if (docElt &&
             (docElt.hasAttribute("reftest-no-sync-layers") ||
              docElt.classList.contains("reftest-no-flush"))) {
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -894,19 +894,19 @@ public abstract class GeckoApp extends G
                     .message(R.string.fullscreen_warning)
                     .duration(Snackbar.LENGTH_LONG).buildAndShow();
         }
         ThreadUtils.assertOnUiThread();
         ActivityUtils.setFullScreen(this, fullScreen);
     }
 
     @Override
-    public void onContextMenu(final GeckoSession session, final int screenX,
-                              final int screenY, final String uri,
-                              int elementType, final String elementSrc) {
+    public void onContextMenu(final GeckoSession session,
+                              final int screenX, final int screenY,
+                              final GeckoSession.ContentDelegate.ContextElement element) {
     }
 
     @Override
     public void onExternalResponse(final GeckoSession session, final GeckoSession.WebResponseInfo request) {
         // Won't happen, as we don't use the GeckoView download support in Fennec
     }
 
     @Override
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -338,18 +338,21 @@ public class Tabs implements BundleEvent
         notifyListeners(tab, TabEvents.SELECTED);
 
         if (oldTab != null) {
             mPreviouslySelectedTabId = oldTab.getId();
             notifyListeners(oldTab, TabEvents.UNSELECTED);
         }
 
         // Pass a message to Gecko to update tab state in BrowserApp.
-        final GeckoBundle data = new GeckoBundle(1);
+        final GeckoBundle data = new GeckoBundle(2);
         data.putInt("id", tab.getId());
+        if (oldTab != null && mTabs.containsKey(oldTab.getId())) {
+            data.putInt("previousTabId", oldTab.getId());
+        }
         mEventDispatcher.dispatch("Tab:Selected", data);
         EventDispatcher.getInstance().dispatch("Tab:Selected", data);
         return tab;
     }
 
     public synchronized boolean selectLastTab() {
         if (mOrder.isEmpty()) {
             return false;
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -690,21 +690,22 @@ public class CustomTabsActivity extends 
         if (fullScreen) {
             getSupportActionBar().hide();
         } else {
             getSupportActionBar().show();
         }
     }
 
     @Override
-    public void onContextMenu(GeckoSession session, int screenX, int screenY,
-                              final String uri, int elementType,
-                              final String elementSrc) {
-
-        final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
+    public void onContextMenu(final GeckoSession session,
+                              int screenX, int screenY,
+                              final ContextElement element) {
+        final String content = element.linkUri != null
+                               ? element.linkUri
+                               : element.srcUri != null ? element.srcUri : "";
         final Uri validUri = WebApps.getValidURL(content);
         if (validUri == null) {
             return;
         }
 
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
--- a/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
@@ -347,19 +347,22 @@ public class WebAppActivity extends AppC
     }
 
     @Override // GeckoSession.ContentDelegate
     public void onCloseRequest(GeckoSession session) {
         // Ignore
     }
 
     @Override // GeckoSession.ContentDelegate
-    public void onContextMenu(GeckoSession session, int screenX, int screenY,
-                              String uri, int elementType, String elementSrc) {
-        final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
+    public void onContextMenu(final GeckoSession session,
+                              int screenX, int screenY,
+                              final ContextElement element) {
+        final String content = element.linkUri != null
+                               ? element.linkUri
+                               : element.srcUri != null ? element.srcUri : "";
         final Uri validUri = WebApps.getValidURL(content);
         if (validUri == null) {
             return;
         }
 
         WebApps.openInFennec(validUri, WebAppActivity.this);
     }
 
--- a/mobile/android/chrome/geckoview/GeckoViewContentChild.js
+++ b/mobile/android/chrome/geckoview/GeckoViewContentChild.js
@@ -252,41 +252,47 @@ class GeckoViewContentChild extends Geck
   }
 
   // eslint-disable-next-line complexity
   handleEvent(aEvent) {
     debug `handleEvent: ${aEvent.type}`;
 
     switch (aEvent.type) {
       case "contextmenu":
-        function nearestParentHref(node) {
-          while (node && !node.href) {
-            node = node.parentNode;
+        function nearestParentAttribute(aNode, aAttribute) {
+          while (aNode && aNode.hasAttribute &&
+                 !aNode.hasAttribute(aAttribute)) {
+            aNode = aNode.parentNode;
           }
-          return node && node.href;
+          return aNode && aNode.getAttribute && aNode.getAttribute(aAttribute);
         }
 
         const node = aEvent.composedTarget;
-        const hrefNode = nearestParentHref(node);
+        const uri = nearestParentAttribute(node, "href");
+        const title = nearestParentAttribute(node, "title");
+        const alt = nearestParentAttribute(node, "alt");
         const elementType = ChromeUtils.getClassName(node);
         const isImage = elementType === "HTMLImageElement";
         const isMedia = elementType === "HTMLVideoElement" ||
                         elementType === "HTMLAudioElement";
+        const elementSrc = (isImage || isMedia) && (node.currentSrc || node.src);
 
-        if (hrefNode || isImage || isMedia) {
-          this.eventDispatcher.sendRequest({
+        if (uri || isImage || isMedia) {
+          const msg = {
             type: "GeckoView:ContextMenu",
             screenX: aEvent.screenX,
             screenY: aEvent.screenY,
-            uri: hrefNode,
+            uri,
+            title,
+            alt,
             elementType,
-            elementSrc: (isImage || isMedia)
-                        ? node.currentSrc || node.src
-                        : null,
-          });
+            elementSrc: elementSrc || null,
+          };
+
+          this.eventDispatcher.sendRequest(msg);
           aEvent.preventDefault();
         }
         break;
       case "DOMFormHasPassword":
         this._autoFill.addElement(
             FormLikeFactory.createFromForm(aEvent.composedTarget));
         break;
       case "DOMInputPasswordAdded": {
--- a/mobile/android/components/extensions/ext-tabs.js
+++ b/mobile/android/components/extensions/ext-tabs.js
@@ -91,17 +91,21 @@ this.tabs = class extends ExtensionAPI {
       return tab;
     }
 
     let self = {
       tabs: {
         onActivated: makeGlobalEvent(context, "tabs.onActivated", "Tab:Selected", (fire, data) => {
           let tab = tabManager.get(data.id);
 
-          fire.async({tabId: tab.id, windowId: tab.windowId});
+          fire.async({
+            tabId: tab.id,
+            previousTabId: data.previousTabId,
+            windowId: tab.windowId,
+          });
         }),
 
         onCreated: new EventManager({
           context,
           name: "tabs.onCreated",
           register: fire => {
             let listener = (eventName, event) => {
               fire.async(tabManager.convert(event.nativeTab));
@@ -327,17 +331,17 @@ this.tabs = class extends ExtensionAPI {
 
           if (updateProperties.active !== null) {
             if (updateProperties.active) {
               BrowserApp.selectTab(nativeTab);
             } else {
               // Not sure what to do here? Which tab should we select?
             }
           }
-          // FIXME: highlighted/selected, muted, pinned, openerTabId
+          // FIXME: highlighted/selected, muted, pinned, openerTabId, successorTabId
 
           return tabManager.convert(nativeTab);
         },
 
         async reload(tabId, reloadProperties) {
           let nativeTab = getTabOrActive(tabId);
 
           let flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
--- a/mobile/android/components/extensions/ext-utils.js
+++ b/mobile/android/components/extensions/ext-utils.js
@@ -545,16 +545,20 @@ class Tab extends TabBase {
 
   get status() {
     if (this.browser.webProgress.isLoadingDocument) {
       return "loading";
     }
     return "complete";
   }
 
+  get successorTabId() {
+    return -1;
+  }
+
   get width() {
     return this.browser.clientWidth;
   }
 
   get window() {
     return this.browser.ownerGlobal;
   }
 
--- a/mobile/android/components/extensions/schemas/tabs.json
+++ b/mobile/android/components/extensions/schemas/tabs.json
@@ -96,17 +96,18 @@
           "width": {"type": "integer", "optional": true, "description": "The width of the tab in pixels."},
           "height": {"type": "integer", "optional": true, "description": "The height of the tab in pixels."},
           "hidden": {"type": "boolean", "optional": true, "description": "True if the tab is hidden."},
           "sessionId": {"type": "string", "optional": true, "description": "The session ID used to uniquely identify a Tab obtained from the $(ref:sessions) API."},
           "cookieStoreId": {"type": "string", "optional": true, "description": "The CookieStoreId used for the tab."},
           "isArticle": {"type": "boolean", "optional": true, "description": "Whether the document in the tab can be rendered in reader mode."},
           "isInReaderMode": {"type": "boolean", "optional": true, "description": "Whether the document in the tab is being rendered in reader mode."},
           "sharingState": {"$ref": "SharingState", "optional": true, "description": "Current tab sharing state for screen, microphone and camera."},
-          "attention": {"type": "boolean", "optional": true, "description": "Whether the tab is drawing attention."}
+          "attention": {"type": "boolean", "optional": true, "description": "Whether the tab is drawing attention."},
+          "successorTabId": {"type": "integer", "optional": true, "minimum": -1, "description": "The ID of this tab's successor, if any; $(ref:tabs.TAB_ID_NONE) otherwise."}
         }
       },
       {
         "id": "ZoomSettingsMode",
         "type": "string",
         "description": "Defines how zoom changes are handled, i.e. which entity is responsible for the actual scaling of the page; defaults to <code>automatic</code>.",
         "enum": [
           {
@@ -1204,16 +1205,22 @@
             "type": "object",
             "name": "activeInfo",
             "properties": {
               "tabId": {
                 "type": "integer",
                 "minimum": 0,
                 "description": "The ID of the tab that has become active."
               },
+              "previousTabId": {
+                "type": "integer",
+                "minimum": 0,
+                "optional": true,
+                "description": "The ID of the tab that was previously active, if that tab is still open."
+              },
               "windowId": {
                 "type": "integer",
                 "minimum": 0,
                 "description": "The ID of the window the active tab changed inside of."
               }
             }
           }
         ]
--- a/mobile/android/components/extensions/test/mochitest/test_ext_tabs_events.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_tabs_events.html
@@ -145,12 +145,92 @@ add_task(async function testTabRemovalEv
 
     background,
   });
 
   await extension.startup();
   await extension.awaitFinish("tabs-events");
   await extension.unload();
 });
+
+add_task(async function testTabActivationEvent() {
+  async function background() {
+    function makeExpectable() {
+      let expectation = null, resolver = null;
+      const expectable = param => {
+        if (expectation === null) {
+          browser.test.fail("unexpected call to expectable");
+        } else {
+          try {
+            resolver(expectation(param));
+          } catch (e) {
+            resolver(Promise.reject(e));
+          } finally {
+            expectation = null;
+          }
+        }
+      };
+      expectable.expect = e => {
+        expectation = e;
+        return new Promise(r => { resolver = r; });
+      };
+      return expectable;
+    }
+    try {
+      const listener = makeExpectable();
+      browser.tabs.onActivated.addListener(listener);
+
+      const [tab0] = await browser.tabs.query({active: true});
+      const [, tab1] = await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab0.id, info.previousTabId, "Got expected previousTabId");
+        }),
+        browser.tabs.create({url: "about:blank"}),
+      ]);
+      const [, tab2] = await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab1.id, info.previousTabId, "Got expected previousTabId");
+        }),
+        browser.tabs.create({url: "about:blank"}),
+      ]);
+
+      await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab1.id, info.tabId, "Got expected tabId");
+          browser.test.assertEq(tab2.id, info.previousTabId, "Got expected previousTabId");
+        }),
+        browser.tabs.update(tab1.id, {active: true}),
+      ]);
+
+      await Promise.all([
+        listener.expect(info => {
+          browser.test.assertEq(tab2.id, info.tabId, "Got expected tabId");
+          browser.test.assertEq(undefined, info.previousTabId, "previousTabId should not be defined when previous tab was closed");
+        }),
+        browser.tabs.remove(tab1.id),
+      ]);
+
+      browser.tabs.onActivated.removeListener(listener);
+      await browser.tabs.remove(tab2.id);
+
+      browser.test.notifyPass("tabs-events");
+    } catch (e) {
+      browser.test.fail(`${e} :: ${e.stack}`);
+      browser.test.notifyFail("tabs-events");
+    }
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+
+    background,
+  });
+
+  await extension.startup();
+  await extension.awaitFinish("tabs-events");
+  await extension.unload();
+});
 </script>
 
 </body>
 </html>
--- a/mobile/android/geckoview/CHANGELOG.md
+++ b/mobile/android/geckoview/CHANGELOG.md
@@ -16,10 +16,13 @@
   history storage system and provide visited link status.
 - Added `ContentDelegate#onFirstComposite` to get first composite callback
   after a compositor start.
 - Changed `LoadRequest.isUserTriggered` to `isRedirect`.
 - Added `GeckoSession.LOAD_FLAGS_BYPASS_CLASSIFIER` to bypass the URI
   classifier.
 - Added a `protected` empty constructor to all field-only classes so that apps
   can mock these classes in tests.
+- Added `ContentDelegate.ContextElement` to extend the information passed to
+  `ContentDelegate#onContextMenu`. Extended information includes the element's
+  title and alt attributes.
 
-[api-version]: 723adca536354bfa81afb83da5045ea6de8aa602
+[api-version]: 8cfd04a09e7a242b3da22ccdd55c88a2aca2ba6d
--- a/mobile/android/geckoview/api.txt
+++ b/mobile/android/geckoview/api.txt
@@ -317,30 +317,32 @@ package org.mozilla.geckoview {
     field public static final int LOAD_FLAGS_EXTERNAL = 4;
     field public static final int LOAD_FLAGS_NONE = 0;
     field protected final org.mozilla.geckoview.GeckoSession.Compositor mCompositor;
     field protected org.mozilla.geckoview.GeckoSession.Window mWindow;
   }
 
   public static interface GeckoSession.ContentDelegate {
     method public void onCloseRequest(org.mozilla.geckoview.GeckoSession);
-    method public void onContextMenu(org.mozilla.geckoview.GeckoSession, int, int, java.lang.String, int, java.lang.String);
+    method public void onContextMenu(org.mozilla.geckoview.GeckoSession, int, int, org.mozilla.geckoview.GeckoSession.ContentDelegate.ContextElement);
     method public void onCrash(org.mozilla.geckoview.GeckoSession);
     method public void onExternalResponse(org.mozilla.geckoview.GeckoSession, org.mozilla.geckoview.GeckoSession.WebResponseInfo);
     method public void onFirstComposite(org.mozilla.geckoview.GeckoSession);
     method public void onFocusRequest(org.mozilla.geckoview.GeckoSession);
     method public void onFullScreen(org.mozilla.geckoview.GeckoSession, boolean);
     method public void onTitleChange(org.mozilla.geckoview.GeckoSession, java.lang.String);
-    field public static final int ELEMENT_TYPE_AUDIO = 3;
-    field public static final int ELEMENT_TYPE_IMAGE = 1;
-    field public static final int ELEMENT_TYPE_NONE = 0;
-    field public static final int ELEMENT_TYPE_VIDEO = 2;
   }
 
-  public static interface GeckoSession.ContentDelegate.ElementType implements java.lang.annotation.Annotation {
+  public static final class GeckoSession.ContentDelegate.ContextElement {
+    ctor protected ContextElement(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    field public final java.lang.String altText;
+    field public final java.lang.String linkUri;
+    field public final java.lang.String srcUri;
+    field public final java.lang.String title;
+    field public final int type;
   }
 
   public static final class GeckoSession.FinderResult {
     ctor protected FinderResult();
     field public final android.graphics.RectF clientRect;
     field public final int current;
     field public final int flags;
     field public final boolean found;
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestRunnerActivity.java
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestRunnerActivity.java
@@ -89,17 +89,18 @@ public class TestRunnerActivity extends 
         }
 
         @Override
         public void onFullScreen(GeckoSession session, boolean fullScreen) {
 
         }
 
         @Override
-        public void onContextMenu(GeckoSession session, int screenX, int screenY, String uri, int elementType, String elementSrc) {
+        public void onContextMenu(GeckoSession session, int screenX, int screenY,
+                                  ContextElement element) {
 
         }
 
         @Override
         public void onExternalResponse(GeckoSession session, GeckoSession.WebResponseInfo request) {
         }
 
         @Override
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/Callbacks.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/Callbacks.kt
@@ -4,16 +4,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.geckoview.test.util
 
 import org.mozilla.geckoview.AllowOrDeny
 import org.mozilla.geckoview.GeckoResponse
 import org.mozilla.geckoview.GeckoResult
 import org.mozilla.geckoview.GeckoSession
+import org.mozilla.geckoview.GeckoSession.ContentDelegate.ContextElement
 import org.mozilla.geckoview.GeckoSession.NavigationDelegate.LoadRequest
 import org.mozilla.geckoview.MediaElement
 import org.mozilla.geckoview.WebRequestError
 
 import android.view.inputmethod.CursorAnchorInfo
 import android.view.inputmethod.ExtractedText
 import android.view.inputmethod.ExtractedTextRequest
 
@@ -33,17 +34,19 @@ class Callbacks private constructor() {
         }
 
         override fun onCloseRequest(session: GeckoSession) {
         }
 
         override fun onFullScreen(session: GeckoSession, fullScreen: Boolean) {
         }
 
-        override fun onContextMenu(session: GeckoSession, screenX: Int, screenY: Int, uri: String, elementType: Int, elementSrc: String) {
+        override fun onContextMenu(session: GeckoSession,
+                                   screenX: Int, screenY: Int,
+                                   element: ContextElement) {
         }
 
         override fun onExternalResponse(session: GeckoSession, response: GeckoSession.WebResponseInfo) {
         }
 
         override fun onCrash(session: GeckoSession) {
         }
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -359,25 +359,29 @@ public class GeckoSession implements Par
                                       final String event,
                                       final GeckoBundle message,
                                       final EventCallback callback) {
 
                 if ("GeckoView:ContentCrash".equals(event)) {
                     close();
                     delegate.onCrash(GeckoSession.this);
                 } else if ("GeckoView:ContextMenu".equals(event)) {
-                    final int type = getContentElementType(
-                        message.getString("elementType"));
+                    final ContentDelegate.ContextElement elem =
+                        new ContentDelegate.ContextElement(
+                            message.getString("uri"),
+                            message.getString("title"),
+                            message.getString("alt"),
+                            message.getString("elementType"),
+                            message.getString("elementSrc"));
 
                     delegate.onContextMenu(GeckoSession.this,
                                            message.getInt("screenX"),
                                            message.getInt("screenY"),
-                                           message.getString("uri"),
-                                           type,
-                                           message.getString("elementSrc"));
+                                           elem);
+
                 } else if ("GeckoView:DOMTitleChanged".equals(event)) {
                     delegate.onTitleChange(GeckoSession.this,
                                            message.getString("title"));
                 } else if ("GeckoView:DOMWindowFocus".equals(event)) {
                     delegate.onFocusRequest(GeckoSession.this);
                 } else if ("GeckoView:DOMWindowClose".equals(event)) {
                     delegate.onCloseRequest(GeckoSession.this);
                 } else if ("GeckoView:FullScreenEnter".equals(event)) {
@@ -2493,27 +2497,16 @@ public class GeckoSession implements Par
         /**
         * The security status has been updated.
         * @param session GeckoSession that initiated the callback.
         * @param securityInfo The new security information.
         */
         void onSecurityChange(GeckoSession session, SecurityInformation securityInfo);
     }
 
-    private static int getContentElementType(final String name) {
-        if ("HTMLImageElement".equals(name)) {
-            return ContentDelegate.ELEMENT_TYPE_IMAGE;
-        } else if ("HTMLVideoElement".equals(name)) {
-            return ContentDelegate.ELEMENT_TYPE_VIDEO;
-        } else if ("HTMLAudioElement".equals(name)) {
-            return ContentDelegate.ELEMENT_TYPE_AUDIO;
-        }
-        return ContentDelegate.ELEMENT_TYPE_NONE;
-    }
-
     /**
      * WebResponseInfo contains information about a single web response.
      */
     static public class WebResponseInfo {
         /**
          * The URI of the response. Cannot be null.
          */
         @NonNull public final String uri;
@@ -2552,24 +2545,16 @@ public class GeckoSession implements Par
             uri = "";
             contentType = "";
             contentLength = 0;
             filename = "";
         }
     }
 
     public interface ContentDelegate {
-        @IntDef({ELEMENT_TYPE_NONE, ELEMENT_TYPE_IMAGE, ELEMENT_TYPE_VIDEO,
-                 ELEMENT_TYPE_AUDIO})
-        /* package */ @interface ElementType {}
-        static final int ELEMENT_TYPE_NONE = 0;
-        static final int ELEMENT_TYPE_IMAGE = 1;
-        static final int ELEMENT_TYPE_VIDEO = 2;
-        static final int ELEMENT_TYPE_AUDIO = 3;
-
         /**
         * A page title was discovered in the content or updated after the content
         * loaded.
         * @param session The GeckoSession that initiated the callback.
         * @param title The title sent from the content.
         */
         void onTitleChange(GeckoSession session, String title);
 
@@ -2591,35 +2576,93 @@ public class GeckoSession implements Par
          * would set the Activity containing the GeckoSession to full screen when the page is
          * in full screen mode.
          *
          * @param session The GeckoSession that initiated the callback.
          * @param fullScreen True if the page is in full screen mode.
          */
         void onFullScreen(GeckoSession session, boolean fullScreen);
 
+        /**
+         * Element details for onContextMenu callbacks.
+         */
+        public static final class ContextElement {
+            @IntDef({TYPE_NONE, TYPE_IMAGE, TYPE_VIDEO, TYPE_AUDIO})
+            /* package */ @interface Type {}
+            static final int TYPE_NONE = 0;
+            static final int TYPE_IMAGE = 1;
+            static final int TYPE_VIDEO = 2;
+            static final int TYPE_AUDIO = 3;
+
+
+            /**
+             * The link URI (href) of the element.
+             */
+            public final @Nullable String linkUri;
+
+            /**
+             * The title text of the element.
+             */
+            public final @Nullable String title;
+
+            /**
+             * The alternative text (alt) for the element.
+             */
+            public final @Nullable String altText;
+
+            /**
+             * The type of the element.
+             * One of the {@link ContextElement#TYPE_NONE} flags.
+             */
+            public final @Type int type;
+
+            /**
+             * The source URI (src) of the element.
+             * Set for (nested) media elements.
+             */
+            public final @Nullable String srcUri;
+
+            protected ContextElement(
+                    final @Nullable String linkUri,
+                    final @Nullable String title,
+                    final @Nullable String altText,
+                    final @NonNull String typeStr,
+                    final @Nullable String srcUri) {
+                this.linkUri = linkUri;
+                this.title = title;
+                this.altText = altText;
+                this.type = getType(typeStr);
+                this.srcUri = srcUri;
+            }
+
+            private static int getType(final String name) {
+                if ("HTMLImageElement".equals(name)) {
+                    return TYPE_IMAGE;
+                } else if ("HTMLVideoElement".equals(name)) {
+                    return TYPE_VIDEO;
+                } else if ("HTMLAudioElement".equals(name)) {
+                    return TYPE_AUDIO;
+                }
+                return TYPE_NONE;
+            }
+        }
 
         /**
          * A user has initiated the context menu via long-press.
          * This event is fired on links, (nested) images and (nested) media
          * elements.
          *
          * @param session The GeckoSession that initiated the callback.
          * @param screenX The screen coordinates of the press.
          * @param screenY The screen coordinates of the press.
-         * @param uri The URI of the pressed link, set for links and
-         *            image-links.
-         * @param elementType The type of the pressed element.
-         *                    One of the {@link ContentDelegate#ELEMENT_TYPE_NONE} flags.
-         * @param elementSrc The source URI of the pressed element, set for
-         *                   (nested) images and media elements.
+         * @param element The details for the pressed element.
          */
-        void onContextMenu(GeckoSession session, int screenX, int screenY,
-                           String uri, @ElementType int elementType,
-                           String elementSrc);
+        void onContextMenu(@NonNull GeckoSession session,
+                           int screenX, int screenY,
+                           @NonNull ContextElement element);
 
         /**
          * This is fired when there is a response that cannot be handled
          * by Gecko (e.g., a download).
          *
          * @param session the GeckoSession that received the external response.
          * @param response the WebResponseInfo for the external response
          */
--- a/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java
+++ b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java
@@ -471,22 +471,26 @@ public class GeckoViewActivity extends A
         @Override
         public void onCloseRequest(final GeckoSession session) {
             if (session == mGeckoSession) {
                 finish();
             }
         }
 
         @Override
-        public void onContextMenu(GeckoSession session, int screenX, int screenY,
-                                  String uri, int elementType, String elementSrc) {
+        public void onContextMenu(final GeckoSession session,
+                                  int screenX, int screenY,
+                                  final ContextElement element) {
             Log.d(LOGTAG, "onContextMenu screenX=" + screenX +
-                          " screenY=" + screenY + " uri=" + uri +
-                          " elementType=" + elementType +
-                          " elementSrc=" + elementSrc);
+                          " screenY=" + screenY +
+                          " type=" + element.type +
+                          " linkUri=" + element.linkUri +
+                          " title=" + element.title +
+                          " alt=" + element.altText +
+                          " srcUri=" + element.srcUri);
         }
 
         @Override
         public void onExternalResponse(GeckoSession session, GeckoSession.WebResponseInfo response) {
             try {
                 Intent intent = new Intent(Intent.ACTION_VIEW);
                 intent.setDataAndTypeAndNormalize(Uri.parse(response.uri), response.contentType);
                 startActivity(intent);
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1436,21 +1436,17 @@ pref("privacy.trackingprotection.lower_n
 pref("privacy.trackingprotection.lower_network_priority", false);
 #endif
 
 pref("dom.event.contextmenu.enabled",       true);
 pref("dom.event.clipboardevents.enabled",   true);
 pref("dom.event.highrestimestamp.enabled",  true);
 pref("dom.event.coalesce_mouse_move",       true);
 
-#if defined(NIGHTLY_BUILD)
 pref("dom.ua_widget.enabled", true);
-#else
-pref("dom.ua_widget.enabled", false);
-#endif
 
 pref("javascript.enabled",                  true);
 pref("javascript.options.strict",           false);
 #ifdef DEBUG
 pref("javascript.options.strict.debug",     false);
 #endif
 pref("javascript.options.baselinejit",      true);
 //Duplicated in JitOptions - ensure both match.
--- a/python/mozboot/mozboot/archlinux.py
+++ b/python/mozboot/mozboot/archlinux.py
@@ -6,20 +6,21 @@ from __future__ import absolute_import, 
 
 import os
 import sys
 import tempfile
 import subprocess
 import glob
 
 from mozboot.base import BaseBootstrapper
-from mozboot.linux_common import NodeInstall, StyloInstall
+from mozboot.linux_common import NodeInstall, StyloInstall, ClangStaticAnalysisInstall
 
 
-class ArchlinuxBootstrapper(NodeInstall, StyloInstall, BaseBootstrapper):
+class ArchlinuxBootstrapper(NodeInstall, StyloInstall,
+                            ClangStaticAnalysisInstall, BaseBootstrapper):
     '''Archlinux experimental bootstrapper.'''
 
     SYSTEM_PACKAGES = [
         'autoconf2.13',
         'base-devel',
         'nodejs',
         'python2',
         'python2-setuptools',
--- a/python/mozboot/mozboot/base.py
+++ b/python/mozboot/mozboot/base.py
@@ -248,31 +248,57 @@ class BaseBootstrapper(object):
 
         Firefox for Android Artifact Mode needs an application and an ABI set,
         and it needs paths to the Android SDK.
         '''
         raise NotImplementedError(
             '%s does not yet implement suggest_mobile_android_artifact_mode_mozconfig()'
             % __name__)
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        '''
+        Install the clang static analysis package
+        '''
+        raise NotImplementedError(
+            '%s does not yet implement ensure_clang_static_analysis_package()'
+            % __name__)
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         '''
         Install any necessary packages needed for Stylo development.
         '''
         raise NotImplementedError(
             '%s does not yet implement ensure_stylo_packages()'
             % __name__)
 
     def ensure_node_packages(self, state_dir, checkout_root):
         '''
         Install any necessary packages needed to supply NodeJS'''
         raise NotImplementedError(
             '%s does not yet implement ensure_node_packages()'
             % __name__)
 
+    def install_toolchain_static_analysis(self, checkout_root):
+        mach_binary = os.path.join(checkout_root, 'mach')
+        mach_binary = os.path.abspath(mach_binary)
+        if not os.path.exists(mach_binary):
+            raise ValueError("mach not found at %s" % mach_binary)
+
+        if not sys.executable:
+            raise ValueError("cannot determine path to Python executable")
+
+        cmd = [sys.executable, mach_binary, 'static-analysis', 'install',
+               '--force', '--minimal-install']
+
+        from subprocess import CalledProcessError
+        try:
+            subprocess.check_call(cmd)
+        except CalledProcessError as e:
+            print(e.output)
+
     def install_toolchain_artifact(self, state_dir, checkout_root, toolchain_job):
         mach_binary = os.path.join(checkout_root, 'mach')
         mach_binary = os.path.abspath(mach_binary)
         if not os.path.exists(mach_binary):
             raise ValueError("mach not found at %s" % mach_binary)
 
         # If Python can't figure out what its own executable is, there's little
         # chance we're going to be able to execute mach on its own, particularly
--- a/python/mozboot/mozboot/bootstrap.py
+++ b/python/mozboot/mozboot/bootstrap.py
@@ -363,28 +363,29 @@ class Bootstrapper(object):
         return state_dir_available, state_dir
 
     def maybe_install_private_packages_or_exit(self, state_dir,
                                                state_dir_available,
                                                have_clone,
                                                checkout_root):
         # Install the clang packages needed for building the style system, as
         # well as the version of NodeJS that we currently support.
-
+        # Also install the clang static-analysis package by default
         # The best place to install our packages is in the state directory
         # we have.  We should have created one above in non-interactive mode.
         if not state_dir_available:
             print(STYLO_NODEJS_DIRECTORY_MESSAGE.format(statedir=state_dir))
             sys.exit(1)
 
         if not have_clone:
             print(STYLE_NODEJS_REQUIRES_CLONE)
             sys.exit(1)
 
         self.instance.state_dir = state_dir
+        self.instance.ensure_clang_static_analysis_package(checkout_root)
         self.instance.ensure_stylo_packages(state_dir, checkout_root)
         self.instance.ensure_node_packages(state_dir, checkout_root)
 
     def check_telemetry_opt_in(self, state_dir):
         # We can't prompt the user.
         if self.instance.no_interactive:
             return
         # Don't prompt if the user already has a setting for this value.
--- a/python/mozboot/mozboot/centosfedora.py
+++ b/python/mozboot/mozboot/centosfedora.py
@@ -2,20 +2,21 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import
 
 import platform
 
 from mozboot.base import BaseBootstrapper
-from mozboot.linux_common import NodeInstall, StyloInstall
+from mozboot.linux_common import NodeInstall, StyloInstall, ClangStaticAnalysisInstall
 
 
-class CentOSFedoraBootstrapper(NodeInstall, StyloInstall, BaseBootstrapper):
+class CentOSFedoraBootstrapper(NodeInstall, StyloInstall,
+                               ClangStaticAnalysisInstall, BaseBootstrapper):
     def __init__(self, distro, version, dist_id, **kwargs):
         BaseBootstrapper.__init__(self, **kwargs)
 
         self.distro = distro
         self.version = version
         self.dist_id = dist_id
 
         self.group_packages = []
--- a/python/mozboot/mozboot/debian.py
+++ b/python/mozboot/mozboot/debian.py
@@ -1,16 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import, print_function
 
 from mozboot.base import BaseBootstrapper
-from mozboot.linux_common import NodeInstall, StyloInstall
+from mozboot.linux_common import NodeInstall, StyloInstall, ClangStaticAnalysisInstall
 
 
 MERCURIAL_INSTALL_PROMPT = '''
 Mercurial releases a new version every 3 months and your distro's package
 may become out of date. This may cause incompatibility with some
 Mercurial extensions that rely on new Mercurial features. As a result,
 you may not have an optimal version control experience.
 
@@ -23,17 +23,18 @@ How would you like to continue?
 1) Install a modern Mercurial via pip (recommended)
 2) Install a legacy Mercurial via apt
 3) Do not install Mercurial
 
 Choice:
 '''.strip()
 
 
-class DebianBootstrapper(NodeInstall, StyloInstall, BaseBootstrapper):
+class DebianBootstrapper(NodeInstall, StyloInstall, ClangStaticAnalysisInstall,
+                         BaseBootstrapper):
     # These are common packages for all Debian-derived distros (such as
     # Ubuntu).
     COMMON_PACKAGES = [
         'autoconf2.13',
         'build-essential',
         'nodejs',
         'python-dev',
         'python-pip',
--- a/python/mozboot/mozboot/freebsd.py
+++ b/python/mozboot/mozboot/freebsd.py
@@ -61,16 +61,20 @@ class FreeBSDBootstrapper(BaseBootstrapp
 
     def install_browser_artifact_mode_packages(self):
         self.ensure_browser_packages(artifact_mode=True)
 
     def ensure_browser_packages(self, artifact_mode=False):
         # TODO: Figure out what not to install for artifact mode
         self.pkg_install(*self.browser_packages)
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        # TODO: we don't ship clang base static analysis for this platform
+        pass
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         # Clang / llvm already installed as browser package
         self.pkg_install('rust-cbindgen')
 
     def ensure_node_packages(self, state_dir, checkout_root):
         self.pkg_install('npm')
 
     def upgrade_mercurial(self, current):
--- a/python/mozboot/mozboot/gentoo.py
+++ b/python/mozboot/mozboot/gentoo.py
@@ -1,27 +1,28 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import
 
 from mozboot.base import BaseBootstrapper
-from mozboot.linux_common import NodeInstall, StyloInstall
+from mozboot.linux_common import NodeInstall, StyloInstall, ClangStaticAnalysisInstall
 
 try:
     from urllib2 import urlopen
 except ImportError:
     from urllib.request import urlopen
 
 import re
 import subprocess
 
 
-class GentooBootstrapper(NodeInstall, StyloInstall, BaseBootstrapper):
+class GentooBootstrapper(NodeInstall, StyloInstall, ClangStaticAnalysisInstall,
+                         BaseBootstrapper):
     def __init__(self, version, dist_id, **kwargs):
         BaseBootstrapper.__init__(self, **kwargs)
 
         self.version = version
         self.dist_id = dist_id
 
     def install_system_packages(self):
         self.run_as_root(['emerge', '--noreplace', '--quiet', 'nodejs'])
--- a/python/mozboot/mozboot/linux_common.py
+++ b/python/mozboot/mozboot/linux_common.py
@@ -21,8 +21,16 @@ class StyloInstall(object):
 
 class NodeInstall(object):
     def __init__(self, **kwargs):
         pass
 
     def ensure_node_packages(self, state_dir, checkout_root):
         from mozboot import node
         self.install_toolchain_artifact(state_dir, checkout_root, node.LINUX)
+
+
+class ClangStaticAnalysisInstall(object):
+    def __init__(self, **kwargs):
+        pass
+
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        self.install_toolchain_static_analysis(checkout_root)
--- a/python/mozboot/mozboot/mozillabuild.py
+++ b/python/mozboot/mozboot/mozillabuild.py
@@ -40,16 +40,19 @@ class MozillaBuildBootstrapper(BaseBoots
         pass
 
     def install_mobile_android_packages(self):
         pass
 
     def install_mobile_android_artifact_mode_packages(self):
         pass
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        self.install_toolchain_static_analysis(checkout_root)
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         from mozboot import stylo
         self.install_toolchain_artifact(state_dir, checkout_root, stylo.WINDOWS_CLANG)
         self.install_toolchain_artifact(state_dir, checkout_root, stylo.WINDOWS_CBINDGEN)
 
     def ensure_node_packages(self, state_dir, checkout_root):
         from mozboot import node
         self.install_toolchain_artifact(
--- a/python/mozboot/mozboot/openbsd.py
+++ b/python/mozboot/mozboot/openbsd.py
@@ -42,14 +42,18 @@ class OpenBSDBootstrapper(BaseBootstrapp
     def install_browser_artifact_mode_packages(self):
         self.ensure_browser_packages(artifact_mode=True)
 
     def ensure_browser_packages(self, artifact_mode=False):
         # TODO: Figure out what not to install for artifact mode
         # we use -z because there's no other way to say "any autoconf-2.13"
         self.run_as_root(['pkg_add', '-z'] + self.browser_packages)
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        # TODO: we don't ship clang base static analysis for this platform
+        pass
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         # Clang / llvm already installed as browser package
         self.run_as_root(['pkg_add', 'cbindgen'])
 
     def ensure_node_packages(self, state_dir, checkout_root):
         self.run_as_root(['pkg_add', 'node'])
--- a/python/mozboot/mozboot/osx.py
+++ b/python/mozboot/mozboot/osx.py
@@ -499,16 +499,19 @@ class OSXBootstrapper(BaseBootstrapper):
 
             for check in ('/bin', '/usr/bin'):
                 if path == check:
                     print(BAD_PATH_ORDER % (check, p_dir, p_dir, check, p_dir))
                     sys.exit(1)
 
         return active_name.lower()
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        self.install_toolchain_static_analysis(checkout_root)
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         from mozboot import stylo
         # We installed clang via homebrew earlier.
         self.install_toolchain_artifact(state_dir, checkout_root, stylo.MACOS_CBINDGEN)
 
     def ensure_node_packages(self, state_dir, checkout_root):
         # XXX from necessary?
         from mozboot import node
--- a/python/mozboot/mozboot/windows.py
+++ b/python/mozboot/mozboot/windows.py
@@ -67,16 +67,19 @@ class WindowsBootstrapper(BaseBootstrapp
         self.pacman_install(*self.BROWSER_PACKAGES)
 
     def install_mobile_android_packages(self):
         raise NotImplementedError('We do not support building Android on Windows. Sorry!')
 
     def install_mobile_android_artifact_mode_packages(self):
         raise NotImplementedError('We do not support building Android on Windows. Sorry!')
 
+    def ensure_clang_static_analysis_package(self, checkout_root):
+        self.install_toolchain_static_analysis(checkout_root)
+
     def ensure_stylo_packages(self, state_dir, checkout_root):
         from mozboot import stylo
         self.install_toolchain_artifact(state_dir, checkout_root, stylo.WINDOWS_CLANG)
         self.install_toolchain_artifact(state_dir, checkout_root, stylo.WINDOWS_CBINDGEN)
 
     def ensure_node_packages(self, state_dir, checkout_root):
         from mozboot import node
         self.install_toolchain_artifact(
--- a/testing/firefox-ui/tests/puppeteer/manifest.ini
+++ b/testing/firefox-ui/tests/puppeteer/manifest.ini
@@ -1,13 +1,14 @@
 [DEFAULT]
 tags = local
 
 # API tests
 [test_appinfo.py]
+skip-if = artifact # bug 1298233 - build ids are different for artifact builds
 [test_l10n.py]
 [test_places.py]
 [test_security.py]
 tags = remote
 [test_software_update.py]
 [test_utils.py]
 
 # UI tests
--- a/testing/firefox-ui/tests/puppeteer/test_appinfo.py
+++ b/testing/firefox-ui/tests/puppeteer/test_appinfo.py
@@ -13,19 +13,17 @@ class TestAppInfo(PuppeteerMixin, Marion
     def test_valid_properties(self):
         binary = self.marionette.bin
         version_info = mozversion.get_version(binary=binary)
 
         self.assertEqual(self.puppeteer.appinfo.ID, version_info['application_id'])
         self.assertEqual(self.puppeteer.appinfo.name, version_info['application_name'])
         self.assertEqual(self.puppeteer.appinfo.vendor, version_info['application_vendor'])
         self.assertEqual(self.puppeteer.appinfo.version, version_info['application_version'])
-        # Bug 1298328 - Platform buildid mismatch due to incremental builds
-        # self.assertEqual(self.puppeteer.appinfo.platformBuildID,
-        #                  version_info['platform_buildid'])
+        self.assertEqual(self.puppeteer.appinfo.platformBuildID, version_info['platform_buildid'])
         self.assertEqual(self.puppeteer.appinfo.platformVersion, version_info['platform_version'])
         self.assertIsNotNone(self.puppeteer.appinfo.locale)
         self.assertIsNotNone(self.puppeteer.appinfo.user_agent)
         self.assertIsNotNone(self.puppeteer.appinfo.XPCOMABI)
 
     def test_invalid_properties(self):
         with self.assertRaises(AttributeError):
             self.puppeteer.appinfo.unknown
--- a/testing/mozharness/mozharness/mozilla/testing/errors.py
+++ b/testing/mozharness/mozharness/mozilla/testing/errors.py
@@ -122,16 +122,18 @@ TestPassed = [
     {'regex': re.compile('''(TEST-INFO|TEST-KNOWN-FAIL|TEST-PASS|INFO \| )'''), 'level': INFO},
 ]
 
 HarnessErrorList = [
     {'substr': 'TEST-UNEXPECTED', 'level': ERROR, },
     {'substr': 'PROCESS-CRASH', 'level': ERROR, },
     {'regex': re.compile('''ERROR: (Address|Leak)Sanitizer'''), 'level': ERROR, },
     {'regex': re.compile('''thread '([^']+)' panicked'''), 'level': ERROR, },
+    {'substr': 'pure virtual method called', 'level': ERROR, },
+    {'substr': 'Pure virtual function called!', 'level': ERROR, },
 ]
 
 LogcatErrorList = [
     {'substr': 'Fatal signal 11 (SIGSEGV)', 'level': ERROR,
      'explanation': 'This usually indicates the B2G process has crashed'},
     {'substr': 'Fatal signal 7 (SIGBUS)', 'level': ERROR,
      'explanation': 'This usually indicates the B2G process has crashed'},
     {'substr': '[JavaScript Error:', 'level': WARNING},
--- 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":"a11980c70bdc8957d169c4482a3e57a0dd5cb3de6e9eae7b9c15caac7ad8f835","README.md":"e0ae9e1224f6ce5d6df8e30272a1a23044d2d33b0051bf32ccd74e559f8a9f6c","generators/debug_struct_gen.rs":"35223dab284989801bbb7bd676e25533d7fef8e2d990f686867eec1efe95dc62","generators/global_gen.rs":"cad1d5f209dc7ce06d0cea897ee56870c33b812403735adedf2c2d9d3712783f","generators/mod.rs":"9d9f9c20c70de67ca16f4692aff3cdcb7f9209433ebd49e771dbce94349a2a75","generators/static_gen.rs":"9fb4ee9f056263611658234539977fb415f93435d290053b84b092e05de16924","generators/static_struct_gen.rs":"23b910c2b14936766036876b9915639058e0cf3bca468c317d4edc7f6498b471","generators/struct_gen.rs":"03d1bcb9d8ddd64d9326fefe2898633e6714e0caffc32f54b6c873bc75b8a497","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":"4d68840c600a1025025438454d68d70e6da3891f2a5bb33406d4255cb257cda1","registry/mod.rs":"4c42448775dc25449c9995a5ec76e95d6c0762d92443f3c12e865768e4e1dc2a","registry/parse.rs":"5619135099e9be42e47c45a29a359d63890ab60da482bd4f437728a53d561e95"},"package":"7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"}
\ No newline at end of file
+{"files":{"Cargo.toml":"1d8172e33254e98db947a0a4e9c9abfe1e17884857c88228e210bed6d3a490a9","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":"7782ce4cec631bc91919ff83bcc50fede34d863630fb7fc00a22a43e982c842c","registry/parse.rs":"231985bac6c8cf4ef4e6867cf386980d041d3734f2ae73d41ec1b50d9c9bd096"},"package":"a0ffaf173cf76c73a73e080366bf556b4776ece104b06961766ff11449f38604"}
\ No newline at end of file
--- a/third_party/rust/gl_generator/Cargo.toml
+++ b/third_party/rust/gl_generator/Cargo.toml
@@ -7,33 +7,33 @@
 #
 # 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.9.0"
+version = "0.10.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/gl_generator/"
+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"
 repository = "https://github.com/brendanzab/gl-rs/"
 
 [lib]
 name = "gl_generator"
 path = "lib.rs"
 [dependencies.khronos_api]
-version = "2.1.0"
+version = "3.0.0"
 
 [dependencies.log]
-version = "0.4.1"
+version = "0.4"
 
 [dependencies.xml-rs]
-version = "0.7.0"
+version = "0.8"
 
 [features]
 unstable_generator_utils = []
--- a/third_party/rust/gl_generator/README.md
+++ b/third_party/rust/gl_generator/README.md
@@ -54,18 +54,18 @@ Then use it like this:
 mod gl {
     include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
 }
 
 /// Simple loading example
 fn main() {
     let window = ...;
 
-    // Assuming `window` is GLFW: initialize, and made current
-    gl::load_with(|s| window.get_proc_address(s));
+    // Assuming `window` is GLFW: initialize, and make current
+    gl::load_with(|s| window.get_proc_address(s) as *const _);
 }
 ```
 
 The `build.rs` file will generate all the OpenGL functions in a file named,
 `bindings.rs` plus all enumerations, and all types in the `types` submodule.
 
 ## Generator types
 
--- a/third_party/rust/gl_generator/generators/debug_struct_gen.rs
+++ b/third_party/rust/gl_generator/generators/debug_struct_gen.rs
@@ -15,78 +15,88 @@
 use registry::Registry;
 use std::io;
 
 #[allow(missing_copy_implementations)]
 pub struct DebugStructGenerator;
 
 impl super::Generator for DebugStructGenerator {
     fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
-        where W: io::Write
+    where
+        W: io::Write,
     {
         try!(write_header(dest));
         try!(write_type_aliases(registry, dest));
         try!(write_enums(registry, dest));
         try!(write_fnptr_struct_def(dest));
         try!(write_panicking_fns(registry, dest));
         try!(write_struct(registry, dest));
         try!(write_impl(registry, dest));
         Ok(())
     }
 }
 
 /// Creates a `__gl_imports` module which contains all the external symbols that we need for the
 ///  bindings.
 fn write_header<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         mod __gl_imports {{
             pub use std::mem;
             pub use std::marker::Send;
             pub use std::os::raw;
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates a `types` module which contains all the type aliases.
 ///
 /// See also `generators::gen_types`.
 fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  r#"
+    try!(writeln!(
+        dest,
+        r#"
         pub mod types {{
             #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)]
-    "#));
+    "#
+    ));
 
     try!(super::gen_types(registry.api, dest));
 
     writeln!(dest, "}}")
 }
 
 /// Creates all the `<enum>` elements at the root of the bindings.
 fn write_enums<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for enm in &registry.enums {
         try!(super::gen_enum_item(enm, "types::", dest));
     }
 
     Ok(())
 }
 
 /// Creates a `FnPtr` structure which contains the store for a single binding.
 fn write_fnptr_struct_def<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             "
+    writeln!(
+        dest,
+        "
         #[allow(dead_code, missing_copy_implementations)]
         #[derive(Clone)]
         pub struct FnPtr {{
             /// The function pointer that will be used when calling the function.
             f: *const __gl_imports::raw::c_void,
             /// True if the pointer points to a real function, false if points to a `panic!` fn.
             is_loaded: bool,
         }}
@@ -108,60 +118,68 @@ fn write_fnptr_struct_def<W>(dest: &mut 
             ///
             /// If it returns `false`, calling the corresponding function will fail.
             #[inline]
             #[allow(dead_code)]
             pub fn is_loaded(&self) -> bool {{
                 self.is_loaded
             }}
         }}
-    ")
+    "
+    )
 }
 
 /// Creates a `panicking` module which contains one function per GL command.
 ///
 /// These functions are the mocks that are called if the real function could not be loaded.
 fn write_panicking_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             "#[inline(never)]
+    writeln!(
+        dest,
+        "#[inline(never)]
         fn missing_fn_panic() -> ! {{
             panic!(\"{api} function was not loaded\")
         }}",
-             api = registry.api)
+        api = registry.api
+    )
 }
 
 /// Creates a structure which stores all the `FnPtr` of the bindings.
 ///
 /// The name of the struct corresponds to the namespace.
 fn write_struct<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  "
+    try!(writeln!(
+        dest,
+        "
         #[allow(non_camel_case_types, non_snake_case, dead_code)]
         #[derive(Clone)]
         pub struct {api} {{",
-                  api = super::gen_struct_name(registry.api)));
+        api = super::gen_struct_name(registry.api)
+    ));
 
     for cmd in &registry.cmds {
         if let Some(v) = registry.aliases.get(&cmd.proto.ident) {
             try!(writeln!(dest, "/// Fallbacks: {}", v.join(", ")));
         }
         try!(writeln!(dest, "pub {name}: FnPtr,", name = cmd.proto.ident));
     }
     try!(writeln!(dest, "_priv: ()"));
 
     writeln!(dest, "}}")
 }
 
 /// Creates the `impl` of the structure created by `write_struct`.
 fn write_impl<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     try!(writeln!(dest,
                   "impl {api} {{
             /// Load each OpenGL symbol using a custom load function. This allows for the
             /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
             ///
             /// ~~~ignore
             /// let gl = Gl::load_with(|s| glfw.get_proc_address(s));
@@ -184,55 +202,59 @@ fn write_impl<W>(registry: &Registry, de
                 }}
                 let mut metaloadfn = |symbol: &'static str, symbols: &[&'static str]| {{
                     do_metaloadfn(&mut loadfn, symbol, symbols)
                 }};
                 {api} {{",
                   api = super::gen_struct_name(registry.api)));
 
     for cmd in &registry.cmds {
-        try!(writeln!(dest,
+        try!(writeln!(
+            dest,
             "{name}: FnPtr::new(metaloadfn(\"{symbol}\", &[{fallbacks}])),",
             name = cmd.proto.ident,
             symbol = super::gen_symbol_name(registry.api, &cmd.proto.ident),
             fallbacks = match registry.aliases.get(&cmd.proto.ident) {
-                Some(fbs) => {
-                    fbs.iter()
-                       .map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name)))
-                       .collect::<Vec<_>>().join(", ")
-                },
+                Some(fbs) => fbs
+                    .iter()
+                    .map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name)))
+                    .collect::<Vec<_>>()
+                    .join(", "),
                 None => format!(""),
             },
         ))
     }
     try!(writeln!(dest, "_priv: ()"));
 
-    try!(writeln!(dest,
-                  "}}
-        }}"));
+    try!(writeln!(
+        dest,
+        "}}
+        }}"
+    ));
 
     for cmd in &registry.cmds {
         let idents = super::gen_parameters(cmd, true, false);
         let typed_params = super::gen_parameters(cmd, false, true);
-        let println = format!("println!(\"[OpenGL] {}({})\" {});",
-                              cmd.proto.ident,
-                              (0..idents.len())
-                                  .map(|_| "{:?}".to_string())
-                                  .collect::<Vec<_>>()
-                                  .join(", "),
-                              idents
-                                  .iter()
-                                  .zip(typed_params.iter())
-                                  .map(|(name, ty)| if ty.contains("GLDEBUGPROC") {
-                                           format!(", \"<callback>\"")
-                                       } else {
-                                           format!(", {}", name)
-                                       })
-                                  .collect::<Vec<_>>()
-                                  .concat());
+        let println = format!(
+            "println!(\"[OpenGL] {}({})\" {});",
+            cmd.proto.ident,
+            (0..idents.len())
+                .map(|_| "{:?}".to_string())
+                .collect::<Vec<_>>()
+                .join(", "),
+            idents
+                .iter()
+                .zip(typed_params.iter())
+                .map(|(name, ty)| if ty.contains("GLDEBUGPROC") {
+                    format!(", \"<callback>\"")
+                } else {
+                    format!(", {}", name)
+                }).collect::<Vec<_>>()
+                .concat()
+        );
 
         try!(writeln!(dest,
                       "#[allow(non_snake_case, unused_variables, dead_code)]
             #[inline] pub unsafe fn {name}(&self, {params}) -> {return_suffix} {{ \
                 {println}
                 let r = __gl_imports::mem::transmute::<_, extern \"system\" fn({typed_params}) -> {return_suffix}>\
                     (self.{name}.f)({idents});
                 {print_err}
@@ -252,14 +274,16 @@ fn write_impl<W>(registry: &Registry, de
                                          .is_some() {
                           format!(r#"match __gl_imports::mem::transmute::<_, extern "system" fn() -> u32>
                     (self.GetError.f)() {{ 0 => (), r => println!("[OpenGL] ^ GL error triggered: {{}}", r) }}"#)
                       } else {
                           format!("")
                       }))
     }
 
-    writeln!(dest,
-             "}}
+    writeln!(
+        dest,
+        "}}
 
         unsafe impl __gl_imports::Send for {api} {{}}",
-             api = super::gen_struct_name(registry.api))
+        api = super::gen_struct_name(registry.api)
+    )
 }
--- a/third_party/rust/gl_generator/generators/global_gen.rs
+++ b/third_party/rust/gl_generator/generators/global_gen.rs
@@ -15,17 +15,18 @@
 use registry::Registry;
 use std::io;
 
 #[allow(missing_copy_implementations)]
 pub struct GlobalGenerator;
 
 impl super::Generator for GlobalGenerator {
     fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
-        where W: io::Write
+    where
+        W: io::Write,
     {
         try!(write_header(dest));
         try!(write_metaloadfn(dest));
         try!(write_type_aliases(registry, dest));
         try!(write_enums(registry, dest));
         try!(write_fns(registry, dest));
         try!(write_fnptr_struct_def(dest));
         try!(write_ptrs(registry, dest));
@@ -34,86 +35,99 @@ impl super::Generator for GlobalGenerato
         try!(write_load_fn(registry, dest));
         Ok(())
     }
 }
 
 /// Creates a `__gl_imports` module which contains all the external symbols that we need for the
 ///  bindings.
 fn write_header<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         mod __gl_imports {{
             pub use std::mem;
             pub use std::os::raw;
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates the metaloadfn function for fallbacks
 fn write_metaloadfn<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         #[inline(never)]
         fn metaloadfn(loadfn: &mut 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; }}
                 }}
             }}
             ptr
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates a `types` module which contains all the type aliases.
 ///
 /// See also `generators::gen_types`.
 fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  r#"
+    try!(writeln!(
+        dest,
+        r#"
         pub mod types {{
             #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)]
-    "#));
+    "#
+    ));
 
     try!(super::gen_types(registry.api, dest));
 
-    writeln!(dest,
-             "
+    writeln!(
+        dest,
+        "
         }}
-    ")
+    "
+    )
 }
 
 /// Creates all the `<enum>` elements at the root of the bindings.
 fn write_enums<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for enm in &registry.enums {
         try!(super::gen_enum_item(enm, "types::", dest));
     }
 
     Ok(())
 }
 
 /// Creates the functions corresponding to the GL commands.
 ///
 /// The function calls the corresponding function pointer stored in the `storage` module created
 ///  by `write_ptrs`.
 fn write_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for cmd in &registry.cmds {
         if let Some(v) = registry.aliases.get(&cmd.proto.ident) {
             try!(writeln!(dest, "/// Fallbacks: {}", v.join(", ")));
         }
 
         try!(writeln!(dest,
             "#[allow(non_snake_case, unused_variables, dead_code)] #[inline]
@@ -129,17 +143,18 @@ fn write_fns<W>(registry: &Registry, des
         ));
     }
 
     Ok(())
 }
 
 /// Creates a `FnPtr` structure which contains the store for a single binding.
 fn write_fnptr_struct_def<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     writeln!(dest,
              "
         #[allow(missing_copy_implementations)]
         pub struct FnPtr {{
             /// The function pointer that will be used when calling the function.
             f: *const __gl_imports::raw::c_void,
             /// True if the pointer points to a real function, false if points to a `panic!` fn.
@@ -156,53 +171,59 @@ fn write_fnptr_struct_def<W>(dest: &mut 
                 }}
             }}
         }}
     ")
 }
 
 /// Creates a `storage` module which contains a static `FnPtr` per GL command in the registry.
 fn write_ptrs<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-
-    try!(writeln!(dest,
-                  "mod storage {{
+    try!(writeln!(
+        dest,
+        "mod storage {{
             #![allow(non_snake_case)]
             #![allow(non_upper_case_globals)]
             use super::__gl_imports::raw;
-            use super::FnPtr;"));
+            use super::FnPtr;"
+    ));
 
     for c in &registry.cmds {
-        try!(writeln!(dest,
-                      "pub static mut {name}: FnPtr = FnPtr {{
+        try!(writeln!(
+            dest,
+            "pub static mut {name}: FnPtr = FnPtr {{
                 f: super::missing_fn_panic as *const raw::c_void,
                 is_loaded: false
             }};",
-                      name = c.proto.ident));
+            name = c.proto.ident
+        ));
     }
 
     writeln!(dest, "}}")
 }
 
 /// Creates one module for each GL command.
 ///
 /// Each module contains `is_loaded` and `load_with` which interact with the `storage` module
 ///  created by `write_ptrs`.
 fn write_fn_mods<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for c in &registry.cmds {
         let fallbacks = match registry.aliases.get(&c.proto.ident) {
             Some(v) => {
-                let names = v.iter()
+                let names = v
+                    .iter()
                     .map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name[..])))
                     .collect::<Vec<_>>();
                 format!("&[{}]", names.join(", "))
-            }
+            },
             None => "&[]".to_string(),
         };
         let fnname = &c.proto.ident[..];
         let symbol = super::gen_symbol_name(registry.api, &c.proto.ident[..]);
         let symbol = &symbol[..];
 
         try!(writeln!(dest, r##"
             #[allow(non_snake_case)]
@@ -229,47 +250,55 @@ fn write_fn_mods<W>(registry: &Registry,
 
     Ok(())
 }
 
 /// Creates a `missing_fn_panic` function.
 ///
 /// This function is the mock that is called if the real function could not be called.
 fn write_panicking_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             "#[inline(never)]
+    writeln!(
+        dest,
+        "#[inline(never)]
         fn missing_fn_panic() -> ! {{
             panic!(\"{api} function was not loaded\")
         }}
         ",
-             api = registry.api)
+        api = registry.api
+    )
 }
 
 /// Creates the `load_with` function.
 ///
 /// The function calls `load_with` in each module created by `write_fn_mods`.
 fn write_load_fn<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     try!(writeln!(dest,
                   "
         /// 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 {{
     "));
 
     for c in &registry.cmds {
-        try!(writeln!(dest,
-                      "{cmd_name}::load_with(&mut loadfn);",
-                      cmd_name = &c.proto.ident[..]));
+        try!(writeln!(
+            dest,
+            "{cmd_name}::load_with(&mut loadfn);",
+            cmd_name = &c.proto.ident[..]
+        ));
     }
 
-    writeln!(dest,
-             "
+    writeln!(
+        dest,
+        "
         }}
-    ")
+    "
+    )
 }
--- a/third_party/rust/gl_generator/generators/mod.rs
+++ b/third_party/rust/gl_generator/generators/mod.rs
@@ -7,30 +7,34 @@
 //     http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use registry::{Cmd, Enum, Registry};
+use std::io;
 use Api;
-use registry::{Enum, Registry, Cmd};
-use std::io;
 
 pub mod debug_struct_gen;
 pub mod global_gen;
 pub mod static_gen;
+pub mod static_struct_gen;
 pub mod struct_gen;
-pub mod static_struct_gen;
 
 /// Trait for a bindings generator.
+///
+/// See https://github.com/brendanzab/gl-rs/tree/master/gl_generator#generator-types
 pub trait Generator {
     /// Builds the GL bindings.
-    fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write;
+    fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
+    where
+        W: io::Write;
 }
 
 pub fn gen_struct_name(api: Api) -> &'static str {
     match api {
         Api::Gl => "Gl",
         Api::Glx => "Glx",
         Api::Wgl => "Wgl",
         Api::Egl => "Egl",
@@ -38,17 +42,18 @@ pub fn gen_struct_name(api: Api) -> &'st
         Api::Gles1 => "Gles1",
         Api::Gles2 => "Gles2",
         Api::Glsc2 => "Glsc2",
     }
 }
 
 /// This function generates a `const name: type = value;` item.
 pub fn gen_enum_item<W>(enm: &Enum, types_prefix: &str, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     writeln!(dest,
         "#[allow(dead_code, non_upper_case_globals)] pub const {ident}: {types_prefix}{ty} = {value}{cast_suffix};",
         ident = enm.ident,
         types_prefix = if enm.ty == "&'static str" { "" } else { types_prefix },
         ty = enm.ty,
         value = enm.value,
         cast_suffix = match enm.cast {
@@ -58,29 +63,30 @@ pub fn gen_enum_item<W>(enm: &Enum, type
     )
 }
 
 /// Generates all the type aliases for a namespace.
 ///
 /// Aliases are either `pub type = ...` or `#[repr(C)] pub struct ... { ... }` and contain all the
 /// things that we can't obtain from the XML files.
 pub fn gen_types<W>(api: Api, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     if let Api::Egl = api {
         try!(writeln!(dest, "{}", include_str!("templates/types/egl.rs")));
         return Ok(());
     }
 
     try!(writeln!(dest, "{}", include_str!("templates/types/gl.rs")));
 
     match api {
         Api::Glx => try!(writeln!(dest, "{}", include_str!("templates/types/glx.rs"))),
         Api::Wgl => try!(writeln!(dest, "{}", include_str!("templates/types/wgl.rs"))),
-        _ => {}
+        _ => {},
     }
 
     Ok(())
 }
 
 /// Generates the list of Rust `Arg`s that a `Cmd` requires.
 pub fn gen_parameters(cmd: &Cmd, with_idents: bool, with_types: bool) -> Vec<String> {
     cmd.params
--- a/third_party/rust/gl_generator/generators/static_gen.rs
+++ b/third_party/rust/gl_generator/generators/static_gen.rs
@@ -15,84 +15,98 @@
 use registry::Registry;
 use std::io;
 
 #[allow(missing_copy_implementations)]
 pub struct StaticGenerator;
 
 impl super::Generator for StaticGenerator {
     fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
-        where W: io::Write
+    where
+        W: io::Write,
     {
         try!(write_header(dest));
         try!(write_type_aliases(registry, dest));
         try!(write_enums(registry, dest));
         try!(write_fns(registry, dest));
         Ok(())
     }
 }
 
 /// Creates a `__gl_imports` module which contains all the external symbols that we need for the
 ///  bindings.
 fn write_header<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         mod __gl_imports {{
             pub use std::mem;
             pub use std::os::raw;
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates a `types` module which contains all the type aliases.
 ///
 /// See also `generators::gen_types`.
 fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  r#"
+    try!(writeln!(
+        dest,
+        r#"
         pub mod types {{
             #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)]
-    "#));
+    "#
+    ));
 
     try!(super::gen_types(registry.api, dest));
 
-    writeln!(dest,
-             "
+    writeln!(
+        dest,
+        "
         }}
-    ")
+    "
+    )
 }
 
 /// Creates all the `<enum>` elements at the root of the bindings.
 fn write_enums<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for enm in &registry.enums {
         try!(super::gen_enum_item(enm, "types::", dest));
     }
 
     Ok(())
 }
 
 /// io::Writes all functions corresponding to the GL bindings.
 ///
 /// These are foreign functions, they don't have any content.
 fn write_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  "
+    try!(writeln!(
+        dest,
+        "
         #[allow(non_snake_case, unused_variables, dead_code)]
-        extern \"system\" {{"));
+        extern \"system\" {{"
+    ));
 
     for cmd in &registry.cmds {
-        try!(writeln!(dest,
+        try!(writeln!(
+            dest,
             "#[link_name=\"{symbol}\"]
             pub fn {name}({params}) -> {return_suffix};",
             symbol = super::gen_symbol_name(registry.api, &cmd.proto.ident),
             name = cmd.proto.ident,
             params = super::gen_parameters(cmd, true, true).join(", "),
             return_suffix = cmd.proto.ty,
         ));
     }
--- a/third_party/rust/gl_generator/generators/static_struct_gen.rs
+++ b/third_party/rust/gl_generator/generators/static_struct_gen.rs
@@ -15,100 +15,113 @@
 use registry::Registry;
 use std::io;
 
 #[allow(missing_copy_implementations)]
 pub struct StaticStructGenerator;
 
 impl super::Generator for StaticStructGenerator {
     fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
-        where W: io::Write
+    where
+        W: io::Write,
     {
         try!(write_header(dest));
         try!(write_type_aliases(registry, dest));
         try!(write_enums(registry, dest));
         try!(write_struct(registry, dest));
         try!(write_impl(registry, dest));
         try!(write_fns(registry, dest));
         Ok(())
     }
 }
 
 /// Creates a `__gl_imports` module which contains all the external symbols that we need for the
 ///  bindings.
 fn write_header<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         mod __gl_imports {{
             pub use std::mem;
             pub use std::os::raw;
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates a `types` module which contains all the type aliases.
 ///
 /// See also `generators::gen_types`.
 fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  r#"
+    try!(writeln!(
+        dest,
+        r#"
         pub mod types {{
             #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)]
-    "#));
+    "#
+    ));
 
     try!(super::gen_types(registry.api, dest));
 
     writeln!(dest, "}}")
 }
 
 /// Creates all the `<enum>` elements at the root of the bindings.
 fn write_enums<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for enm in &registry.enums {
         try!(super::gen_enum_item(enm, "types::", dest));
     }
 
     Ok(())
 }
 
 /// Creates a stub structure.
 ///
 /// The name of the struct corresponds to the namespace.
 fn write_struct<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest, "
+    writeln!(
+        dest,
+        "
         #[allow(non_camel_case_types, non_snake_case, dead_code)]
         #[derive(Copy, Clone)]
         pub struct {api};",
         api = super::gen_struct_name(registry.api),
     )
 }
 
 /// Creates the `impl` of the structure created by `write_struct`.
 fn write_impl<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     try!(writeln!(dest,
         "impl {api} {{
             /// Stub function.
             #[allow(dead_code)]
-            pub fn load_with<F>(mut _loadfn: F) -> {api} where F: FnMut(&str) -> *const __gl_imports::raw::c_void {{
+            pub fn load_with<F>(mut _loadfn: F) -> {api} where F: FnMut(&'static str) -> *const __gl_imports::raw::c_void {{
                 {api}
             }}",
         api = super::gen_struct_name(registry.api),
     ));
 
     for cmd in &registry.cmds {
-        try!(writeln!(dest,
+        try!(writeln!(
+            dest,
             "#[allow(non_snake_case)]
             // #[allow(unused_variables)]
             #[allow(dead_code)]
             #[inline]
             pub unsafe fn {name}(&self, {typed_params}) -> {return_suffix} {{
                 {name}({idents})
             }}",
             name = cmd.proto.ident,
@@ -120,28 +133,31 @@ fn write_impl<W>(registry: &Registry, de
 
     writeln!(dest, "}}")
 }
 
 /// io::Writes all functions corresponding to the GL bindings.
 ///
 /// These are foreign functions, they don't have any content.
 fn write_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-
-    try!(writeln!(dest,
-                  "
+    try!(writeln!(
+        dest,
+        "
         #[allow(non_snake_case)]
         #[allow(unused_variables)]
         #[allow(dead_code)]
-        extern \"system\" {{"));
+        extern \"system\" {{"
+    ));
 
     for cmd in &registry.cmds {
-        try!(writeln!(dest,
+        try!(writeln!(
+            dest,
             "#[link_name=\"{symbol}\"] fn {name}({params}) -> {return_suffix};",
             symbol = super::gen_symbol_name(registry.api, &cmd.proto.ident),
             name = cmd.proto.ident,
             params = super::gen_parameters(cmd, true, true).join(", "),
             return_suffix = cmd.proto.ty,
         ));
     }
 
--- a/third_party/rust/gl_generator/generators/struct_gen.rs
+++ b/third_party/rust/gl_generator/generators/struct_gen.rs
@@ -15,78 +15,88 @@
 use registry::Registry;
 use std::io;
 
 #[allow(missing_copy_implementations)]
 pub struct StructGenerator;
 
 impl super::Generator for StructGenerator {
     fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()>
-        where W: io::Write
+    where
+        W: io::Write,
     {
         try!(write_header(dest));
         try!(write_type_aliases(registry, dest));
         try!(write_enums(registry, dest));
         try!(write_fnptr_struct_def(dest));
         try!(write_panicking_fns(registry, dest));
         try!(write_struct(registry, dest));
         try!(write_impl(registry, dest));
         Ok(())
     }
 }
 
 /// Creates a `__gl_imports` module which contains all the external symbols that we need for the
 ///  bindings.
 fn write_header<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             r#"
+    writeln!(
+        dest,
+        r#"
         mod __gl_imports {{
             pub use std::mem;
             pub use std::marker::Send;
             pub use std::os::raw;
         }}
-    "#)
+    "#
+    )
 }
 
 /// Creates a `types` module which contains all the type aliases.
 ///
 /// See also `generators::gen_types`.
 fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  r#"
+    try!(writeln!(
+        dest,
+        r#"
         pub mod types {{
             #![allow(non_camel_case_types, non_snake_case, dead_code, missing_copy_implementations)]
-    "#));
+    "#
+    ));
 
     try!(super::gen_types(registry.api, dest));
 
     writeln!(dest, "}}")
 }
 
 /// Creates all the `<enum>` elements at the root of the bindings.
 fn write_enums<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     for enm in &registry.enums {
         try!(super::gen_enum_item(enm, "types::", dest));
     }
 
     Ok(())
 }
 
 /// Creates a `FnPtr` structure which contains the store for a single binding.
 fn write_fnptr_struct_def<W>(dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             "
+    writeln!(
+        dest,
+        "
         #[allow(dead_code, missing_copy_implementations)]
         #[derive(Clone)]
         pub struct FnPtr {{
             /// The function pointer that will be used when calling the function.
             f: *const __gl_imports::raw::c_void,
             /// True if the pointer points to a real function, false if points to a `panic!` fn.
             is_loaded: bool,
         }}
@@ -108,60 +118,68 @@ fn write_fnptr_struct_def<W>(dest: &mut 
             ///
             /// If it returns `false`, calling the corresponding function will fail.
             #[inline]
             #[allow(dead_code)]
             pub fn is_loaded(&self) -> bool {{
                 self.is_loaded
             }}
         }}
-    ")
+    "
+    )
 }
 
 /// Creates a `panicking` module which contains one function per GL command.
 ///
 /// These functions are the mocks that are called if the real function could not be loaded.
 fn write_panicking_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    writeln!(dest,
-             "#[inline(never)]
+    writeln!(
+        dest,
+        "#[inline(never)]
         fn missing_fn_panic() -> ! {{
             panic!(\"{api} function was not loaded\")
         }}",
-             api = registry.api)
+        api = registry.api
+    )
 }
 
 /// Creates a structure which stores all the `FnPtr` of the bindings.
 ///
 /// The name of the struct corresponds to the namespace.
 fn write_struct<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
-    try!(writeln!(dest,
-                  "
+    try!(writeln!(
+        dest,
+        "
         #[allow(non_camel_case_types, non_snake_case, dead_code)]
         #[derive(Clone)]
         pub struct {api} {{",
-                  api = super::gen_struct_name(registry.api)));
+        api = super::gen_struct_name(registry.api)
+    ));
 
     for cmd in &registry.cmds {
         if let Some(v) = registry.aliases.get(&cmd.proto.ident) {
             try!(writeln!(dest, "/// Fallbacks: {}", v.join(", ")));
         }
         try!(writeln!(dest, "pub {name}: FnPtr,", name = cmd.proto.ident));
     }
     try!(writeln!(dest, "_priv: ()"));
 
     writeln!(dest, "}}")
 }
 
 /// Creates the `impl` of the structure created by `write_struct`.
 fn write_impl<W>(registry: &Registry, dest: &mut W) -> io::Result<()>
-    where W: io::Write
+where
+    W: io::Write,
 {
     try!(writeln!(dest,
                   "impl {api} {{
             /// Load each OpenGL symbol using a custom load function. This allows for the
             /// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
             ///
             /// ~~~ignore
             /// let gl = Gl::load_with(|s| glfw.get_proc_address(s));
@@ -184,50 +202,55 @@ fn write_impl<W>(registry: &Registry, de
                 }}
                 let mut metaloadfn = |symbol: &'static str, symbols: &[&'static str]| {{
                     do_metaloadfn(&mut loadfn, symbol, symbols)
                 }};
                 {api} {{",
                   api = super::gen_struct_name(registry.api)));
 
     for cmd in &registry.cmds {
-        try!(writeln!(dest,
+        try!(writeln!(
+            dest,
             "{name}: FnPtr::new(metaloadfn(\"{symbol}\", &[{fallbacks}])),",
             name = cmd.proto.ident,
             symbol = super::gen_symbol_name(registry.api, &cmd.proto.ident),
             fallbacks = match registry.aliases.get(&cmd.proto.ident) {
-                Some(fbs) => {
-                    fbs.iter()
-                       .map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name)))
-                       .collect::<Vec<_>>().join(", ")
-                },
+                Some(fbs) => fbs
+                    .iter()
+                    .map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name)))
+                    .collect::<Vec<_>>()
+                    .join(", "),
                 None => format!(""),
             },
         ))
     }
 
     try!(writeln!(dest, "_priv: ()"));
 
-    try!(writeln!(dest,
-                  "}}
-        }}"));
+    try!(writeln!(
+        dest,
+        "}}
+        }}"
+    ));
 
     for cmd in &registry.cmds {
         try!(writeln!(dest,
             "#[allow(non_snake_case, unused_variables, dead_code)]
             #[inline] pub unsafe fn {name}(&self, {params}) -> {return_suffix} {{ \
                 __gl_imports::mem::transmute::<_, extern \"system\" fn({typed_params}) -> {return_suffix}>\
                     (self.{name}.f)({idents}) \
             }}",
             name = cmd.proto.ident,
             params = super::gen_parameters(cmd, true, true).join(", "),
             typed_params = super::gen_parameters(cmd, false, true).join(", "),
             return_suffix = cmd.proto.ty,
             idents = super::gen_parameters(cmd, true, false).join(", "),
         ))
     }
 
-    writeln!(dest,
-             "}}
+    writeln!(
+        dest,
+        "}}
 
         unsafe impl __gl_imports::Send for {api} {{}}",
-             api = super::gen_struct_name(registry.api))
+        api = super::gen_struct_name(registry.api)
+    )
 }
--- a/third_party/rust/gl_generator/lib.rs
+++ b/third_party/rust/gl_generator/lib.rs
@@ -66,16 +66,16 @@ extern crate xml;
 
 #[cfg(feature = "unstable_generator_utils")]
 pub mod generators;
 #[cfg(not(feature = "unstable_generator_utils"))]
 mod generators;
 
 mod registry;
 
-pub use generators::Generator;
 pub use generators::debug_struct_gen::DebugStructGenerator;
 pub use generators::global_gen::GlobalGenerator;
 pub use generators::static_gen::StaticGenerator;
 pub use generators::static_struct_gen::StaticStructGenerator;
 pub use generators::struct_gen::StructGenerator;
+pub use generators::Generator;
 
 pub use registry::*;
--- a/third_party/rust/gl_generator/registry/mod.rs
+++ b/third_party/rust/gl_generator/registry/mod.rs
@@ -110,30 +110,28 @@ pub struct GlxOpcode {
 pub struct Registry {
     pub api: Api,
     pub enums: BTreeSet<Enum>,
     pub cmds: BTreeSet<Cmd>,
     pub aliases: BTreeMap<String, Vec<String>>,
 }
 
 impl Registry {
-    pub fn new<'a, Exts>(api: Api,
-                         version: (u8, u8),
-                         profile: Profile,
-                         fallbacks: Fallbacks,
-                         extensions: Exts)
-                         -> Registry
-        where Exts: AsRef<[&'a str]>
+    pub fn new<'a, Exts>(
+        api: Api,
+        version: (u8, u8),
+        profile: Profile,
+        fallbacks: Fallbacks,
+        extensions: Exts,
+    ) -> Registry
+    where
+        Exts: AsRef<[&'a str]>,
     {
         let (major, minor) = version;
-        let extensions = extensions
-            .as_ref()
-            .iter()
-            .map(<&str>::to_string)
-            .collect();
+        let extensions = extensions.as_ref().iter().map(<&str>::to_string).collect();
 
         let filter = parse::Filter {
             api: api,
             fallbacks: fallbacks,
             extensions: extensions,
             version: format!("{}.{}", major, minor),
             profile: profile,
         };
@@ -144,18 +142,19 @@ impl Registry {
             Api::Wgl => khronos_api::WGL_XML,
             Api::Egl => khronos_api::EGL_XML,
         };
 
         parse::from_xml(src, filter)
     }
 
     pub fn write_bindings<W, G>(&self, generator: G, output: &mut W) -> io::Result<()>
-        where G: Generator,
-              W: io::Write
+    where
+        G: Generator,
+        W: io::Write,
     {
         generator.write(&self, output)
     }
 
     /// Returns a set of all the types used in the supplied registry. This is useful
     /// for working out what conversions are needed for the specific registry.
     pub fn get_tys(&self) -> BTreeSet<&str> {
         let mut tys = BTreeSet::new();
--- a/third_party/rust/gl_generator/registry/parse.rs
+++ b/third_party/rust/gl_generator/registry/parse.rs
@@ -14,21 +14,21 @@
 
 extern crate khronos_api;
 
 use std::borrow::Cow;
 use std::collections::btree_map::Entry;
 use std::collections::{BTreeMap, BTreeSet};
 use std::io;
 use xml::attribute::OwnedAttribute;
+use xml::reader::XmlEvent;
 use xml::EventReader as XmlEventReader;
-use xml::reader::XmlEvent;
 
-use {Fallbacks, Api, Profile};
 use registry::{Binding, Cmd, Enum, GlxOpcode, Registry};
+use {Api, Fallbacks, Profile};
 
 pub fn from_xml<R: io::Read>(src: R, filter: Filter) -> Registry {
     XmlEventReader::new(src)
         .into_iter()
         .map(Result::unwrap)
         .filter_map(ParseEvent::from_xml)
         .parse(filter)
 }
@@ -36,18 +36,19 @@ pub fn from_xml<R: io::Read>(src: R, fil
 #[derive(Debug, PartialEq, Eq)]
 struct Attribute {
     key: String,
     value: String,
 }
 
 impl Attribute {
     fn new<Key, Value>(key: Key, value: Value) -> Attribute
-        where Key: ToString,
-              Value: ToString
+    where
+        Key: ToString,
+        Value: ToString,
     {
         Attribute {
             key: key.to_string(),
             value: value.to_string(),
         }
     }
 }
 
@@ -64,40 +65,43 @@ enum ParseEvent {
     Text(String),
 }
 
 impl ParseEvent {
     fn from_xml(event: XmlEvent) -> Option<ParseEvent> {
         match event {
             XmlEvent::StartDocument { .. } => None,
             XmlEvent::EndDocument => None,
-            XmlEvent::StartElement { name, attributes, .. } => {
+            XmlEvent::StartElement {
+                name, attributes, ..
+            } => {
                 let attributes = attributes.into_iter().map(Attribute::from).collect();
                 Some(ParseEvent::Start(name.local_name, attributes))
-            }
+            },
             XmlEvent::EndElement { name } => Some(ParseEvent::End(name.local_name)),
             XmlEvent::Characters(chars) => Some(ParseEvent::Text(chars)),
             XmlEvent::ProcessingInstruction { .. } => None,
             XmlEvent::CData(_) => None,
             XmlEvent::Comment(_) => None,
             XmlEvent::Whitespace(_) => None,
         }
     }
 }
 
-fn api_from_str(src: &str) -> Result<Api, ()> {
+fn api_from_str(src: &str) -> Result<Option<Api>, ()> {
     match src {
-        "gl" => Ok(Api::Gl),
-        "glx" => Ok(Api::Glx),
-        "wgl" => Ok(Api::Wgl),
-        "egl" => Ok(Api::Egl),
-        "glcore" => Ok(Api::GlCore),
-        "gles1" => Ok(Api::Gles1),
-        "gles2" => Ok(Api::Gles2),
-        "glsc2" => Ok(Api::Glsc2),
+        "gl" => Ok(Some(Api::Gl)),
+        "glx" => Ok(Some(Api::Glx)),
+        "wgl" => Ok(Some(Api::Wgl)),
+        "egl" => Ok(Some(Api::Egl)),
+        "glcore" => Ok(Some(Api::GlCore)),
+        "gles1" => Ok(Some(Api::Gles1)),
+        "gles2" => Ok(Some(Api::Gles2)),
+        "glsc2" => Ok(Some(Api::Glsc2)),
+        "disabled" => Ok(None),
         _ => Err(()),
     }
 }
 
 fn profile_from_str(src: &str) -> Result<Profile, ()> {
     match src {
         "core" => Ok(Profile::Core),
         "compatibility" => Ok(Profile::Compatibility),
@@ -188,17 +192,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",
@@ -212,35 +216,34 @@ fn make_egl_enum(ident: String, ty: Opti
         ident: ident,
         value: value,
         cast: cast,
         alias: alias,
         ty: ty,
     }
 }
 
-
 fn trim_cmd_prefix(ident: &str, api: Api) -> &str {
     match api {
         Api::Gl | Api::GlCore | Api::Gles1 | Api::Gles2 | Api::Glsc2 => trim_str(ident, "gl"),
         Api::Glx => trim_str(ident, "glX"),
         Api::Wgl => trim_str(ident, "wgl"),
         Api::Egl => trim_str(ident, "egl"),
     }
 }
 
 fn merge_map(a: &mut BTreeMap<String, Vec<String>>, b: BTreeMap<String, Vec<String>>) {
     for (k, v) in b {
         match a.entry(k) {
             Entry::Occupied(mut ent) => {
                 ent.get_mut().extend(v);
-            }
+            },
             Entry::Vacant(ent) => {
                 ent.insert(v);
-            }
+            },
         }
     }
 }
 
 #[derive(Clone)]
 struct Feature {
     pub api: Api,
     pub name: String,
@@ -299,41 +302,39 @@ trait Parse: Sized + Iterator<Item = Par
                 ParseEvent::Text(_) => (),
                 ParseEvent::Start(ref name, _) if name == "comment" => self.skip_to_end("comment"),
                 ParseEvent::Start(ref name, _) if name == "types" => self.skip_to_end("types"),
                 ParseEvent::Start(ref name, _) if name == "groups" => self.skip_to_end("groups"),
 
                 // add enum namespace
                 ParseEvent::Start(ref name, _) if name == "enums" => {
                     enums.extend(self.consume_enums(filter.api));
-                }
+                },
 
                 // add command namespace
                 ParseEvent::Start(ref name, _) if name == "commands" => {
                     let (new_cmds, new_aliases) = self.consume_cmds(filter.api);
                     cmds.extend(new_cmds);
                     merge_map(&mut aliases, new_aliases);
-                }
+                },
 
                 ParseEvent::Start(ref name, ref attributes) if name == "feature" => {
                     debug!("Parsing feature: {:?}", attributes);
                     features.push(Feature::convert(&mut self, &attributes));
-                }
+                },
 
-                ParseEvent::Start(ref name, _) if name == "extensions" => {
-                    loop {
-                        match self.next().unwrap() {
-                            ParseEvent::Start(ref name, ref attributes) if name == "extension" => {
-                                extensions.push(Extension::convert(&mut self, &attributes));
-                            }
-                            ParseEvent::End(ref name) if name == "extensions" => break,
-                            event => panic!("Unexpected message {:?}", event),
-                        }
+                ParseEvent::Start(ref name, _) if name == "extensions" => loop {
+                    match self.next().unwrap() {
+                        ParseEvent::Start(ref name, ref attributes) if name == "extension" => {
+                            extensions.push(Extension::convert(&mut self, &attributes));
+                        },
+                        ParseEvent::End(ref name) if name == "extensions" => break,
+                        event => panic!("Unexpected message {:?}", event),
                     }
-                }
+                },
 
                 // finished building the registry
                 ParseEvent::End(ref name) if name == "registry" => break,
 
                 // error handling
                 event => panic!("Expected </registry>, found: {:?}", event),
             }
         }
@@ -371,39 +372,40 @@ trait Parse: Sized + Iterator<Item = Par
 
         if !found_feature {
             panic!("Did not find version {} in the registry", filter.version);
         }
 
         for extension in &extensions {
             if filter.extensions.contains(&extension.name) {
                 if !extension.supported.contains(&filter.api) {
-                    panic!("Requested {}, which doesn't support the {} API",
-                           extension.name,
-                           filter.api);
+                    panic!(
+                        "Requested {}, which doesn't support the {} API",
+                        extension.name, filter.api
+                    );
                 }
                 for require in &extension.requires {
                     desired_enums.extend(require.enums.iter().map(|x| x.clone()));
                     desired_cmds.extend(require.commands.iter().map(|x| x.clone()));
                 }
             }
         }
 
         let is_desired_enum = |e: &Enum| {
-            desired_enums.contains(&("GL_".to_string() + &e.ident)) ||
-            desired_enums.contains(&("WGL_".to_string() + &e.ident)) ||
-            desired_enums.contains(&("GLX_".to_string() + &e.ident)) ||
-            desired_enums.contains(&("EGL_".to_string() + &e.ident))
+            desired_enums.contains(&("GL_".to_string() + &e.ident))
+                || desired_enums.contains(&("WGL_".to_string() + &e.ident))
+                || desired_enums.contains(&("GLX_".to_string() + &e.ident))
+                || desired_enums.contains(&("EGL_".to_string() + &e.ident))
         };
 
         let is_desired_cmd = |c: &Cmd| {
-            desired_cmds.contains(&("gl".to_string() + &c.proto.ident)) ||
-            desired_cmds.contains(&("wgl".to_string() + &c.proto.ident)) ||
-            desired_cmds.contains(&("glX".to_string() + &c.proto.ident)) ||
-            desired_cmds.contains(&("egl".to_string() + &c.proto.ident))
+            desired_cmds.contains(&("gl".to_string() + &c.proto.ident))
+                || desired_cmds.contains(&("wgl".to_string() + &c.proto.ident))
+                || desired_cmds.contains(&("glX".to_string() + &c.proto.ident))
+                || desired_cmds.contains(&("egl".to_string() + &c.proto.ident))
         };
 
         Registry {
             api: filter.api,
             enums: enums.into_iter().filter(is_desired_enum).collect(),
             cmds: cmds.into_iter().filter(is_desired_cmd).collect(),
             aliases: if filter.fallbacks == Fallbacks::None {
                 BTreeMap::new()
@@ -423,42 +425,43 @@ trait Parse: Sized + Iterator<Item = Par
     fn consume_start_element(&mut self, expected_name: &str) -> Vec<Attribute> {
         match self.next().unwrap() {
             ParseEvent::Start(name, attributes) => {
                 if expected_name == name {
                     attributes
                 } else {
                     panic!("Expected <{}>, found: <{}>", expected_name, name)
                 }
-            }
+            },
             event => panic!("Expected <{}>, found: {:?}", expected_name, event),
         }
     }
 
     fn consume_end_element(&mut self, expected_name: &str) {
         match self.next().unwrap() {
             ParseEvent::End(ref name) if expected_name == name => (),
             event => panic!("Expected </{}>, found: {:?}", expected_name, event),
         }
     }
 
     fn skip_to_end(&mut self, expected_name: &str) {
         loop {
             match self.next().unwrap() {
                 ParseEvent::End(ref name) if expected_name == name => break,
-                _ => {}
+                _ => {},
             }
         }
     }
 
-    fn consume_two<'a, T: FromXml, U: FromXml>(&mut self,
-                                               one: &'a str,
-                                               two: &'a str,
-                                               end: &'a str)
-                                               -> (Vec<T>, Vec<U>) {
+    fn consume_two<'a, T: FromXml, U: FromXml>(
+        &mut self,
+        one: &'a str,
+        two: &'a str,
+        end: &'a str,
+    ) -> (Vec<T>, Vec<U>) {
         debug!("consume_two: looking for {} and {} until {}", one, two, end);
 
         let mut ones = Vec::new();
         let mut twos = Vec::new();
 
         loop {
             match self.next().unwrap() {
                 ParseEvent::Start(ref name, ref attributes) => {
@@ -475,51 +478,51 @@ trait Parse: Sized + Iterator<Item = Par
                         // care about type.
                         warn!("Ignoring type!");
                         continue;
                     } else if two == n {
                         twos.push(FromXml::convert(self, &attributes));
                     } else {
                         panic!("Unexpected element: <{:?} {:?}>", n, &attributes);
                     }
-                }
+                },
                 ParseEvent::End(ref name) => {
                     debug!("Found end element </{:?}>", name);
 
                     if one == name || two == name {
                         continue;
                     } else if "type" == name {
                         // XXX: GL1.1 contains types, which we never care about anyway.
                         // Make sure consume_two doesn't get used for things which *do*
                         // care about type.
                         warn!("Ignoring type!");
                         continue;
                     } else if end == name {
                         return (ones, twos);
                     } else {
                         panic!("Unexpected end element {:?}", name);
                     }
-                }
+                },
                 event => panic!("Unexpected message {:?}", event),
             }
         }
     }
 
     fn consume_enums(&mut self, api: Api) -> Vec<Enum> {
         let mut enums = Vec::new();
         loop {
             match self.next().unwrap() {
                 // ignores
-                ParseEvent::Text(_) => {}
+                ParseEvent::Text(_) => {},
                 ParseEvent::Start(ref name, _) if name == "unused" => self.skip_to_end("unused"),
 
                 // add enum definition
                 ParseEvent::Start(ref name, ref attributes) if name == "enum" => {
                     enums.push(self.consume_enum(api, attributes));
-                }
+                },
 
                 // finished building the namespace
                 ParseEvent::End(ref name) if name == "enums" => break,
                 // error handling
                 event => panic!("Expected </enums>, found: {:?}", event),
             }
         }
         enums
@@ -529,40 +532,40 @@ trait Parse: Sized + Iterator<Item = Par
         let ident = trim_enum_prefix(&get_attribute(&attributes, "name").unwrap(), api).to_string();
         let value = get_attribute(&attributes, "value").unwrap();
         let alias = get_attribute(&attributes, "alias");
         let ty = get_attribute(&attributes, "type");
         self.consume_end_element("enum");
 
         match api {
             Api::Egl => make_egl_enum(ident, ty, value, alias),
-            _ => make_enum(ident, ty, value, alias)
+            _ => make_enum(ident, ty, value, alias),
         }
     }
 
     fn consume_cmds(&mut self, api: Api) -> (Vec<Cmd>, BTreeMap<String, Vec<String>>) {
         let mut cmds = Vec::new();
         let mut aliases: BTreeMap<String, Vec<String>> = BTreeMap::new();
         loop {
             match self.next().unwrap() {
                 // add command definition
                 ParseEvent::Start(ref name, _) if name == "command" => {
                     let new = self.consume_cmd(api);
                     if let Some(ref v) = new.alias {
                         match aliases.entry(v.clone()) {
                             Entry::Occupied(mut ent) => {
                                 ent.get_mut().push(new.proto.ident.clone());
-                            }
+                            },
                             Entry::Vacant(ent) => {
                                 ent.insert(vec![new.proto.ident.clone()]);
-                            }
+                            },
                         }
                     }
                     cmds.push(new);
-                }
+                },
                 // finished building the namespace
                 ParseEvent::End(ref name) if name == "commands" => break,
                 // error handling
                 event => panic!("Expected </commands>, found: {:?}", event),
             }
         }
         (cmds, aliases)
     }
@@ -576,33 +579,33 @@ trait Parse: Sized + Iterator<Item = Par
         let mut params = Vec::new();
         let mut alias = None;
         let mut vecequiv = None;
         let mut glx = None;
         loop {
             match self.next().unwrap() {
                 ParseEvent::Start(ref name, _) if name == "param" => {
                     params.push(self.consume_binding("param"));
-                }
+                },
                 ParseEvent::Start(ref name, ref attributes) if name == "alias" => {
                     alias = get_attribute(&attributes, "name");
                     alias = alias.map(|t| trim_cmd_prefix(&t, api).to_string());
                     self.consume_end_element("alias");
-                }
+                },
                 ParseEvent::Start(ref name, ref attributes) if name == "vecequiv" => {
                     vecequiv = get_attribute(&attributes, "vecequiv");
                     self.consume_end_element("vecequiv");
-                }
+                },
                 ParseEvent::Start(ref name, ref attributes) if name == "glx" => {
                     glx = Some(GlxOpcode {
-                                   opcode: get_attribute(&attributes, "opcode").unwrap(),
-                                   name: get_attribute(&attributes, "name"),
-                               });
+                        opcode: get_attribute(&attributes, "opcode").unwrap(),
+                        name: get_attribute(&attributes, "name"),
+                    });
                     self.consume_end_element("glx");
-                }
+                },
                 ParseEvent::End(ref name) if name == "command" => break,
                 event => panic!("Expected </command>, found: {:?}", event),
             }
         }
 
         Cmd {
             proto: proto,
             params: params,
@@ -683,17 +686,17 @@ impl FromXml for Remove {
         }
     }
 }
 
 impl FromXml for Feature {
     fn convert<P: Parse>(parser: &mut P, a: &[Attribute]) -> Feature {
         debug!("Doing a FromXml on Feature");
         let api = get_attribute(a, "api").unwrap();
-        let api = api_from_str(&api).unwrap();
+        let api = api_from_str(&api).unwrap().unwrap();
         let name = get_attribute(a, "name").unwrap();
         let number = get_attribute(a, "number").unwrap();
 
         debug!("Found api = {}, name = {}, number = {}", api, name, number);
 
         let (require, remove) = parser.consume_two("require", "remove", "feature");
 
         Feature {
@@ -708,25 +711,26 @@ impl FromXml for Feature {
 
 impl FromXml for Extension {
     fn convert<P: Parse>(parser: &mut P, a: &[Attribute]) -> Extension {
         debug!("Doing a FromXml on Extension");
         let name = get_attribute(a, "name").unwrap();
         let supported = get_attribute(a, "supported")
             .unwrap()
             .split('|')
-            .map(api_from_str)
-            .map(Result::unwrap)
+            .filter_map(|api| {
+                api_from_str(api).unwrap_or_else(|()| panic!("unsupported API `{}`", api))
+            })
             .collect::<Vec<_>>();
         let mut require = Vec::new();
         loop {
             match parser.next().unwrap() {
                 ParseEvent::Start(ref name, ref attributes) if name == "require" => {
                     require.push(FromXml::convert(parser, &attributes));
-                }
+                },
                 ParseEvent::End(ref name) if name == "extension" => break,
                 event => panic!("Unexpected message {:?}", event),
             }
         }
 
         Extension {
             name: name,
             supported: supported,
@@ -808,16 +812,17 @@ pub fn to_rust_ty<T: AsRef<str>>(ty: T) 
         "const GLclampf *" => "*const types::GLclampf",
         "const GLdouble *" => "*const types::GLdouble",
         "const GLenum *" => "*const types::GLenum",
         "const GLfixed *" => "*const types::GLfixed",
         "const GLfloat" => "types::GLfloat",
         "const GLfloat *" => "*const types::GLfloat",
         "const GLhalfNV *" => "*const types::GLhalfNV",
         "const GLint *" => "*const types::GLint",
+        "const GLint*" => "*const types::GLint",
         "const GLint64 *" => "*const types::GLint64",
         "const GLint64EXT *" => "*const types::GLint64EXT",
         "const GLintptr *" => "*const types::GLintptr",
         "const GLshort *" => "*const types::GLshort",
         "const GLsizei *" => "*const types::GLsizei",
         "const GLsizeiptr *" => "*const types::GLsizeiptr",
         "const GLubyte *" => "*const types::GLubyte",
         "const GLuint *" => "*const types::GLuint",
@@ -983,17 +988,19 @@ pub fn to_rust_ty<T: AsRef<str>>(ty: T) 
         "const EGLAttrib *" => "*const types::EGLAttrib",
         "EGLConfig" => "types::EGLConfig",
         "EGLConfig *" => "*mut types::EGLConfig",
         "EGLContext" => "types::EGLContext",
         "EGLDeviceEXT" => "types::EGLDeviceEXT",
         "EGLDisplay" => "types::EGLDisplay",
         "EGLSurface" => "types::EGLSurface",
         "EGLClientBuffer" => "types::EGLClientBuffer",
-        "__eglMustCastToProperFunctionPointerType" => "types::__eglMustCastToProperFunctionPointerType",
+        "__eglMustCastToProperFunctionPointerType" => {
+            "types::__eglMustCastToProperFunctionPointerType"
+        },
         "EGLImageKHR" => "types::EGLImageKHR",
         "EGLImage" => "types::EGLImage",
         "EGLOutputLayerEXT" => "types::EGLOutputLayerEXT",
         "EGLOutputPortEXT" => "types::EGLOutputPortEXT",
         "EGLSyncKHR" => "types::EGLSyncKHR",
         "EGLSync" => "types::EGLSync",
         "EGLTimeKHR" => "types::EGLTimeKHR",
         "EGLTime" => "types::EGLTime",
@@ -1014,25 +1021,26 @@ pub fn to_rust_ty<T: AsRef<str>>(ty: T) 
         "EGLDeviceEXT *" => "*mut types::EGLDeviceEXT",
         "EGLNativeDisplayType *" => "*mut types::EGLNativeDisplayType",
         "EGLNativePixmapType *" => "*mut types::EGLNativePixmapType",
         "EGLNativeWindowType *" => "*mut types::EGLNativeWindowType",
         "EGLOutputLayerEXT *" => "*mut types::EGLOutputLayerEXT",
         "EGLTimeKHR *" => "*mut types::EGLTimeKHR",
         "EGLOutputPortEXT *" => "*mut types::EGLOutputPortEXT",
         "EGLuint64KHR *" => "*mut types::EGLuint64KHR",
+        "const struct AHardwareBuffer *" => "*const __gl_imports::raw::c_void", // humm
 
         "GLeglClientBufferEXT" => "types::GLeglClientBufferEXT",
-        "GLVULKANPROCNV" => "type::GLVULKANPROCNV",
-        "EGLDEBUGPROCKHR" => "type::EGLDEBUGPROCKHR",
-        "EGLObjectKHR" => "type::EGLObjectKHR",
-        "EGLLabelKHR" => "type::EGLLabelKHR",
-        "EGLnsecsANDROID" => "type::EGLnsecsANDROID",
-        "EGLnsecsANDROID *" => "*mut type::EGLnsecsANDROID",
-        "EGLBoolean *" => "*mut type::EGLBoolean",
+        "GLVULKANPROCNV" => "types::GLVULKANPROCNV",
+        "EGLDEBUGPROCKHR" => "types::EGLDEBUGPROCKHR",
+        "EGLObjectKHR" => "types::EGLObjectKHR",
+        "EGLLabelKHR" => "types::EGLLabelKHR",
+        "EGLnsecsANDROID" => "types::EGLnsecsANDROID",
+        "EGLnsecsANDROID *" => "*mut types::EGLnsecsANDROID",
+        "EGLBoolean *" => "*mut types::EGLBoolean",
 
         // failure
         _ => panic!("Type conversion not implemented for `{}`", ty.as_ref()),
     };
 
     Cow::Borrowed(ty)
 }
 
@@ -1071,74 +1079,86 @@ mod tests {
             assert_eq!(parse::underscore_keyword("bar".to_string()), "bar");
         }
     }
     mod make_enum {
         use registry::parse;
 
         #[test]
         fn test_cast_0() {
-            let e = parse::make_enum("FOO".to_string(),
-                                     None,
-                                     "((EGLint)-1)".to_string(),
-                                     Some("BAR".to_string()));
+            let e = parse::make_enum(
+                "FOO".to_string(),
+                None,
+                "((EGLint)-1)".to_string(),
+                Some("BAR".to_string()),
+            );
             assert_eq!(e.ident, "FOO");
             assert_eq!((&*e.ty, &*e.value), ("EGLint", "-1"));
             assert_eq!(e.alias, Some("BAR".to_string()));
         }
 
         #[test]
         fn test_cast_1() {
-            let e = parse::make_enum("FOO".to_string(),
-                                     None,
-                                     "((EGLint)(-1))".to_string(),
-                                     Some("BAR".to_string()));
+            let e = parse::make_enum(
+                "FOO".to_string(),
+                None,
+                "((EGLint)(-1))".to_string(),
+                Some("BAR".to_string()),
+            );
             assert_eq!(e.ident, "FOO");
             assert_eq!((&*e.ty, &*e.value), ("EGLint", "(-1)"));
             assert_eq!(e.alias, Some("BAR".to_string()));
         }
 
         #[test]
         fn test_no_type() {
-            let e = parse::make_enum("FOO".to_string(),
-                                     None,
-                                     "value".to_string(),
-                                     Some("BAR".to_string()));
+            let e = parse::make_enum(
+                "FOO".to_string(),
+                None,
+                "value".to_string(),
+                Some("BAR".to_string()),
+            );
             assert_eq!(e.ident, "FOO");
             assert_eq!(e.value, "value");
             assert_eq!(e.alias, Some("BAR".to_string()));
             assert_eq!(e.ty, "GLenum");
             assert_eq!(e.cast, false);
         }
 
         #[test]
         fn test_u() {
-            let e = parse::make_enum("FOO".to_string(),
-                                     Some("u".to_string()),
-                                     String::new(),
-                                     None);
+            let e = parse::make_enum(
+                "FOO".to_string(),
+                Some("u".to_string()),
+                String::new(),
+                None,
+            );
             assert_eq!(e.ty, "GLuint");
         }
 
         #[test]
         fn test_ull() {
-            let e = parse::make_enum("FOO".to_string(),
-                                     Some("ull".to_string()),
-                                     String::new(),
-                                     None);
+            let e = parse::make_enum(
+                "FOO".to_string(),
+                Some("ull".to_string()),
+                String::new(),
+                None,
+            );
             assert_eq!(e.ty, "GLuint64");
         }
 
         #[test]
         #[should_panic]
         fn test_unknown_type() {
-            parse::make_enum("FOO".to_string(),
-                             Some("blargh".to_string()),
-                             String::new(),
-                             None);
+            parse::make_enum(
+                "FOO".to_string(),
+                Some("blargh".to_string()),
+                String::new(),
+                None,
+            );
         }
 
         #[test]
         fn test_value_str() {
             let e = parse::make_enum("FOO".to_string(), None, "\"hi\"".to_string(), None);
             assert_eq!(e.ty, "&'static str");
         }
 
@@ -1155,20 +1175,22 @@ mod tests {
         }
     }
 
     mod make_egl_enum {
         use registry::parse;
 
         #[test]
         fn test_cast_egl() {
-            let e = parse::make_egl_enum("FOO".to_string(),
-                                     None,
-                                     "EGL_CAST(EGLint,-1)".to_string(),
-                                     Some("BAR".to_string()));
+            let e = parse::make_egl_enum(
+                "FOO".to_string(),
+                None,
+                "EGL_CAST(EGLint,-1)".to_string(),
+                Some("BAR".to_string()),
+            );
             assert_eq!(e.ident, "FOO");
             assert_eq!((&*e.ty, &*e.value), ("EGLint", "-1"));
             assert_eq!(e.alias, Some("BAR".to_string()));
         }
 
         #[test]
         fn test_ident_true() {
             let e = parse::make_egl_enum("TRUE".to_string(), None, "1234".to_string(), None);
@@ -1178,57 +1200,52 @@ mod tests {
         #[test]
         fn test_ident_false() {
             let e = parse::make_egl_enum("FALSE".to_string(), None, "1234".to_string(), None);
             assert_eq!(e.ty, "EGLBoolean");
         }
 
         #[test]
         fn test_ull() {
-            let e = parse::make_egl_enum("FOO".to_string(),
-                                     Some("ull".to_string()),
-                                     "1234".to_string(),
-                                     None);
+            let e = parse::make_egl_enum(
+                "FOO".to_string(),
+                Some("ull".to_string()),
+                "1234".to_string(),
+                None,
+            );
             assert_eq!(e.ty, "EGLuint64KHR");
         }
 
         #[test]
         fn test_negative_value() {
-            let e = parse::make_egl_enum("FOO".to_string(),
-                                     None,
-                                     "-1".to_string(),
-                                     None);
+            let e = parse::make_egl_enum("FOO".to_string(), None, "-1".to_string(), None);
             assert_eq!(e.ty, "EGLint");
         }
 
         #[test]
         #[should_panic]
         fn test_unknown_type() {
-            parse::make_egl_enum("FOO".to_string(),
-                             Some("blargh".to_string()),
-                             String::new(),
-                             None);
+            parse::make_egl_enum(
+                "FOO".to_string(),
+                Some("blargh".to_string()),
+                String::new(),
+                None,
+            );
         }
 
         #[test]
         #[should_panic]
         fn test_unknown_value() {
-            parse::make_egl_enum("FOO".to_string(),
-                             None,
-                             "a".to_string(),
-                             None);
+            parse::make_egl_enum("FOO".to_string(), None, "a".to_string(), None);
         }
 
         #[test]
         #[should_panic]
         fn test_empty_value() {
-            parse::make_egl_enum("FOO".to_string(),
-                             None,
-                             String::new(),
-                             None);
+            parse::make_egl_enum("FOO".to_string(), None, String::new(), None);
         }
     }
 
     mod parse_event {
         mod from_xml {
             use xml::attribute::OwnedAttribute;
             use xml::common::XmlVersion;
             use xml::name::OwnedName;
@@ -1236,29 +1253,37 @@ mod tests {
             use xml::reader::XmlEvent;
 
             use registry::parse::{Attribute, ParseEvent};
 
             #[test]
             fn test_start_event() {
                 let given = XmlEvent::StartElement {
                     name: OwnedName::local("element"),
-                    attributes: vec![OwnedAttribute::new(OwnedName::local("attr1"), "val1"),
-                                     OwnedAttribute::new(OwnedName::local("attr2"), "val2")],
+                    attributes: vec![
+                        OwnedAttribute::new(OwnedName::local("attr1"), "val1"),
+                        OwnedAttribute::new(OwnedName::local("attr2"), "val2"),
+                    ],
                     namespace: Namespace::empty(),
                 };
-                let expected = ParseEvent::Start("element".to_string(),
-                                                 vec![Attribute::new("attr1", "val1"),
-                                                      Attribute::new("attr2", "val2")]);
+                let expected = ParseEvent::Start(
+                    "element".to_string(),
+                    vec![
+                        Attribute::new("attr1", "val1"),
+                        Attribute::new("attr2", "val2"),
+                    ],
+                );
                 assert_eq!(ParseEvent::from_xml(given), Some(expected));
             }
 
             #[test]
             fn test_end_element() {
-                let given = XmlEvent::EndElement { name: OwnedName::local("element") };
+                let given = XmlEvent::EndElement {
+                    name: OwnedName::local("element"),
+                };
                 let expected = ParseEvent::End("element".to_string());
                 assert_eq!(ParseEvent::from_xml(given), Some(expected));
             }
 
             #[test]
             fn test_characters() {
                 let given = XmlEvent::Characters("text".to_string());
                 let expected = ParseEvent::Text("text".to_string());
--- 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":"0b59acef8c840e73d2c3ade921cac7fab2c0d26db5535fa320d965fd434e7184","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"2de24b7458d6b88f20324303a48acf64a4f2bbfb83d2ec4d6ff2b4f4a1fd2275","build.rs":"5dfbe1a39fdb8b91c91cef0581de3c62aa9617afe8427a5837cc7bc90e681adb","src/gl.rs":"84e1cdf6ad785de343b1b14398a5a75c94a12e43e5f1bc8e12d9cc5036468bf5","src/gl_fns.rs":"2c16ca840c519cd6bf73ced3a8334cbadd40e1d79c9eba47a4c67dbac729c222","src/gles_fns.rs":"b3cf28f9530948a13d55e79dd4310e3bb2deb3445c0d0076e19d81994d1230d8","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"2260952cc0393ca6f183e1a91a035c65c85ddb02505f3d53e5a775eb05946f44"}
\ No newline at end of file
+{"files":{"COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"4bb3cfbab2fff43adff71eb4fa74ffa377c311775d89481fb5fb0c5959cd7724","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"1acb12040be43a3582d5897f11870b3ffdcd7ce0f4f32de158175bb6b33ec0b7","build.rs":"5a9444663f14ecfc4a692409f946ed635c708b480a987b420a2dd15da600228d","src/gl.rs":"7f922e7a2816f12effe22f63e83cb691a0f2a5a92b6434f9af105b7beaa1997f","src/gl_fns.rs":"43302c33d181f897c07f79c677d0183bbb6c15dbffe1b92763c0531aec0b305e","src/gles_fns.rs":"fc67b18cf11c661f8b7031142c762dd1c011550bb9d606a6f78a443c30ba8240","src/lib.rs":"16610c19b45a3f26d56b379a3591aa2e4fc9477e7bd88f86b31c6ea32e834861"},"package":"4b47f5b15742aee359c7895ab98cf2cceecc89bb4feb6f4e42f802d7899877da"}
\ No newline at end of file
old mode 100755
new mode 100644
--- 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.3"
+version = "0.6.8"
 authors = ["The Servo Project Developers"]
 build = "build.rs"
 description = "Generated OpenGL bindings and wrapper for Servo."
-documentation = "http://doc.servo.org/gleam/"
+documentation = "https://doc.servo.org/gleam/"
 license = "Apache-2.0/MIT"
 repository = "https://github.com/servo/gleam"
 [build-dependencies.gl_generator]
-version = "0.9"
+version = "0.10"
old mode 100755
new mode 100644
old mode 100755
new mode 100644
old mode 100755
new mode 100644
--- a/third_party/rust/gleam/README.md
+++ b/third_party/rust/gleam/README.md
@@ -1,6 +1,6 @@
 servo-gl
 ========
 
-[Documentation](http://doc.servo.org/gleam/)
+[Documentation](https://doc.servo.org/gleam/)
 
 OpenGL bindings for Servo
old mode 100755
new mode 100644
--- a/third_party/rust/gleam/build.rs
+++ b/third_party/rust/gleam/build.rs
@@ -12,39 +12,42 @@ fn main() {
     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_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",
         "GL_KHR_debug",
     ];
-    let gl_reg = Registry::new(Api::Gl, (3, 3), Profile::Core, Fallbacks::All, gl_extensions);
+    let gl_reg = Registry::new(Api::Gl, (3, 3), Profile::Compatibility, Fallbacks::All, gl_extensions);
     gl_reg.write_bindings(gl_generator::StructGenerator, &mut file_gl)
         .unwrap();
 
     // GLES 3.0 bindings
     let gles_extensions = [
+        "GL_EXT_copy_image",
         "GL_EXT_debug_marker",
         "GL_EXT_disjoint_timer_query",
         "GL_EXT_shader_texture_lod",
         "GL_EXT_texture_filter_anisotropic",
         "GL_EXT_texture_format_BGRA8888",
         "GL_EXT_texture_storage",
         "GL_KHR_debug",
         "GL_OES_EGL_image_external",
         "GL_OES_EGL_image",
+        "GL_OES_texture_half_float",
     ];
     let gles_reg = Registry::new(Api::Gles2, (3, 0), Profile::Core, Fallbacks::All, gles_extensions);
     gles_reg.write_bindings(gl_generator::StructGenerator, &mut file_gles)
         .unwrap();
 
     // OpenGL 3.3 + GLES 3.0 bindings. Used to get all enums
     let gl_reg = gl_reg + gles_reg;
     gl_reg.write_bindings(gl_generator::StructGenerator, &mut file_gl_and_gles)
old mode 100755
new mode 100644
--- a/third_party/rust/gleam/src/gl.rs
+++ b/third_party/rust/gleam/src/gl.rs
@@ -297,16 +297,32 @@ declare_gl_apis! {
                       height: GLsizei,
                       depth: GLsizei);
     fn get_tex_image_into_buffer(&self,
                                 target: GLenum,
                                 level: GLint,
                                 format: GLenum,
                                 ty: GLenum,
                                 output: &mut [u8]);
+    unsafe fn copy_image_sub_data(&self,
+                                  src_name: GLuint,
+                                  src_target: GLenum,
+                                  src_level: GLint,
+                                  src_x: GLint,
+                                  src_y: GLint,
+                                  src_z: GLint,
+                                  dst_name: GLuint,
+                                  dst_target: GLenum,
+                                  dst_level: GLint,
+                                  dst_x: GLint,
+                                  dst_y: GLint,
+                                  dst_z: GLint,
+                                  src_width: GLsizei,
+                                  src_height: GLsizei,
+                                  src_depth: GLsizei);
 
     fn invalidate_framebuffer(&self,
                               target: GLenum,
                               attachments: &[GLenum]);
     fn invalidate_sub_framebuffer(&self,
                                   target: GLenum,
                                   attachments: &[GLenum],
                                   xoffset: GLint,
old mode 100755
new mode 100644
--- a/third_party/rust/gleam/src/gl_fns.rs
+++ b/third_party/rust/gleam/src/gl_fns.rs
@@ -662,16 +662,51 @@ impl Gl for GlFns {
             self.ffi_gl_.GetTexImage(target,
                                      level,
                                      format,
                                      ty,
                                      output.as_mut_ptr() as *mut _);
         }
     }
 
+    unsafe fn copy_image_sub_data(&self,
+                                  src_name: GLuint,
+                                  src_target: GLenum,
+                                  src_level: GLint,
+                                  src_x: GLint,
+                                  src_y: GLint,
+                                  src_z: GLint,
+                                  dst_name: GLuint,
+                                  dst_target: GLenum,
+                                  dst_level: GLint,
+                                  dst_x: GLint,
+                                  dst_y: GLint,
+                                  dst_z: GLint,
+                                  src_width: GLsizei,
+                                  src_height: GLsizei,
+                                  src_depth: GLsizei) {
+        self.ffi_gl_.CopyImageSubData(
+            src_name,
+            src_target,
+            src_level,
+            src_x,
+            src_y,
+            src_z,
+            dst_name,
+            dst_target,
+            dst_level,
+            dst_x,
+            dst_y,
+            dst_z,
+            src_width,
+            src_height,
+            src_depth,
+        );
+    }
+
     fn invalidate_framebuffer(&self,
                               target: GLenum,
                               attachments: &[GLenum]) {
         if self.ffi_gl_.InvalidateFramebuffer.is_loaded() {
             unsafe {
                 self.ffi_gl_.InvalidateFramebuffer(
                     target,
                     attachments.len() as GLsizei,
old mode 100755
new mode 100644
--- a/third_party/rust/gleam/src/gles_fns.rs
+++ b/third_party/rust/gleam/src/gles_fns.rs
@@ -676,16 +676,51 @@ impl Gl for GlesFns {
                                  target: GLenum,
                                  level: GLint,
                                  format: GLenum,
                                  ty: GLenum,
                                  output: &mut [u8]) {
         panic!("not supported");
     }
 
+    unsafe fn copy_image_sub_data(&self,
+                                  src_name: GLuint,
+                                  src_target: GLenum,
+                                  src_level: GLint,
+                                  src_x: GLint,
+                                  src_y: GLint,
+                                  src_z: GLint,
+                                  dst_name: GLuint,
+                                  dst_target: GLenum,
+                                  dst_level: GLint,
+                                  dst_x: GLint,
+                                  dst_y: GLint,
+                                  dst_z: GLint,
+                                  src_width: GLsizei,
+                                  src_height: GLsizei,
+                                  src_depth: GLsizei) {
+        self.ffi_gl_.CopyImageSubDataEXT(
+            src_name,
+            src_target,
+            src_level,
+            src_x,
+            src_y,
+            src_z,
+            dst_name,
+            dst_target,
+            dst_level,
+            dst_x,
+            dst_y,
+            dst_z,
+            src_width,
+            src_height,
+            src_depth,
+        );
+    }
+
     fn invalidate_framebuffer(&self,
                               target: GLenum,
                               attachments: &[GLenum]) {
         unsafe {
             self.ffi_gl_.InvalidateFramebuffer(
                 target,
                 attachments.len() as GLsizei,
                 attachments.as_ptr(),
@@ -1511,24 +1546,40 @@ impl Gl for GlesFns {
         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;
+        let (mut range, mut precision) = match precision_type {
+            // These values are for a 32-bit twos-complement integer format.
+            ffi::LOW_INT |
+            ffi::MEDIUM_INT |
+            ffi::HIGH_INT => ([31, 30], 0),
+
+            // These values are for an IEEE single-precision floating-point format.
+            ffi::LOW_FLOAT |
+            ffi::MEDIUM_FLOAT |
+            ffi::HIGH_FLOAT => ([127, 127], 23),
+
+            _ => unreachable!("invalid precision"),
+        };
+        // This function is sometimes defined even though it's really just
+        // a stub, so we need to set range and precision as if it weren't
+        // defined before calling it. Suppress any error that might occur.
         unsafe {
             self.ffi_gl_.GetShaderPrecisionFormat(shader_type,
                                                   precision_type,
                                                   range.as_mut_ptr(),
                                                   &mut precision);
+            let _ = self.ffi_gl_.GetError();
         }
+
         (range[0], range[1], precision)
     }
 
     fn compile_shader(&self, shader: GLuint) {
         unsafe {
             self.ffi_gl_.CompileShader(shader);
         }
     }
old mode 100755
new mode 100644
--- a/third_party/rust/khronos_api/.cargo-checksum.json
+++ b/third_party/rust/khronos_api/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"e0120828d1aa70c40f47a6c7dc0cc08e089470d8faf8644e68836c31f44248b3","README.md":"45772358ebfb8a7554056ce7faab27c3dc73d881ba4be66891d39e4830657877","api/xml/gl.xml":"5c3d768a361dc998b3497e93c1e0d837615c942ab82ff17dfeed8c1917b74bbb","api/xml/glx.xml":"1862e651300ae36fa6621b23910f55f63f29cd3550c114312be27c204e9828c5","api/xml/wgl.xml":"27fdf88d0f9fae2b025820f28ee3cb67dfc0388e68532a135ca7043db0427a35","api_egl/api/egl.xml":"7b20c062af2fda6dd340f4d03983c49204d75067ed161f10f671c805ace692f7","api_webgl/extensions/ANGLE_instanced_arrays/extension.xml":"213f7e7636e8df0c390a18ad1339618335d7744970837998a191c275f7d1a95c","api_webgl/extensions/EXT_blend_minmax/extension.xml":"d1798c0faf13dfa7930032994f5a47c07b6f2f44b45d033059bfcffb7c1d579c","api_webgl/extensions/EXT_color_buffer_float/extension.xml":"48dacbcce0e0e96c206fc6dd2050266680ba24c2f6b254c3a6871c8715639d36","api_webgl/extensions/EXT_color_buffer_half_float/extension.xml":"1900351880046b495af97e6d38e9f3213538b133f74625a4dd73165d43e7710c","api_webgl/extensions/EXT_disjoint_timer_query/extension.xml":"b4df1205df86474e27459dc1cea3c75cba533d0245c38bb3ea5fe608612c512b","api_webgl/extensions/EXT_disjoint_timer_query_webgl2/extension.xml":"09cf6ddc69af0a032a5712df3808be30ff5fecaea0080ec73f464b87e4b3a313","api_webgl/extensions/EXT_float_blend/extension.xml":"5a298482adee7bb1fcc8f613a8aa9b61bb71bf5523fac56da45bb68136e451b8","api_webgl/extensions/EXT_frag_depth/extension.xml":"d19cf823811272352972ac4cb1d37405dcf63a91c48c1dd046e475487fecf9ea","api_webgl/extensions/EXT_sRGB/extension.xml":"7688ba25fa05558fbae72b21661e5bece2c36e899fe78da83bc8a172db9622fd","api_webgl/extensions/EXT_shader_texture_lod/extension.xml":"f1e5741d5d12d6e9a6bbc95049da2ec62ee55a4d1b6ec7b03e87e9f91282c6cb","api_webgl/extensions/EXT_texture_filter_anisotropic/extension.xml":"131ed0429a9951c05ae5c30859179f47c99b9bd6f47ca2825bdecf791f0188b6","api_webgl/extensions/OES_element_index_uint/extension.xml":"734f7a90af440ea559fa0fe777144aaef8acc7de94a8c3ce153a75ff85cb1f6b","api_webgl/extensions/OES_fbo_render_mipmap/extension.xml":"43bede667b814b80e15b5af463620c53f6fa9e1a610c2e9756ad2fa55b9f7589","api_webgl/extensions/OES_standard_derivatives/extension.xml":"2fa53259457d9f6042194bfb13c0db4b3c63d2d99d9e44f057d8fe4d5b28fe69","api_webgl/extensions/OES_texture_float/extension.xml":"42a782fcc2cafd3df9ea33c9259343c66b3fbd2ebfc216dc20ee6be53481f042","api_webgl/extensions/OES_texture_float_linear/extension.xml":"98041c4427f5abf741eb2c34e23f9b8c84090d4d5b4e2e0f1b04f9b53c73259a","api_webgl/extensions/OES_texture_half_float/extension.xml":"14cb4ce4e6f259fcb6ce0d988c4e81880299f28343cdcba4f7abbf8956207529","api_webgl/extensions/OES_texture_half_float_linear/extension.xml":"d2f29c9a9bf31e757fc8c6da277cdb813350a1504be773c3bd105bfa92e45502","api_webgl/extensions/OES_vertex_array_object/extension.xml":"8262ec860c2af3b23daacc27a17bcf29054bcc03baf59f90779c4e53fc469f41","api_webgl/extensions/WEBGL_color_buffer_float/extension.xml":"d68800fe416384a951fe45fdbcb324494d848cbecdecbdcacf7bbafe8a2aae93","api_webgl/extensions/WEBGL_compressed_texture_astc/extension.xml":"9ba9c29e7e09aa8ec950ec70c79eae42c6f844d354b49fc88d9f048318a9c400","api_webgl/extensions/WEBGL_compressed_texture_atc/extension.xml":"a8de4e909b3d7c29ff6ca58ff6bc91b14c298a12beded04c025bb0ecb1d74db2","api_webgl/extensions/WEBGL_compressed_texture_etc/extension.xml":"d926f0a7f533ea6ce43215a7e90f35064e1a51df539e04c49a2e918f69943aad","api_webgl/extensions/WEBGL_compressed_texture_etc1/extension.xml":"02a008b04a5b40e274023defe3a2fb94f06a2150c059ae703c282faa6b6b4b0e","api_webgl/extensions/WEBGL_compressed_texture_pvrtc/extension.xml":"1570f8ebb56480908e46706683182a097928e8e0a2e992e3eab8f1a2c16124c9","api_webgl/extensions/WEBGL_compressed_texture_s3tc/extension.xml":"87585ba713ad1a8dd5c04fd24a7068a0cf88799ea697e940752c68698de0c707","api_webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/extension.xml":"e22e01bd35b437adabfc7592f5eb6d750fdaabac61b0f79561fe58e860843993","api_webgl/extensions/WEBGL_debug_renderer_info/extension.xml":"af71073e0031b0296b7e5b609cdd272458cbae434a7fa31649054be0969a72e0","api_webgl/extensions/WEBGL_debug_shaders/extension.xml":"fc8c59747ee8cc289aa269c6ac5b6a45f7dc036d509209ace8db7062481a1abe","api_webgl/extensions/WEBGL_depth_texture/extension.xml":"5d91c9b8252b9f3a19f3f6a2f861a660d200446cfcaf09fa2a337e6f6b2dd5bd","api_webgl/extensions/WEBGL_draw_buffers/extension.xml":"9b465aa066d86ba044ad1604f6a3ce9f9e9a3afe3b4d36750a60870a67697fa1","api_webgl/extensions/WEBGL_get_buffer_sub_data_async/extension.xml":"abea14f4cb2012a04db6edc1219ad3da97bfc0975c4756f9d61ab3378a283cae","api_webgl/extensions/WEBGL_lose_context/extension.xml":"71defc6045fefdf7b14cd2d1fe4a432d504b2567e7acb1e77b8737aea7ba1bb0","api_webgl/extensions/WEBGL_multiview/extension.xml":"ac8368b843bb76afb9a82460ef619aa278be180f285964070ccedcd66213f0e0","api_webgl/extensions/WEBGL_security_sensitive_resources/extension.xml":"99634c2e0117d7abb9b44bbd64d8c4e8c8ebbcfe6342222dfc624b05e8532249","api_webgl/extensions/WEBGL_shared_resources/extension.xml":"90b6f51521fbb2ba23563cdfd2029cf28de1233aba4b2844b7d832b323c0fa10","api_webgl/extensions/proposals/EXT_clip_cull_distance/extension.xml":"a4f9b465b1e1efa0367a8fbbada7a6156ffb3e4ee1c677a0d220a7ea1402a260","api_webgl/extensions/proposals/WEBGL_debug/extension.xml":"c8cdbb65c17dfe4851e7a56094c492b835f76f06a9cdb1b3fd273584357864b1","api_webgl/extensions/proposals/WEBGL_dynamic_texture/extension.xml":"7f5bc906ba61037befd4acd9fc39209d2e4bd8eea20ba01f34ebe4700bfd1806","api_webgl/extensions/proposals/WEBGL_subarray_uploads/extension.xml":"87cde732f220d4b54faaef1e6d5efc6174849c1b54983908084659f525c7f40f","api_webgl/extensions/proposals/WEBGL_texture_multisample/extension.xml":"338f0fc6f62bf875a0f7b19e4c284ed48e5a76e791e55414843659cf402636da","api_webgl/extensions/proposals/WEBGL_texture_source_iframe/extension.xml":"378beada6abe201a0ebdb68a3935e8bf27f620ae2653d696a38df9e499808eda","api_webgl/extensions/proposals/WEBGL_video_texture/extension.xml":"b9e0ffa1cf37c827b9be82d71adcd40ce44d05e434a87d174b289c7a5b9d30b0","api_webgl/extensions/rejected/EXT_texture_storage/extension.xml":"9fb3883d1b6d73e09b03129a30845031e0b27c9003b9fb0e2f2b2b2d5a9dbb1e","api_webgl/extensions/rejected/OES_depth24/extension.xml":"159c541fc025c3d454887cdedd1ff5c19ed17e9356c63d95510d70c586502af7","api_webgl/extensions/rejected/WEBGL_debug_shader_precision/extension.xml":"f618d6f82e21cf78146e86c396a3d7b3dd51cf778ab2dc7a504834d835abc5c8","api_webgl/extensions/rejected/WEBGL_draw_elements_no_range_check/extension.xml":"a3a616760a9cca44ecca27e8a8afd49679974f1bf0dfd4624231bcffaf4aec54","api_webgl/extensions/rejected/WEBGL_subscribe_uniform/extension.xml":"7ec77103308177cdfa0efbc995f62151622c30bab46a4ee191e04520c51965ae","api_webgl/extensions/rejected/WEBGL_texture_from_depth_video/extension.xml":"eabf2a9003050f8ef5ceb4d5cc0fafc98977aef407fb4060d08d704884a3d462","api_webgl/extensions/template/extension.xml":"8da65e0a5d053bf36373c6fcfdf7d8fa2738c48345671cf61b62e30ba9cce117","api_webgl/specs/latest/1.0/webgl.idl":"9ffefd8ed7b99053f0db70966749e8f3d6398e1393367f2772dda6325daf3db8","api_webgl/specs/latest/2.0/webgl2.idl":"121a6d79dae3ce4483b60cf26ee2dbca2e402ad19658c0ba951a5726d49aed22","build.rs":"28156f946b5f8b2ac39237d8ff9070bae75eb0f8f6ac66e5df9c6a0998784d2b","src/lib.rs":"7f1378f4337b537d46a8d67f7224b2c2cc50a633d0326692711e3514374799f4"},"package":"037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554"}
\ No newline at end of file
+{"files":{"Cargo.toml":"0ed811576ec355ab9dad30d38a8531f5a66490fd91479202530d12520f10d14d","README.md":"45772358ebfb8a7554056ce7faab27c3dc73d881ba4be66891d39e4830657877","api/xml/gl.xml":"7dae830ddacefd2af92aef2b438ff89f90fb5496f596dec8282b212eb4fc51e3","api/xml/glx.xml":"338cee03c97e78aa167dd667407ab973f4bc656c58cf9002aa54fa78b2f9ff32","api/xml/wgl.xml":"41e0a2182217b099b1628757956cb103cea9660e830f4d2f9fa07bf3a3679feb","api_egl/api/egl.xml":"523fc17745545daca85c5b107b4a4c1a23dd3de39f70e499c77249e3dd6569ec","api_webgl/extensions/ANGLE_instanced_arrays/extension.xml":"213f7e7636e8df0c390a18ad1339618335d7744970837998a191c275f7d1a95c","api_webgl/extensions/EXT_blend_minmax/extension.xml":"d1798c0faf13dfa7930032994f5a47c07b6f2f44b45d033059bfcffb7c1d579c","api_webgl/extensions/EXT_color_buffer_float/extension.xml":"48dacbcce0e0e96c206fc6dd2050266680ba24c2f6b254c3a6871c8715639d36","api_webgl/extensions/EXT_color_buffer_half_float/extension.xml":"1900351880046b495af97e6d38e9f3213538b133f74625a4dd73165d43e7710c","api_webgl/extensions/EXT_disjoint_timer_query/extension.xml":"5f3502d9359932bb19cb866ad01a35f774851e7290ef7cbafcaa0d67175a29d5","api_webgl/extensions/EXT_disjoint_timer_query_webgl2/extension.xml":"81f643d90164e86c2a98b4053d7f8db233dc3c3339422f3f575df7da9ba8a518","api_webgl/extensions/EXT_float_blend/extension.xml":"5a298482adee7bb1fcc8f613a8aa9b61bb71bf5523fac56da45bb68136e451b8","api_webgl/extensions/EXT_frag_depth/extension.xml":"d19cf823811272352972ac4cb1d37405dcf63a91c48c1dd046e475487fecf9ea","api_webgl/extensions/EXT_sRGB/extension.xml":"7688ba25fa05558fbae72b21661e5bece2c36e899fe78da83bc8a172db9622fd","api_webgl/extensions/EXT_shader_texture_lod/extension.xml":"f1e5741d5d12d6e9a6bbc95049da2ec62ee55a4d1b6ec7b03e87e9f91282c6cb","api_webgl/extensions/EXT_texture_compression_bptc/extension.xml":"823b0280845da20a584b3ad6e85052bb158c4e69add38c3f80899facdf9fda90","api_webgl/extensions/EXT_texture_compression_rgtc/extension.xml":"6b95c30aa46b81a4bcde2a07df0c89cded028387ee1cc3a7e5d0aabf5f0d219e","api_webgl/extensions/EXT_texture_filter_anisotropic/extension.xml":"131ed0429a9951c05ae5c30859179f47c99b9bd6f47ca2825bdecf791f0188b6","api_webgl/extensions/KHR_parallel_shader_compile/extension.xml":"6e13b581cae0c8a6f41a484d98e55bb805b599081f54cfe737253238fe797395","api_webgl/extensions/OES_element_index_uint/extension.xml":"734f7a90af440ea559fa0fe777144aaef8acc7de94a8c3ce153a75ff85cb1f6b","api_webgl/extensions/OES_fbo_render_mipmap/extension.xml":"43bede667b814b80e15b5af463620c53f6fa9e1a610c2e9756ad2fa55b9f7589","api_webgl/extensions/OES_standard_derivatives/extension.xml":"2fa53259457d9f6042194bfb13c0db4b3c63d2d99d9e44f057d8fe4d5b28fe69","api_webgl/extensions/OES_texture_float/extension.xml":"42a782fcc2cafd3df9ea33c9259343c66b3fbd2ebfc216dc20ee6be53481f042","api_webgl/extensions/OES_texture_float_linear/extension.xml":"98041c4427f5abf741eb2c34e23f9b8c84090d4d5b4e2e0f1b04f9b53c73259a","api_webgl/extensions/OES_texture_half_float/extension.xml":"14cb4ce4e6f259fcb6ce0d988c4e81880299f28343cdcba4f7abbf8956207529","api_webgl/extensions/OES_texture_half_float_linear/extension.xml":"d2f29c9a9bf31e757fc8c6da277cdb813350a1504be773c3bd105bfa92e45502","api_webgl/extensions/OES_vertex_array_object/extension.xml":"8262ec860c2af3b23daacc27a17bcf29054bcc03baf59f90779c4e53fc469f41","api_webgl/extensions/WEBGL_color_buffer_float/extension.xml":"d68800fe416384a951fe45fdbcb324494d848cbecdecbdcacf7bbafe8a2aae93","api_webgl/extensions/WEBGL_compressed_texture_astc/extension.xml":"9ba9c29e7e09aa8ec950ec70c79eae42c6f844d354b49fc88d9f048318a9c400","api_webgl/extensions/WEBGL_compressed_texture_etc/extension.xml":"d926f0a7f533ea6ce43215a7e90f35064e1a51df539e04c49a2e918f69943aad","api_webgl/extensions/WEBGL_compressed_texture_etc1/extension.xml":"02a008b04a5b40e274023defe3a2fb94f06a2150c059ae703c282faa6b6b4b0e","api_webgl/extensions/WEBGL_compressed_texture_pvrtc/extension.xml":"1570f8ebb56480908e46706683182a097928e8e0a2e992e3eab8f1a2c16124c9","api_webgl/extensions/WEBGL_compressed_texture_s3tc/extension.xml":"87585ba713ad1a8dd5c04fd24a7068a0cf88799ea697e940752c68698de0c707","api_webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/extension.xml":"e22e01bd35b437adabfc7592f5eb6d750fdaabac61b0f79561fe58e860843993","api_webgl/extensions/WEBGL_debug_renderer_info/extension.xml":"af71073e0031b0296b7e5b609cdd272458cbae434a7fa31649054be0969a72e0","api_webgl/extensions/WEBGL_debug_shaders/extension.xml":"fc8c59747ee8cc289aa269c6ac5b6a45f7dc036d509209ace8db7062481a1abe","api_webgl/extensions/WEBGL_depth_texture/extension.xml":"5d91c9b8252b9f3a19f3f6a2f861a660d200446cfcaf09fa2a337e6f6b2dd5bd","api_webgl/extensions/WEBGL_draw_buffers/extension.xml":"9b465aa066d86ba044ad1604f6a3ce9f9e9a3afe3b4d36750a60870a67697fa1","api_webgl/extensions/WEBGL_lose_context/extension.xml":"71defc6045fefdf7b14cd2d1fe4a432d504b2567e7acb1e77b8737aea7ba1bb0","api_webgl/extensions/WEBGL_multiview/extension.xml":"474fa0ccaa7150e32060fa9ff5357b43d08cfe34930118525a2e4bee698fda0a","api_webgl/extensions/WEBGL_security_sensitive_resources/extension.xml":"99634c2e0117d7abb9b44bbd64d8c4e8c8ebbcfe6342222dfc624b05e8532249","api_webgl/extensions/proposals/EXT_clip_cull_distance/extension.xml":"a4f9b465b1e1efa0367a8fbbada7a6156ffb3e4ee1c677a0d220a7ea1402a260","api_webgl/extensions/proposals/EXT_multi_draw_arrays/extension.xml":"47f3ab7d17e28152b7873db5da9afbee058a61caacebba6b7fd9df4a569683a3","api_webgl/extensions/proposals/WEBGL_blend_equation_advanced_coherent/extension.xml":"4c8d195e8cc21207e372ef596cfb58ada985289c6b1212fad912d8f0ad0563a8","api_webgl/extensions/proposals/WEBGL_debug/extension.xml":"c8cdbb65c17dfe4851e7a56094c492b835f76f06a9cdb1b3fd273584357864b1","api_webgl/extensions/proposals/WEBGL_dynamic_texture/extension.xml":"7f5bc906ba61037befd4acd9fc39209d2e4bd8eea20ba01f34ebe4700bfd1806","api_webgl/extensions/proposals/WEBGL_subarray_uploads/extension.xml":"87cde732f220d4b54faaef1e6d5efc6174849c1b54983908084659f525c7f40f","api_webgl/extensions/proposals/WEBGL_texture_multisample/extension.xml":"338f0fc6f62bf875a0f7b19e4c284ed48e5a76e791e55414843659cf402636da","api_webgl/extensions/proposals/WEBGL_texture_source_iframe/extension.xml":"378beada6abe201a0ebdb68a3935e8bf27f620ae2653d696a38df9e499808eda","api_webgl/extensions/proposals/WEBGL_video_texture/extension.xml":"b9e0ffa1cf37c827b9be82d71adcd40ce44d05e434a87d174b289c7a5b9d30b0","api_webgl/extensions/rejected/EXT_texture_storage/extension.xml":"9fb3883d1b6d73e09b03129a30845031e0b27c9003b9fb0e2f2b2b2d5a9dbb1e","api_webgl/extensions/rejected/OES_depth24/extension.xml":"159c541fc025c3d454887cdedd1ff5c19ed17e9356c63d95510d70c586502af7","api_webgl/extensions/rejected/WEBGL_compressed_texture_atc/extension.xml":"43eab8d74ffb5799f2410a884d79bd4574531070a53947c334d71910c5a9bdee","api_webgl/extensions/rejected/WEBGL_debug_shader_precision/extension.xml":"f618d6f82e21cf78146e86c396a3d7b3dd51cf778ab2dc7a504834d835abc5c8","api_webgl/extensions/rejected/WEBGL_draw_elements_no_range_check/extension.xml":"a3a616760a9cca44ecca27e8a8afd49679974f1bf0dfd4624231bcffaf4aec54","api_webgl/extensions/rejected/WEBGL_get_buffer_sub_data_async/extension.xml":"188b33f4972e400550bbd1be58f29d9a0bc24a8da09203edc2f3e6f1a595679b","api_webgl/extensions/rejected/WEBGL_shared_resources/extension.xml":"cab1d86d6c853c11acf42044c4caea97103c70440c87688979c9f1cc18d622a6","api_webgl/extensions/rejected/WEBGL_subscribe_uniform/extension.xml":"7ec77103308177cdfa0efbc995f62151622c30bab46a4ee191e04520c51965ae","api_webgl/extensions/rejected/WEBGL_texture_from_depth_video/extension.xml":"eabf2a9003050f8ef5ceb4d5cc0fafc98977aef407fb4060d08d704884a3d462","api_webgl/extensions/template/extension.xml":"8da65e0a5d053bf36373c6fcfdf7d8fa2738c48345671cf61b62e30ba9cce117","api_webgl/specs/latest/1.0/webgl.idl":"9bd8707845fb68ff349f95b320582160423ee4cdf47294cbd980933b3b25dae9","api_webgl/specs/latest/2.0/webgl2.idl":"4e9ba68c298e76e85f312f86d474975da4ce656e35c2ad4a8c706437d50253a1","build.rs":"88b55daa5f6f0c90e1ab906c08b74834671316bdadc88d7cc25adfa19fc57e62","src/lib.rs":"7f1378f4337b537d46a8d67f7224b2c2cc50a633d0326692711e3514374799f4"},"package":"62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49"}
\ No newline at end of file
--- a/third_party/rust/khronos_api/Cargo.toml
+++ b/third_party/rust/khronos_api/Cargo.toml
@@ -7,19 +7,19 @@
 #
 # 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 = "khronos_api"
-version = "2.2.0"
+version = "3.0.0"
 authors = ["Brendan Zabarauskas <bjzaba@yahoo.com.au>", "Corey Richardson", "Arseny Kapoulkine", "Pierre Krieger <pierre.krieger1708@gmail.com>"]
 include = ["/README.md", "/src/**/*", "/Cargo.toml", "/build.rs", "/api/xml/**/*.xml", "/api_egl/api/**/*.xml", "/api_webgl/specs/latest/**/*.idl", "/api_webgl/extensions/**/extension.xml"]
 description = "The Khronos XML API Registry, exposed as byte string constants."
-homepage = "https://github.com/brendanzab/gl-rs/khronos_api/"
+homepage = "https://github.com/brendanzab/gl-rs/"
 documentation = "https://docs.rs/khronos_api"
 readme = "README.md"
 keywords = ["gl", "egl", "opengl", "khronos"]
 categories = ["rendering::graphics-api"]
 license = "Apache-2.0"
 repository = "https://github.com/brendanzab/gl-rs/"
--- a/third_party/rust/khronos_api/api/xml/gl.xml
+++ b/third_party/rust/khronos_api/api/xml/gl.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <registry>
     <comment>
-Copyright (c) 2013-2017 The Khronos Group Inc.
+Copyright (c) 2013-2018 The Khronos Group Inc.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
     http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
@@ -90,18 +90,18 @@ typedef unsigned __int64 uint64_t;
         <type name="GLhandleARB">#ifdef __APPLE__
 typedef void *GLhandleARB;
 #else
 typedef unsigned int GLhandleARB;
 #endif</type>
         <type>typedef unsigned short <name>GLhalfARB</name>;</type>
         <type>typedef unsigned short <name>GLhalf</name>;</type>
         <type comment="Must be 32 bits">typedef GLint <name>GLfixed</name>;</type>
-        <type requires="stddef">typedef ptrdiff_t <name>GLintptr</name>;</type>
-        <type requires="stddef">typedef ptrdiff_t <name>GLsizeiptr</name>;</type>
+        <type requires="khrplatform">typedef khronos_intptr_t <name>GLintptr</name>;</type>
+        <type requires="khrplatform">typedef khronos_ssize_t <name>GLsizeiptr</name>;</type>
         <type requires="inttypes">typedef int64_t <name>GLint64</name>;</type>
         <type requires="inttypes">typedef uint64_t <name>GLuint64</name>;</type>
         <type requires="stddef">typedef ptrdiff_t <name>GLintptrARB</name>;</type>
         <type requires="stddef">typedef ptrdiff_t <name>GLsizeiptrARB</name>;</type>
         <type requires="inttypes">typedef int64_t <name>GLint64EXT</name>;</type>
         <type requires="inttypes">typedef uint64_t <name>GLuint64EXT</name>;</type>
         <type>typedef struct __GLsync *<name>GLsync</name>;</type>
         <type comment="compatible with OpenCL cl_context"><name>struct _cl_context</name>;</type>
@@ -194,47 +194,84 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_LESS"/>
             <enum name="GL_NEVER"/>
             <enum name="GL_NOTEQUAL"/>
         </group>
 
         <group name="BlendEquationModeEXT">
             <enum name="GL_ALPHA_MAX_SGIX"/>
             <enum name="GL_ALPHA_MIN_SGIX"/>
+            <enum name="GL_FUNC_ADD"/>
             <enum name="GL_FUNC_ADD_EXT"/>
+            <enum name="GL_FUNC_REVERSE_SUBTRACT"/>
             <enum name="GL_FUNC_REVERSE_SUBTRACT_EXT"/>
+            <enum name="GL_FUNC_SUBTRACT"/>
             <enum name="GL_FUNC_SUBTRACT_EXT"/>
-            <enum name="GL_LOGIC_OP"/>
+            <enum name="GL_MAX"/>
             <enum name="GL_MAX_EXT"/>
+            <enum name="GL_MIN"/>
             <enum name="GL_MIN_EXT"/>
-            <enum name="GL_FUNC_ADD"/>
-            <enum name="GL_FUNC_REVERSE_SUBTRACT"/>
-            <enum name="GL_FUNC_SUBTRACT"/>
         </group>
 
         <group name="Boolean">
             <enum name="GL_FALSE"/>
             <enum name="GL_TRUE"/>
         </group>
 
+        <group name="BufferBitQCOM">
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT7_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT6_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT5_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT4_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT3_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT2_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT1_QCOM"/>
+            <enum name="GL_MULTISAMPLE_BUFFER_BIT0_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT7_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT6_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT5_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT4_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT3_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT2_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT1_QCOM"/>
+            <enum name="GL_STENCIL_BUFFER_BIT0_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT7_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT6_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT5_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT4_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT3_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT2_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT1_QCOM"/>
+            <enum name="GL_DEPTH_BUFFER_BIT0_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT7_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT6_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT5_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT4_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT3_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT2_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT1_QCOM"/>
+            <enum name="GL_COLOR_BUFFER_BIT0_QCOM"/>
+        </group>
+
         <group name="BufferTargetARB">
           <enum name="GL_ARRAY_BUFFER"/>
           <enum name="GL_ATOMIC_COUNTER_BUFFER" />
           <enum name="GL_COPY_READ_BUFFER" />
           <enum name="GL_COPY_WRITE_BUFFER" />
           <enum name="GL_DISPATCH_INDIRECT_BUFFER" />
           <enum name="GL_DRAW_INDIRECT_BUFFER" />
           <enum name="GL_ELEMENT_ARRAY_BUFFER" />
           <enum name="GL_PIXEL_PACK_BUFFER" />
           <enum name="GL_PIXEL_UNPACK_BUFFER" />
           <enum name="GL_QUERY_BUFFER" />
           <enum name="GL_SHADER_STORAGE_BUFFER" />
           <enum name="GL_TEXTURE_BUFFER" />
           <enum name="GL_TRANSFORM_FEEDBACK_BUFFER" />
           <enum name="GL_UNIFORM_BUFFER" />
+          <enum name="GL_PARAMETER_BUFFER" />
         </group>
 
         <group name="BufferUsageARB">
           <enum name="GL_STREAM_DRAW"/>
           <enum name="GL_STREAM_READ"/>
           <enum name="GL_STREAM_COPY"/>
           <enum name="GL_STATIC_DRAW"/>
           <enum name="GL_STATIC_READ"/>
@@ -245,16 +282,35 @@ typedef unsigned int GLhandleARB;
         </group>
 
         <group name="BufferAccessARB">
           <enum name="GL_READ_ONLY"/>
           <enum name="GL_WRITE_ONLY"/>
           <enum name="GL_READ_WRITE"/>
         </group>
 
+        <group name="BufferAccessMask">
+            <enum name="GL_MAP_COHERENT_BIT"/>
+            <enum name="GL_MAP_COHERENT_BIT_EXT"/>
+            <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/>
+            <enum name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/>
+            <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/>
+            <enum name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/>
+            <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/>
+            <enum name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/>
+            <enum name="GL_MAP_PERSISTENT_BIT"/>
+            <enum name="GL_MAP_PERSISTENT_BIT_EXT"/>
+            <enum name="GL_MAP_READ_BIT"/>
+            <enum name="GL_MAP_READ_BIT_EXT"/>
+            <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/>
+            <enum name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/>
+            <enum name="GL_MAP_WRITE_BIT"/>
+            <enum name="GL_MAP_WRITE_BIT_EXT"/>
+        </group>
+
         <group name="ClearBufferMask">
             <enum name="GL_ACCUM_BUFFER_BIT"/>
             <enum name="GL_COLOR_BUFFER_BIT"/>
             <enum name="GL_COVERAGE_BUFFER_BIT_NV"/>
             <enum name="GL_DEPTH_BUFFER_BIT"/>
             <enum name="GL_STENCIL_BUFFER_BIT"/>
         </group>
 
@@ -329,18 +385,21 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_PROXY_TEXTURE_COLOR_TABLE_SGI"/>
             <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/>
         </group>
 
         <group name="ContextFlagMask">
             <enum name="GL_CONTEXT_FLAG_DEBUG_BIT"/>
             <enum name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR"/>
             <enum name="GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT"/>
+            <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/>
             <enum name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB"/>
             <enum name="GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT"/>
+            <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT"/>
+            <enum name="GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR"/>
         </group>
 
         <group name="ContextProfileMask">
             <enum name="GL_CONTEXT_COMPATIBILITY_PROFILE_BIT"/>
             <enum name="GL_CONTEXT_CORE_PROFILE_BIT"/>
         </group>
 
         <group name="ConvolutionBorderModeEXT">
@@ -716,40 +775,49 @@ typedef unsigned int GLhandleARB;
         </group>
 
         <group name="GetPName">
             <enum name="GL_ACCUM_ALPHA_BITS"/>
             <enum name="GL_ACCUM_BLUE_BITS"/>
             <enum name="GL_ACCUM_CLEAR_VALUE"/>
             <enum name="GL_ACCUM_GREEN_BITS"/>
             <enum name="GL_ACCUM_RED_BITS"/>
+            <enum name="GL_ACTIVE_TEXTURE"/>
             <enum name="GL_ALIASED_LINE_WIDTH_RANGE"/>
             <enum name="GL_ALIASED_POINT_SIZE_RANGE"/>
             <enum name="GL_ALPHA_BIAS"/>
             <enum name="GL_ALPHA_BITS"/>
             <enum name="GL_ALPHA_SCALE"/>
             <enum name="GL_ALPHA_TEST"/>
             <enum name="GL_ALPHA_TEST_FUNC"/>
             <enum name="GL_ALPHA_TEST_FUNC_QCOM"/>
             <enum name="GL_ALPHA_TEST_QCOM"/>
             <enum name="GL_ALPHA_TEST_REF"/>
             <enum name="GL_ALPHA_TEST_REF_QCOM"/>
+            <enum name="GL_ARRAY_BUFFER_BINDING"/>
             <enum name="GL_ASYNC_DRAW_PIXELS_SGIX"/>
             <enum name="GL_ASYNC_HISTOGRAM_SGIX"/>
             <enum name="GL_ASYNC_MARKER_SGIX"/>
             <enum name="GL_ASYNC_READ_PIXELS_SGIX"/>
             <enum name="GL_ASYNC_TEX_IMAGE_SGIX"/>
             <enum name="GL_ATTRIB_STACK_DEPTH"/>
             <enum name="GL_AUTO_NORMAL"/>
             <enum name="GL_AUX_BUFFERS"/>
             <enum name="GL_BLEND"/>
+            <enum name="GL_BLEND_COLOR"/>
             <enum name="GL_BLEND_COLOR_EXT"/>
             <enum name="GL_BLEND_DST"/>
+            <enum name="GL_BLEND_DST_ALPHA"/>
+            <enum name="GL_BLEND_DST_RGB"/>
+            <enum name="GL_BLEND_EQUATION_ALPHA"/>
             <enum name="GL_BLEND_EQUATION_EXT"/>
+            <enum name="GL_BLEND_EQUATION_RGB"/>
             <enum name="GL_BLEND_SRC"/>
+            <enum name="GL_BLEND_SRC_ALPHA"/>
+            <enum name="GL_BLEND_SRC_RGB"/>
             <enum name="GL_BLUE_BIAS"/>
             <enum name="GL_BLUE_BITS"/>
             <enum name="GL_BLUE_SCALE"/>
             <enum name="GL_CALLIGRAPHIC_FRAGMENT_SGIX"/>
             <enum name="GL_CLIENT_ATTRIB_STACK_DEPTH"/>
             <enum name="GL_CLIP_PLANE0"/>
             <enum name="GL_CLIP_PLANE1"/>
             <enum name="GL_CLIP_PLANE2"/>
@@ -765,54 +833,61 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_COLOR_LOGIC_OP"/>
             <enum name="GL_COLOR_MATERIAL"/>
             <enum name="GL_COLOR_MATERIAL_FACE"/>
             <enum name="GL_COLOR_MATERIAL_PARAMETER"/>
             <enum name="GL_COLOR_MATRIX_SGI"/>
             <enum name="GL_COLOR_MATRIX_STACK_DEPTH_SGI"/>
             <enum name="GL_COLOR_TABLE_SGI"/>
             <enum name="GL_COLOR_WRITEMASK"/>
+            <enum name="GL_COMPRESSED_TEXTURE_FORMATS"/>
+            <enum name="GL_CONTEXT_FLAGS"/>
             <enum name="GL_CONVOLUTION_1D_EXT"/>
             <enum name="GL_CONVOLUTION_2D_EXT"/>
             <enum name="GL_CONVOLUTION_HINT_SGIX"/>
             <enum name="GL_CULL_FACE"/>
             <enum name="GL_CULL_FACE_MODE"/>
             <enum name="GL_CURRENT_COLOR"/>
             <enum name="GL_CURRENT_INDEX"/>
             <enum name="GL_CURRENT_NORMAL"/>
+            <enum name="GL_CURRENT_PROGRAM"/>
             <enum name="GL_CURRENT_RASTER_COLOR"/>
             <enum name="GL_CURRENT_RASTER_DISTANCE"/>
             <enum name="GL_CURRENT_RASTER_INDEX"/>
             <enum name="GL_CURRENT_RASTER_POSITION"/>
             <enum name="GL_CURRENT_RASTER_POSITION_VALID"/>
             <enum name="GL_CURRENT_RASTER_TEXTURE_COORDS"/>
             <enum name="GL_CURRENT_TEXTURE_COORDS"/>
+            <enum name="GL_DEBUG_GROUP_STACK_DEPTH"/>
             <enum name="GL_DEFORMATIONS_MASK_SGIX"/>
             <enum name="GL_DEPTH_BIAS"/>
             <enum name="GL_DEPTH_BITS"/>
             <enum name="GL_DEPTH_CLEAR_VALUE"/>
             <enum name="GL_DEPTH_FUNC"/>
             <enum name="GL_DEPTH_RANGE"/>
             <enum name="GL_DEPTH_SCALE"/>
             <enum name="GL_DEPTH_TEST"/>
             <enum name="GL_DEPTH_WRITEMASK"/>
             <enum name="GL_DETAIL_TEXTURE_2D_BINDING_SGIS"/>
             <enum name="GL_DEVICE_LUID_EXT"/>
             <enum name="GL_DEVICE_NODE_MASK_EXT"/>
             <enum name="GL_DEVICE_UUID_EXT"/>
+            <enum name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/>
             <enum name="GL_DISTANCE_ATTENUATION_SGIS"/>
             <enum name="GL_DITHER"/>
             <enum name="GL_DOUBLEBUFFER"/>
             <enum name="GL_DRAW_BUFFER"/>
             <enum name="GL_DRAW_BUFFER_EXT"/>
+            <enum name="GL_DRAW_FRAMEBUFFER_BINDING"/>
             <enum name="GL_DRIVER_UUID_EXT"/>
             <enum name="GL_EDGE_FLAG"/>
             <enum name="GL_EDGE_FLAG_ARRAY"/>
             <enum name="GL_EDGE_FLAG_ARRAY_COUNT_EXT"/>
             <enum name="GL_EDGE_FLAG_ARRAY_STRIDE"/>
+            <enum name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/>
             <enum name="GL_FEEDBACK_BUFFER_SIZE"/>
             <enum name="GL_FEEDBACK_BUFFER_TYPE"/>
             <enum name="GL_FOG"/>
             <enum name="GL_FOG_COLOR"/>
             <enum name="GL_FOG_DENSITY"/>
             <enum name="GL_FOG_END"/>
             <enum name="GL_FOG_FUNC_POINTS_SGIS"/>
             <enum name="GL_FOG_HINT"/>
@@ -825,38 +900,42 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX"/>
             <enum name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHT0_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHTING_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX"/>
             <enum name="GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX"/>
+            <enum name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/>
             <enum name="GL_FRAMEZOOM_FACTOR_SGIX"/>
             <enum name="GL_FRAMEZOOM_SGIX"/>
             <enum name="GL_FRONT_FACE"/>
             <enum name="GL_GENERATE_MIPMAP_HINT_SGIS"/>
             <enum name="GL_GREEN_BIAS"/>
             <enum name="GL_GREEN_BITS"/>
             <enum name="GL_GREEN_SCALE"/>
             <enum name="GL_HISTOGRAM_EXT"/>
+            <enum name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/>
+            <enum name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/>
             <enum name="GL_INDEX_ARRAY"/>
             <enum name="GL_INDEX_ARRAY_COUNT_EXT"/>
             <enum name="GL_INDEX_ARRAY_STRIDE"/>
             <enum name="GL_INDEX_ARRAY_TYPE"/>
             <enum name="GL_INDEX_BITS"/>
             <enum name="GL_INDEX_CLEAR_VALUE"/>
             <enum name="GL_INDEX_LOGIC_OP"/>
             <enum name="GL_INDEX_MODE"/>
             <enum name="GL_INDEX_OFFSET"/>
             <enum name="GL_INDEX_SHIFT"/>
             <enum name="GL_INDEX_WRITEMASK"/>
             <enum name="GL_INSTRUMENT_MEASUREMENTS_SGIX"/>
             <enum name="GL_INTERLACE_SGIX"/>
             <enum name="GL_IR_INSTRUMENT1_SGIX"/>
+            <enum name="GL_LAYER_PROVOKING_VERTEX"/>
             <enum name="GL_LIGHT0"/>
             <enum name="GL_LIGHT1"/>
             <enum name="GL_LIGHT2"/>
             <enum name="GL_LIGHT3"/>
             <enum name="GL_LIGHT4"/>
             <enum name="GL_LIGHT5"/>
             <enum name="GL_LIGHT6"/>
             <enum name="GL_LIGHT7"/>
@@ -874,16 +953,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_LINE_WIDTH"/>
             <enum name="GL_LINE_WIDTH_GRANULARITY"/>
             <enum name="GL_LINE_WIDTH_RANGE"/>
             <enum name="GL_LIST_BASE"/>
             <enum name="GL_LIST_INDEX"/>
             <enum name="GL_LIST_MODE"/>
             <enum name="GL_LOGIC_OP"/>
             <enum name="GL_LOGIC_OP_MODE"/>
+            <enum name="GL_MAJOR_VERSION"/>
             <enum name="GL_MAP1_COLOR_4"/>
             <enum name="GL_MAP1_GRID_DOMAIN"/>
             <enum name="GL_MAP1_GRID_SEGMENTS"/>
             <enum name="GL_MAP1_INDEX"/>
             <enum name="GL_MAP1_NORMAL"/>
             <enum name="GL_MAP1_TEXTURE_COORD_1"/>
             <enum name="GL_MAP1_TEXTURE_COORD_2"/>
             <enum name="GL_MAP1_TEXTURE_COORD_3"/>
@@ -899,63 +979,149 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_MAP2_TEXTURE_COORD_2"/>
             <enum name="GL_MAP2_TEXTURE_COORD_3"/>
             <enum name="GL_MAP2_TEXTURE_COORD_4"/>
             <enum name="GL_MAP2_VERTEX_3"/>
             <enum name="GL_MAP2_VERTEX_4"/>
             <enum name="GL_MAP_COLOR"/>
             <enum name="GL_MAP_STENCIL"/>
             <enum name="GL_MATRIX_MODE"/>
+            <enum name="GL_MAX_3D_TEXTURE_SIZE"/>
             <enum name="GL_MAX_3D_TEXTURE_SIZE_EXT"/>
             <enum name="GL_MAX_4D_TEXTURE_SIZE_SGIS"/>
             <enum name="GL_MAX_ACTIVE_LIGHTS_SGIX"/>
+            <enum name="GL_MAX_ARRAY_TEXTURE_LAYERS"/>
             <enum name="GL_MAX_ASYNC_DRAW_PIXELS_SGIX"/>
             <enum name="GL_MAX_ASYNC_HISTOGRAM_SGIX"/>
             <enum name="GL_MAX_ASYNC_READ_PIXELS_SGIX"/>
             <enum name="GL_MAX_ASYNC_TEX_IMAGE_SGIX"/>
             <enum name="GL_MAX_ATTRIB_STACK_DEPTH"/>
             <enum name="GL_MAX_CLIENT_ATTRIB_STACK_DEPTH"/>
             <enum name="GL_MAX_CLIPMAP_DEPTH_SGIX"/>
             <enum name="GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX"/>
             <enum name="GL_MAX_CLIP_DISTANCES"/>
             <enum name="GL_MAX_CLIP_PLANES"/>
             <enum name="GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI"/>
+            <enum name="GL_MAX_COLOR_TEXTURE_SAMPLES"/>
+            <enum name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/>
+            <enum name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/>
+            <enum name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/>
+            <enum name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/>
+            <enum name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/>
+            <enum name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/>
+            <enum name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/>
+            <enum name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/>
+            <enum name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/>
+            <enum name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/>
+            <enum name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/>
+            <enum name="GL_MAX_DRAW_BUFFERS"/>
+            <enum name="GL_MAX_DUAL_SOURCE_DRAW_BUFFERS"/>
+            <enum name="GL_MAX_ELEMENTS_INDICES"/>
+            <enum name="GL_MAX_ELEMENTS_VERTICES"/>
+            <enum name="GL_MAX_ELEMENT_INDEX"/>
             <enum name="GL_MAX_EVAL_ORDER"/>
             <enum name="GL_MAX_FOG_FUNC_POINTS_SGIS"/>
+            <enum name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_FRAGMENT_INPUT_COMPONENTS"/>
             <enum name="GL_MAX_FRAGMENT_LIGHTS_SGIX"/>
+            <enum name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/>
+            <enum name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/>
+            <enum name="GL_MAX_FRAMEBUFFER_HEIGHT"/>
+            <enum name="GL_MAX_FRAMEBUFFER_LAYERS"/>
+            <enum name="GL_MAX_FRAMEBUFFER_SAMPLES"/>
+            <enum name="GL_MAX_FRAMEBUFFER_WIDTH"/>
             <enum name="GL_MAX_FRAMEZOOM_FACTOR_SGIX"/>
+            <enum name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_GEOMETRY_INPUT_COMPONENTS"/>
+            <enum name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS"/>
+            <enum name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS"/>
+            <enum name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/>
+            <enum name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_INTEGER_SAMPLES"/>
+            <enum name="GL_MAX_LABEL_LENGTH"/>
             <enum name="GL_MAX_LIGHTS"/>
             <enum name="GL_MAX_LIST_NESTING"/>
             <enum name="GL_MAX_MODELVIEW_STACK_DEPTH"/>
             <enum name="GL_MAX_NAME_STACK_DEPTH"/>
             <enum name="GL_MAX_PIXEL_MAP_TABLE"/>
+            <enum name="GL_MAX_PROGRAM_TEXEL_OFFSET"/>
             <enum name="GL_MAX_PROJECTION_STACK_DEPTH"/>
+            <enum name="GL_MAX_RECTANGLE_TEXTURE_SIZE"/>
+            <enum name="GL_MAX_RENDERBUFFER_SIZE"/>
+            <enum name="GL_MAX_SAMPLE_MASK_WORDS"/>
+            <enum name="GL_MAX_SERVER_WAIT_TIMEOUT"/>
+            <enum name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/>
+            <enum name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_TEXTURE_BUFFER_SIZE"/>
+            <enum name="GL_MAX_TEXTURE_IMAGE_UNITS"/>
+            <enum name="GL_MAX_TEXTURE_LOD_BIAS"/>
             <enum name="GL_MAX_TEXTURE_SIZE"/>
             <enum name="GL_MAX_TEXTURE_STACK_DEPTH"/>
+            <enum name="GL_MAX_UNIFORM_BLOCK_SIZE"/>
+            <enum name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/>
+            <enum name="GL_MAX_UNIFORM_LOCATIONS"/>
+            <enum name="GL_MAX_VARYING_COMPONENTS"/>
+            <enum name="GL_MAX_VARYING_FLOATS"/>
+            <enum name="GL_MAX_VARYING_VECTORS"/>
+            <enum name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/>
+            <enum name="GL_MAX_VERTEX_ATTRIBS"/>
+            <enum name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/>
+            <enum name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/>
+            <enum name="GL_MAX_VERTEX_OUTPUT_COMPONENTS"/>
+            <enum name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/>
+            <enum name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/>
+            <enum name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/>
+            <enum name="GL_MAX_VERTEX_UNIFORM_COMPONENTS"/>
+            <enum name="GL_MAX_VERTEX_UNIFORM_VECTORS"/>
+            <enum name="GL_MAX_VIEWPORTS"/>
             <enum name="GL_MAX_VIEWPORT_DIMS"/>
             <enum name="GL_MINMAX_EXT"/>
+            <enum name="GL_MINOR_VERSION"/>
+            <enum name="GL_MIN_MAP_BUFFER_ALIGNMENT"/>
+            <enum name="GL_MIN_PROGRAM_TEXEL_OFFSET"/>
             <enum name="GL_MODELVIEW0_MATRIX_EXT"/>
             <enum name="GL_MODELVIEW0_STACK_DEPTH_EXT"/>
             <enum name="GL_MODELVIEW_MATRIX"/>
             <enum name="GL_MODELVIEW_STACK_DEPTH"/>
             <enum name="GL_MULTISAMPLE_SGIS"/>
             <enum name="GL_NAME_STACK_DEPTH"/>
             <enum name="GL_NORMALIZE"/>
             <enum name="GL_NORMAL_ARRAY"/>
             <enum name="GL_NORMAL_ARRAY_COUNT_EXT"/>
             <enum name="GL_NORMAL_ARRAY_STRIDE"/>
             <enum name="GL_NORMAL_ARRAY_TYPE"/>
-            <enum name="GL_NUM_DEVICE_UUIDS"/>
+            <enum name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/>
+            <enum name="GL_NUM_DEVICE_UUIDS_EXT"/>
+            <enum name="GL_NUM_EXTENSIONS"/>
+            <enum name="GL_NUM_PROGRAM_BINARY_FORMATS"/>
+            <enum name="GL_NUM_SHADER_BINARY_FORMATS"/>
             <enum name="GL_PACK_ALIGNMENT"/>
             <enum name="GL_PACK_CMYK_HINT_EXT"/>
             <enum name="GL_PACK_IMAGE_DEPTH_SGIS"/>
+            <enum name="GL_PACK_IMAGE_HEIGHT"/>
             <enum name="GL_PACK_IMAGE_HEIGHT_EXT"/>
             <enum name="GL_PACK_LSB_FIRST"/>
             <enum name="GL_PACK_RESAMPLE_SGIX"/>
             <enum name="GL_PACK_ROW_LENGTH"/>
+            <enum name="GL_PACK_SKIP_IMAGES"/>
             <enum name="GL_PACK_SKIP_IMAGES_EXT"/>
             <enum name="GL_PACK_SKIP_PIXELS"/>
             <enum name="GL_PACK_SKIP_ROWS"/>
             <enum name="GL_PACK_SKIP_VOLUMES_SGIS"/>
             <enum name="GL_PACK_SUBSAMPLE_RATE_SGIX"/>
             <enum name="GL_PACK_SWAP_BYTES"/>
             <enum name="GL_PERSPECTIVE_CORRECTION_HINT"/>
             <enum name="GL_PIXEL_MAP_A_TO_A_SIZE"/>
@@ -963,27 +1129,30 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_PIXEL_MAP_G_TO_G_SIZE"/>
             <enum name="GL_PIXEL_MAP_I_TO_A_SIZE"/>
             <enum name="GL_PIXEL_MAP_I_TO_B_SIZE"/>
             <enum name="GL_PIXEL_MAP_I_TO_G_SIZE"/>
             <enum name="GL_PIXEL_MAP_I_TO_I_SIZE"/>
             <enum name="GL_PIXEL_MAP_I_TO_R_SIZE"/>
             <enum name="GL_PIXEL_MAP_R_TO_R_SIZE"/>
             <enum name="GL_PIXEL_MAP_S_TO_S_SIZE"/>
+            <enum name="GL_PIXEL_PACK_BUFFER_BINDING"/>
             <enum name="GL_PIXEL_TEXTURE_SGIS"/>
             <enum name="GL_PIXEL_TEX_GEN_MODE_SGIX"/>
             <enum name="GL_PIXEL_TEX_GEN_SGIX"/>
             <enum name="GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX"/>
             <enum name="GL_PIXEL_TILE_CACHE_INCREMENT_SGIX"/>
             <enum name="GL_PIXEL_TILE_CACHE_SIZE_SGIX"/>
             <enum name="GL_PIXEL_TILE_GRID_DEPTH_SGIX"/>
             <enum name="GL_PIXEL_TILE_GRID_HEIGHT_SGIX"/>
             <enum name="GL_PIXEL_TILE_GRID_WIDTH_SGIX"/>
             <enum name="GL_PIXEL_TILE_HEIGHT_SGIX"/>
             <enum name="GL_PIXEL_TILE_WIDTH_SGIX"/>
+            <enum name="GL_PIXEL_UNPACK_BUFFER_BINDING"/>
+            <enum name="GL_POINT_FADE_THRESHOLD_SIZE"/>
             <enum name="GL_POINT_FADE_THRESHOLD_SIZE_SGIS"/>
             <enum name="GL_POINT_SIZE"/>
             <enum name="GL_POINT_SIZE_GRANULARITY"/>
             <enum name="GL_POINT_SIZE_MAX_SGIS"/>
             <enum name="GL_POINT_SIZE_MIN_SGIS"/>
             <enum name="GL_POINT_SIZE_RANGE"/>
             <enum name="GL_POINT_SMOOTH"/>
             <enum name="GL_POINT_SMOOTH_HINT"/>
@@ -1012,51 +1181,75 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_POST_CONVOLUTION_BLUE_SCALE_EXT"/>
             <enum name="GL_POST_CONVOLUTION_COLOR_TABLE_SGI"/>
             <enum name="GL_POST_CONVOLUTION_GREEN_BIAS_EXT"/>
             <enum name="GL_POST_CONVOLUTION_GREEN_SCALE_EXT"/>
             <enum name="GL_POST_CONVOLUTION_RED_BIAS_EXT"/>
             <enum name="GL_POST_CONVOLUTION_RED_SCALE_EXT"/>
             <enum name="GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX"/>
             <enum name="GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX"/>
+            <enum name="GL_PRIMITIVE_RESTART_INDEX"/>
+            <enum name="GL_PROGRAM_BINARY_FORMATS"/>
+            <enum name="GL_PROGRAM_PIPELINE_BINDING"/>
+            <enum name="GL_PROGRAM_POINT_SIZE"/>
             <enum name="GL_PROJECTION_MATRIX"/>
             <enum name="GL_PROJECTION_STACK_DEPTH"/>
+            <enum name="GL_PROVOKING_VERTEX"/>
             <enum name="GL_READ_BUFFER"/>
             <enum name="GL_READ_BUFFER_EXT"/>
             <enum name="GL_READ_BUFFER_NV"/>
+            <enum name="GL_READ_FRAMEBUFFER_BINDING"/>
             <enum name="GL_RED_BIAS"/>
             <enum name="GL_RED_BITS"/>
             <enum name="GL_RED_SCALE"/>
             <enum name="GL_REFERENCE_PLANE_EQUATION_SGIX"/>
             <enum name="GL_REFERENCE_PLANE_SGIX"/>
+            <enum name="GL_RENDERBUFFER_BINDING"/>
             <enum name="GL_RENDER_MODE"/>
             <enum name="GL_RESCALE_NORMAL_EXT"/>
             <enum name="GL_RGBA_MODE"/>
+            <enum name="GL_SAMPLER_BINDING"/>
+            <enum name="GL_SAMPLES"/>
             <enum name="GL_SAMPLES_SGIS"/>
             <enum name="GL_SAMPLE_ALPHA_TO_MASK_SGIS"/>
             <enum name="GL_SAMPLE_ALPHA_TO_ONE_SGIS"/>
+            <enum name="GL_SAMPLE_BUFFERS"/>
             <enum name="GL_SAMPLE_BUFFERS_SGIS"/>
+            <enum name="GL_SAMPLE_COVERAGE_INVERT"/>
+            <enum name="GL_SAMPLE_COVERAGE_VALUE"/>
             <enum name="GL_SAMPLE_MASK_INVERT_SGIS"/>
             <enum name="GL_SAMPLE_MASK_SGIS"/>
             <enum name="GL_SAMPLE_MASK_VALUE_SGIS"/>
             <enum name="GL_SAMPLE_PATTERN_SGIS"/>
             <enum name="GL_SCISSOR_BOX"/>
             <enum name="GL_SCISSOR_TEST"/>
             <enum name="GL_SELECTION_BUFFER_SIZE"/>
             <enum name="GL_SEPARABLE_2D_EXT"/>
+            <enum name="GL_SHADER_COMPILER"/>
+            <enum name="GL_SHADER_STORAGE_BUFFER_BINDING"/>
+            <enum name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/>
+            <enum name="GL_SHADER_STORAGE_BUFFER_SIZE"/>
+            <enum name="GL_SHADER_STORAGE_BUFFER_START"/>
             <enum name="GL_SHADE_MODEL"/>
             <enum name="GL_SHARED_TEXTURE_PALETTE_EXT"/>
             <enum name="GL_SMOOTH_LINE_WIDTH_GRANULARITY"/>
             <enum name="GL_SMOOTH_LINE_WIDTH_RANGE"/>
             <enum name="GL_SMOOTH_POINT_SIZE_GRANULARITY"/>
             <enum name="GL_SMOOTH_POINT_SIZE_RANGE"/>
             <enum name="GL_SPRITE_AXIS_SGIX"/>
             <enum name="GL_SPRITE_MODE_SGIX"/>
             <enum name="GL_SPRITE_SGIX"/>
             <enum name="GL_SPRITE_TRANSLATION_SGIX"/>
+            <enum name="GL_STENCIL_BACK_FAIL"/>
+            <enum name="GL_STENCIL_BACK_FUNC"/>
+            <enum name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/>
+            <enum name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/>
+            <enum name="GL_STENCIL_BACK_REF"/>
+            <enum name="GL_STENCIL_BACK_VALUE_MASK"/>
+            <enum name="GL_STENCIL_BACK_WRITEMASK"/>
             <enum name="GL_STENCIL_BITS"/>
             <enum name="GL_STENCIL_CLEAR_VALUE"/>
             <enum name="GL_STENCIL_FAIL"/>
             <enum name="GL_STENCIL_FUNC"/>
             <enum name="GL_STENCIL_PASS_DEPTH_FAIL"/>
             <enum name="GL_STENCIL_PASS_DEPTH_PASS"/>
             <enum name="GL_STENCIL_REF"/>
             <enum name="GL_STENCIL_TEST"/>
@@ -1066,51 +1259,77 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_SUBPIXEL_BITS"/>
             <enum name="GL_TEXTURE_1D"/>
             <enum name="GL_TEXTURE_2D"/>
             <enum name="GL_TEXTURE_3D_BINDING_EXT"/>
             <enum name="GL_TEXTURE_3D_EXT"/>
             <enum name="GL_TEXTURE_4D_BINDING_SGIS"/>
             <enum name="GL_TEXTURE_4D_SGIS"/>
             <enum name="GL_TEXTURE_BINDING_1D"/>
+            <enum name="GL_TEXTURE_BINDING_1D_ARRAY"/>
             <enum name="GL_TEXTURE_BINDING_2D"/>
+            <enum name="GL_TEXTURE_BINDING_2D_ARRAY"/>
+            <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/>
+            <enum name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/>
             <enum name="GL_TEXTURE_BINDING_3D"/>
+            <enum name="GL_TEXTURE_BINDING_BUFFER"/>
+            <enum name="GL_TEXTURE_BINDING_CUBE_MAP"/>
+            <enum name="GL_TEXTURE_BINDING_RECTANGLE"/>
+            <enum name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/>
             <enum name="GL_TEXTURE_COLOR_TABLE_SGI"/>
+            <enum name="GL_TEXTURE_COMPRESSION_HINT"/>
             <enum name="GL_TEXTURE_COORD_ARRAY"/>
             <enum name="GL_TEXTURE_COORD_ARRAY_COUNT_EXT"/>
             <enum name="GL_TEXTURE_COORD_ARRAY_SIZE"/>
             <enum name="GL_TEXTURE_COORD_ARRAY_STRIDE"/>
             <enum name="GL_TEXTURE_COORD_ARRAY_TYPE"/>
             <enum name="GL_TEXTURE_GEN_Q"/>
             <enum name="GL_TEXTURE_GEN_R"/>
             <enum name="GL_TEXTURE_GEN_S"/>
             <enum name="GL_TEXTURE_GEN_T"/>
             <enum name="GL_TEXTURE_MATRIX"/>
             <enum name="GL_TEXTURE_STACK_DEPTH"/>
+            <enum name="GL_TIMESTAMP"/>
+            <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/>
+            <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/>
+            <enum name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/>
+            <enum name="GL_UNIFORM_BUFFER_BINDING"/>
+            <enum name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/>
+            <enum name="GL_UNIFORM_BUFFER_SIZE"/>
+            <enum name="GL_UNIFORM_BUFFER_START"/>
             <enum name="GL_UNPACK_ALIGNMENT"/>
             <enum name="GL_UNPACK_CMYK_HINT_EXT"/>
             <enum name="GL_UNPACK_IMAGE_DEPTH_SGIS"/>
+            <enum name="GL_UNPACK_IMAGE_HEIGHT"/>
             <enum name="GL_UNPACK_IMAGE_HEIGHT_EXT"/>
             <enum name="GL_UNPACK_LSB_FIRST"/>
             <enum name="GL_UNPACK_RESAMPLE_SGIX"/>
             <enum name="GL_UNPACK_ROW_LENGTH"/>
+            <enum name="GL_UNPACK_SKIP_IMAGES"/>
             <enum name="GL_UNPACK_SKIP_IMAGES_EXT"/>
             <enum name="GL_UNPACK_SKIP_PIXELS"/>
             <enum name="GL_UNPACK_SKIP_ROWS"/>
             <enum name="GL_UNPACK_SKIP_VOLUMES_SGIS"/>
             <enum name="GL_UNPACK_SUBSAMPLE_RATE_SGIX"/>
             <enum name="GL_UNPACK_SWAP_BYTES"/>
             <enum name="GL_VERTEX_ARRAY"/>
+            <enum name="GL_VERTEX_ARRAY_BINDING"/>
             <enum name="GL_VERTEX_ARRAY_COUNT_EXT"/>
             <enum name="GL_VERTEX_ARRAY_SIZE"/>
             <enum name="GL_VERTEX_ARRAY_STRIDE"/>
             <enum name="GL_VERTEX_ARRAY_TYPE"/>
+            <enum name="GL_VERTEX_BINDING_DIVISOR"/>
+            <enum name="GL_VERTEX_BINDING_OFFSET"/>
+            <enum name="GL_VERTEX_BINDING_STRIDE"/>
             <enum name="GL_VERTEX_PRECLIP_HINT_SGIX"/>
             <enum name="GL_VERTEX_PRECLIP_SGIX"/>
             <enum name="GL_VIEWPORT"/>
+            <enum name="GL_VIEWPORT_BOUNDS_RANGE"/>
+            <enum name="GL_VIEWPORT_INDEX_PROVOKING_VERTEX"/>
+            <enum name="GL_VIEWPORT_SUBPIXEL_BITS"/>
             <enum name="GL_ZOOM_X"/>
             <enum name="GL_ZOOM_Y"/>
         </group>
 
         <group name="GetPointervPName">
             <enum name="GL_COLOR_ARRAY_POINTER"/>
             <enum name="GL_COLOR_ARRAY_POINTER_EXT"/>
             <enum name="GL_EDGE_FLAG_ARRAY_POINTER"/>
@@ -1375,31 +1594,38 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_OR_INVERTED"/>
             <enum name="GL_OR_REVERSE"/>
             <enum name="GL_SET"/>
             <enum name="GL_XOR"/>
         </group>
 
         <group name="MapBufferUsageMask">
             <enum name="GL_CLIENT_STORAGE_BIT"/>
+            <enum name="GL_CLIENT_STORAGE_BIT_EXT"/>
             <enum name="GL_DYNAMIC_STORAGE_BIT"/>
+            <enum name="GL_DYNAMIC_STORAGE_BIT_EXT"/>
             <enum name="GL_MAP_COHERENT_BIT"/>
+            <enum name="GL_MAP_COHERENT_BIT_EXT"/>
             <enum name="GL_MAP_FLUSH_EXPLICIT_BIT"/>
             <enum name="GL_MAP_FLUSH_EXPLICIT_BIT_EXT"/>
             <enum name="GL_MAP_INVALIDATE_BUFFER_BIT"/>
             <enum name="GL_MAP_INVALIDATE_BUFFER_BIT_EXT"/>
             <enum name="GL_MAP_INVALIDATE_RANGE_BIT"/>
             <enum name="GL_MAP_INVALIDATE_RANGE_BIT_EXT"/>
             <enum name="GL_MAP_PERSISTENT_BIT"/>
+            <enum name="GL_MAP_PERSISTENT_BIT_EXT"/>
             <enum name="GL_MAP_READ_BIT"/>
             <enum name="GL_MAP_READ_BIT_EXT"/>
             <enum name="GL_MAP_UNSYNCHRONIZED_BIT"/>
             <enum name="GL_MAP_UNSYNCHRONIZED_BIT_EXT"/>
             <enum name="GL_MAP_WRITE_BIT"/>
             <enum name="GL_MAP_WRITE_BIT_EXT"/>
+            <enum name="GL_SPARSE_STORAGE_BIT_ARB"/>
+            <enum name="GL_LGPU_SEPARATE_STORAGE_BIT_NVX"/>
+            <enum name="GL_PER_GPU_STORAGE_BIT_NV"/>
         </group>
 
         <group name="MapTarget">
             <enum name="GL_GEOMETRY_DEFORMATION_SGIX"/>
             <enum name="GL_MAP1_COLOR_4"/>
             <enum name="GL_MAP1_INDEX"/>
             <enum name="GL_MAP1_NORMAL"/>
             <enum name="GL_MAP1_TEXTURE_COORD_1"/>
@@ -1452,16 +1678,17 @@ typedef unsigned int GLhandleARB;
         <group name="MemoryBarrierMask">
             <enum name="GL_ALL_BARRIER_BITS"/>
             <enum name="GL_ALL_BARRIER_BITS_EXT"/>
             <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT"/>
             <enum name="GL_ATOMIC_COUNTER_BARRIER_BIT_EXT"/>
             <enum name="GL_BUFFER_UPDATE_BARRIER_BIT"/>
             <enum name="GL_BUFFER_UPDATE_BARRIER_BIT_EXT"/>
             <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/>
+            <enum name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT"/>
             <enum name="GL_COMMAND_BARRIER_BIT"/>
             <enum name="GL_COMMAND_BARRIER_BIT_EXT"/>
             <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT"/>
             <enum name="GL_ELEMENT_ARRAY_BARRIER_BIT_EXT"/>
             <enum name="GL_FRAMEBUFFER_BARRIER_BIT"/>
             <enum name="GL_FRAMEBUFFER_BARRIER_BIT_EXT"/>
             <enum name="GL_PIXEL_BUFFER_BARRIER_BIT"/>
             <enum name="GL_PIXEL_BUFFER_BARRIER_BIT_EXT"/>
@@ -1518,43 +1745,55 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_DEPTH_EXT"/>
             <enum name="GL_STENCIL"/>
             <enum name="GL_STENCIL_EXT"/>
         </group>
 
         <group name="PixelFormat">
             <enum name="GL_ABGR_EXT"/>
             <enum name="GL_ALPHA"/>
+            <enum name="GL_BGR"/>
+            <enum name="GL_BGR_INTEGER"/>
+            <enum name="GL_BGRA"/>
+            <enum name="GL_BGRA_INTEGER"/>
             <enum name="GL_BLUE"/>
+            <enum name="GL_BLUE_INTEGER"/>
             <enum name="GL_CMYKA_EXT"/>
             <enum name="GL_CMYK_EXT"/>
             <enum name="GL_COLOR_INDEX"/>
             <enum name="GL_DEPTH_COMPONENT"/>
+            <enum name="GL_DEPTH_STENCIL"/>
             <enum name="GL_GREEN"/>
+            <enum name="GL_GREEN_INTEGER"/>
             <enum name="GL_LUMINANCE"/>
             <enum name="GL_LUMINANCE_ALPHA"/>
             <enum name="GL_RED"/>
             <enum name="GL_RED_EXT"/>
+            <enum name="GL_RED_INTEGER"/>
+            <enum name="GL_RG"/>
+            <enum name="GL_RG_INTEGER"/>
             <enum name="GL_RGB"/>
+            <enum name="GL_RGB_INTEGER"/>
             <enum name="GL_RGBA"/>
+            <enum name="GL_RGBA_INTEGER"/>
             <enum name="GL_STENCIL_INDEX"/>
             <enum name="GL_UNSIGNED_INT"/>
             <enum name="GL_UNSIGNED_SHORT"/>
             <enum name="GL_YCRCB_422_SGIX"/>
             <enum name="GL_YCRCB_444_SGIX"/>
         </group>
 
         <group name="InternalFormat" comment="Was PixelInternalFormat">
             <!-- Compatibility -->
             <enum name="GL_ALPHA12"/>
             <enum name="GL_ALPHA16"/>
-            <enum name="GL_ALPHA16_ICC_SGIX"/>
+            <!-- <enum name="GL_ALPHA16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_ALPHA4"/>
             <enum name="GL_ALPHA8"/>
-            <enum name="GL_ALPHA_ICC_SGIX"/>
+            <!-- <enum name="GL_ALPHA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_DUAL_ALPHA12_SGIS"/>
             <enum name="GL_DUAL_ALPHA16_SGIS"/>
             <enum name="GL_DUAL_ALPHA4_SGIS"/>
             <enum name="GL_DUAL_ALPHA8_SGIS"/>
             <enum name="GL_DUAL_INTENSITY12_SGIS"/>
             <enum name="GL_DUAL_INTENSITY16_SGIS"/>
             <enum name="GL_DUAL_INTENSITY4_SGIS"/>
             <enum name="GL_DUAL_INTENSITY8_SGIS"/>
@@ -1562,56 +1801,56 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_DUAL_LUMINANCE16_SGIS"/>
             <enum name="GL_DUAL_LUMINANCE4_SGIS"/>
             <enum name="GL_DUAL_LUMINANCE8_SGIS"/>
             <enum name="GL_DUAL_LUMINANCE_ALPHA4_SGIS"/>
             <enum name="GL_DUAL_LUMINANCE_ALPHA8_SGIS"/>
             <enum name="GL_INTENSITY"/>
             <enum name="GL_INTENSITY12"/>
             <enum name="GL_INTENSITY16"/>
-            <enum name="GL_INTENSITY16_ICC_SGIX"/>
+            <!-- <enum name="GL_INTENSITY16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_INTENSITY4"/>
             <enum name="GL_INTENSITY8"/>
-            <enum name="GL_INTENSITY_ICC_SGIX"/>
+            <!-- <enum name="GL_INTENSITY_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_LUMINANCE12"/>
             <enum name="GL_LUMINANCE12_ALPHA12"/>
             <enum name="GL_LUMINANCE12_ALPHA4"/>
             <enum name="GL_LUMINANCE16"/>
             <enum name="GL_LUMINANCE16_ALPHA16"/>
-            <enum name="GL_LUMINANCE16_ALPHA8_ICC_SGIX"/>
-            <enum name="GL_LUMINANCE16_ICC_SGIX"/>
+            <!-- <enum name="GL_LUMINANCE16_ALPHA8_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
+            <!-- <enum name="GL_LUMINANCE16_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_LUMINANCE4"/>
             <enum name="GL_LUMINANCE4_ALPHA4"/>
             <enum name="GL_LUMINANCE6_ALPHA2"/>
             <enum name="GL_LUMINANCE8"/>
             <enum name="GL_LUMINANCE8_ALPHA8"/>
-            <enum name="GL_LUMINANCE_ALPHA_ICC_SGIX"/>
-            <enum name="GL_LUMINANCE_ICC_SGIX"/>
+            <!-- <enum name="GL_LUMINANCE_ALPHA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
+            <!-- <enum name="GL_LUMINANCE_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <enum name="GL_QUAD_ALPHA4_SGIS"/>
             <enum name="GL_QUAD_ALPHA8_SGIS"/>
             <enum name="GL_QUAD_INTENSITY4_SGIS"/>
             <enum name="GL_QUAD_INTENSITY8_SGIS"/>
             <enum name="GL_QUAD_LUMINANCE4_SGIS"/>
             <enum name="GL_QUAD_LUMINANCE8_SGIS"/>
-            <enum name="GL_R5_G6_B5_A8_ICC_SGIX"/>
-            <enum name="GL_R5_G6_B5_ICC_SGIX"/>
-            <enum name="GL_RGBA_ICC_SGIX"/>
-            <enum name="GL_RGB_ICC_SGIX"/>
+            <!-- <enum name="GL_R5_G6_B5_A8_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
+            <!-- <enum name="GL_R5_G6_B5_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
+            <!-- <enum name="GL_RGBA_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
+            <!-- <enum name="GL_RGB_ICC_SGIX" comment="Incomplete extension SGIX_icc_texture"/> -->
             <!-- Base internal format: GL_RED -->
             <enum name="GL_RED"/>
             <enum name="GL_RED_EXT"/>
             <enum name="GL_R8"/>
             <enum name="GL_R8_EXT"/>
             <enum name="GL_R8_SNORM"/>
             <enum name="GL_R16"/>
             <enum name="GL_R16_EXT"/>
             <enum name="GL_R16_SNORM"/>
             <enum name="GL_R16_SNORM_EXT"/>
-            <enum name="GL_R32"/>
-            <enum name="GL_R32_EXT"/>
+            <!-- <enum name="GL_R32" comment="cut & paste error?"/> -->
+            <!-- <enum name="GL_R32_EXT" comment="cut & paste error?"/> -->
             <enum name="GL_R16F"/>
             <enum name="GL_R16F_EXT"/>
             <enum name="GL_R32F"/>
             <enum name="GL_R32F_EXT"/>
             <enum name="GL_R8I"/>
             <enum name="GL_R16I"/>
             <enum name="GL_R32I"/>
             <enum name="GL_R8UI"/>
@@ -1633,17 +1872,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_RG8I"/>
             <enum name="GL_RG16I"/>
             <enum name="GL_RG32I"/>
             <enum name="GL_RG8UI"/>
             <enum name="GL_RG16UI"/>
             <enum name="GL_RG32UI"/>
             <!-- Base internal format: GL_RGB -->
             <enum name="GL_RGB"/>
-            <enum name="GL_RGB2"/>
+            <!-- <enum name="GL_RGB2" comment="Never actually added to core"/> -->
             <enum name="GL_RGB2_EXT"/>
             <enum name="GL_RGB4"/>
             <enum name="GL_RGB4_EXT"/>
             <enum name="GL_RGB5"/>
             <enum name="GL_RGB5_EXT"/>
             <enum name="GL_RGB8"/>
             <enum name="GL_RGB8_EXT"/>
             <enum name="GL_RGB8_OES"/>
@@ -2056,31 +2295,38 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_LEQUAL"/>
             <enum name="GL_LESS"/>
             <enum name="GL_NEVER"/>
             <enum name="GL_NOTEQUAL"/>
         </group>
 
         <group name="StencilOp">
             <enum name="GL_DECR"/>
+            <enum name="GL_DECR_WRAP"/>
             <enum name="GL_INCR"/>
+            <enum name="GL_INCR_WRAP"/>
             <enum name="GL_INVERT"/>
             <enum name="GL_KEEP"/>
             <enum name="GL_REPLACE"/>
             <enum name="GL_ZERO"/>
         </group>
 
         <group name="StringName">
             <enum name="GL_EXTENSIONS"/>
             <enum name="GL_RENDERER"/>
             <enum name="GL_VENDOR"/>
             <enum name="GL_VERSION"/>
             <enum name="GL_SHADING_LANGUAGE_VERSION"/>
         </group>
 
+        <group name="SyncObjectMask">
+            <enum name="GL_SYNC_FLUSH_COMMANDS_BIT"/>
+            <enum name="GL_SYNC_FLUSH_COMMANDS_BIT_APPLE"/>
+        </group>
+
         <group name="TexCoordPointerType">
             <enum name="GL_DOUBLE"/>
             <enum name="GL_FLOAT"/>
             <enum name="GL_INT"/>
             <enum name="GL_SHORT"/>
         </group>
 
         <group name="TextureCoordName">
@@ -2234,16 +2480,20 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_TEXTURE_MAX_LEVEL_SGIS"/>
             <enum name="GL_TEXTURE_MAX_LOD_SGIS"/>
             <enum name="GL_TEXTURE_MIN_LOD_SGIS"/>
             <enum name="GL_TEXTURE_RED_SIZE"/>
             <enum name="GL_TEXTURE_RESIDENT"/>
             <enum name="GL_TEXTURE_WIDTH"/>
         </group>
 
+        <group name="TextureStorageMaskAMD">
+            <enum name="GL_TEXTURE_STORAGE_SPARSE_BIT_AMD"/>
+        </group>
+
         <group name="TextureTarget">
             <enum name="GL_DETAIL_TEXTURE_2D_SGIS"/>
             <enum name="GL_PROXY_TEXTURE_1D"/>
             <enum name="GL_PROXY_TEXTURE_1D_ARRAY"/>
             <enum name="GL_PROXY_TEXTURE_1D_ARRAY_EXT"/>
             <enum name="GL_PROXY_TEXTURE_1D_EXT"/>
             <enum name="GL_PROXY_TEXTURE_2D"/>
             <enum name="GL_PROXY_TEXTURE_2D_ARRAY"/>
@@ -2299,21 +2549,26 @@ typedef unsigned int GLhandleARB;
 
         <group name="UseProgramStageMask">
             <enum name="GL_VERTEX_SHADER_BIT"/>
             <enum name="GL_VERTEX_SHADER_BIT_EXT"/>
             <enum name="GL_FRAGMENT_SHADER_BIT"/>
             <enum name="GL_FRAGMENT_SHADER_BIT_EXT"/>
             <enum name="GL_GEOMETRY_SHADER_BIT"/>
             <enum name="GL_GEOMETRY_SHADER_BIT_EXT"/>
+            <enum name="GL_GEOMETRY_SHADER_BIT_OES"/>
             <enum name="GL_TESS_CONTROL_SHADER_BIT"/>
             <enum name="GL_TESS_CONTROL_SHADER_BIT_EXT"/>
+            <enum name="GL_TESS_CONTROL_SHADER_BIT_OES"/>
             <enum name="GL_TESS_EVALUATION_SHADER_BIT"/>
             <enum name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/>
+            <enum name="GL_TESS_EVALUATION_SHADER_BIT_OES"/>
             <enum name="GL_COMPUTE_SHADER_BIT"/>
+            <enum name="GL_MESH_SHADER_BIT_NV"/>
+            <enum name="GL_TASK_SHADER_BIT_NV"/>
             <enum name="GL_ALL_SHADER_BITS"/>
             <enum name="GL_ALL_SHADER_BITS_EXT"/>
         </group>
 
         <group name="VertexPointerType">
             <enum name="GL_DOUBLE"/>
             <enum name="GL_FLOAT"/>
             <enum name="GL_INT"/>
@@ -2385,16 +2640,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_COLOR_ATTACHMENT25"/>
             <enum name="GL_COLOR_ATTACHMENT26"/>
             <enum name="GL_COLOR_ATTACHMENT27"/>
             <enum name="GL_COLOR_ATTACHMENT28"/>
             <enum name="GL_COLOR_ATTACHMENT29"/>
             <enum name="GL_COLOR_ATTACHMENT30"/>
             <enum name="GL_COLOR_ATTACHMENT31"/>
             <enum name="GL_DEPTH_ATTACHMENT"/>
+            <enum name="GL_DEPTH_STENCIL_ATTACHMENT"/>
             <enum name="GL_DEPTH_ATTACHMENT_EXT"/>
             <enum name="GL_DEPTH_ATTACHMENT_OES"/>
         </group>
 
         <group name="RenderbufferTarget">
             <enum name="GL_RENDERBUFFER" />
         </group>
 
@@ -2491,16 +2747,20 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_SAMPLES_PASSED"/>
             <enum name="GL_ANY_SAMPLES_PASSED"/>
             <enum name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/>
             <enum name="GL_PRIMITIVES_GENERATED"/>
             <enum name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/>
             <enum name="GL_TIME_ELAPSED"/>
         </group>
 
+        <group name="QueryCounterTarget">
+            <enum name="GL_TIMESTAMP"/>
+        </group>
+
         <group name="ConvolutionTarget">
             <enum name="GL_CONVOLUTION_1D"/>
             <enum name="GL_CONVOLUTION_2D"/>
         </group>
 
         <group name="PathFillMode">
             <enum name="GL_INVERT"/>
             <enum name="GL_COUNT_UP_NV"/>
@@ -2576,19 +2836,19 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_DST_ALPHA"/>
             <enum name="GL_ONE_MINUS_DST_ALPHA"/>
             <enum name="GL_CONSTANT_COLOR"/>
             <enum name="GL_ONE_MINUS_CONSTANT_COLOR"/>
             <enum name="GL_CONSTANT_ALPHA"/>
             <enum name="GL_ONE_MINUS_CONSTANT_ALPHA"/>
             <enum name="GL_SRC_ALPHA_SATURATE"/>
             <enum name="GL_SRC1_COLOR"/>
-            <enum name="GL_ONE_MINUS_SRC_COLOR"/>
+            <enum name="GL_ONE_MINUS_SRC1_COLOR"/>
             <enum name="GL_SRC1_ALPHA"/>
-            <enum name="GL_ONE_MINUS_SRC_ALPHA"/>
+            <enum name="GL_ONE_MINUS_SRC1_ALPHA"/>
         </group>
 
         <group name="BindTransformFeedbackTarget">
             <enum name="GL_TRANSFORM_FEEDBACK"/>
         </group>
 
         <group name="BlitFramebufferFilter">
             <enum name="GL_NEAREST"/>
@@ -2653,21 +2913,23 @@ typedef unsigned int GLhandleARB;
 
         <group name="ShaderType">
             <enum name="GL_COMPUTE_SHADER"/>
             <enum name="GL_VERTEX_SHADER"/>
             <enum name="GL_TESS_CONTROL_SHADER"/>
             <enum name="GL_TESS_EVALUATION_SHADER"/>
             <enum name="GL_GEOMETRY_SHADER"/>
             <enum name="GL_FRAGMENT_SHADER"/>
+            <enum name="GL_FRAGMENT_SHADER_ARB"/>
+            <enum name="GL_VERTEX_SHADER_ARB"/>
         </group>
 
         <group name="DebugSource">
             <enum name="GL_DEBUG_SOURCE_API"/>
-            <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_"/>
+            <enum name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/>
             <enum name="GL_DEBUG_SOURCE_SHADER_COMPILER"/>
             <enum name="GL_DEBUG_SOURCE_THIRD_PARTY"/>
             <enum name="GL_DEBUG_SOURCE_APPLICATION"/>
             <enum name="GL_DEBUG_SOURCE_OTHER"/>
             <enum name="GL_DONT_CARE"/>
         </group>
 
         <group name="DebugType">
@@ -2682,16 +2944,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_DEBUG_TYPE_OTHER"/>
             <enum name="GL_DONT_CARE"/>
         </group>
 
         <group name="DebugSeverity">
             <enum name="GL_DEBUG_SEVERITY_LOW"/>
             <enum name="GL_DEBUG_SEVERITY_MEDIUM"/>
             <enum name="GL_DEBUG_SEVERITY_HIGH"/>
+            <enum name="GL_DEBUG_SEVERITY_NOTIFICATION"/>
             <enum name="GL_DONT_CARE"/>
         </group>
 
         <group name="SyncCondition">
             <enum name="GL_SYNC_GPU_COMMANDS_COMPLETE"/>
         </group>
 
         <group name="FogPName">
@@ -3178,17 +3441,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_PATH_DASH_OFFSET_NV" />
             <enum name="GL_PATH_CLIENT_LENGTH_NV" />
             <enum name="GL_PATH_DASH_OFFSET_RESET_NV" />
             <enum name="GL_PATH_FILL_MODE_NV" />
             <enum name="GL_PATH_FILL_MASK_NV" />
             <enum name="GL_PATH_FILL_COVER_MODE_NV" />
             <enum name="GL_PATH_STROKE_COVER_MODE_NV" />
             <enum name="GL_PATH_STROKE_MASK_NV" />
-            <enum name="GL_PATH_STROKE_BOUND_NV" />
+            <!-- <enum name="GL_PATH_STROKE_BOUND_NV" comment="Removed from extension"/> -->
             <enum name="GL_PATH_END_CAPS_NV" />
             <enum name="GL_PATH_DASH_CAPS_NV" />
             <enum name="GL_PATH_COMMAND_COUNT_NV" />
             <enum name="GL_PATH_COORD_COUNT_NV" />
             <enum name="GL_PATH_DASH_ARRAY_COUNT_NV" />
             <enum name="GL_PATH_COMPUTED_LENGTH_NV" />
             <enum name="GL_PATH_OBJECT_BOUNDING_BOX_NV" />
             <enum name="GL_PATH_FILL_BOUNDING_BOX_NV" />
@@ -3212,16 +3475,18 @@ typedef unsigned int GLhandleARB;
         <group name="TextureLayout">
             <enum name="GL_LAYOUT_GENERAL_EXT"/>
             <enum name="GL_LAYOUT_COLOR_ATTACHMENT_EXT"/>
             <enum name="GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT"/>
             <enum name="GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT"/>
             <enum name="GL_LAYOUT_SHADER_READ_ONLY_EXT"/>
             <enum name="GL_LAYOUT_TRANSFER_SRC_EXT"/>
             <enum name="GL_LAYOUT_TRANSFER_DST_EXT"/>
+            <enum name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/>
+            <enum name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/>
         </group>
 
         <group name="PathTransformType">
             <enum name="GL_NONE" />
             <enum name="GL_TRANSLATE_X_NV" />
             <enum name="GL_TRANSLATE_Y_NV" />
             <enum name="GL_TRANSLATE_2D_NV" />
             <enum name="GL_TRANSLATE_3D_NV" />
@@ -3333,16 +3598,20 @@ typedef unsigned int GLhandleARB;
         <enum value="0x00080000" name="GL_SCISSOR_BIT"/>
         <enum value="0x20000000" name="GL_MULTISAMPLE_BIT"/>
         <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_ARB"/>
         <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_EXT"/>
         <enum value="0x20000000" name="GL_MULTISAMPLE_BIT_3DFX"/>
         <enum value="0xFFFFFFFF" name="GL_ALL_ATTRIB_BITS" comment="Guaranteed to mark all attribute groups at once"/>
     </enums>
 
+    <enums namespace="GL" group="BufferAccessMask" type="bitmask" comment="GL_MAP_{COHERENT,FLUSH_EXPLICIT,INVALIDATE_BUFFER,INVALIDATE_RANGE,PERSISTENT,READ,UNSYNCHRONIZED,WRITE}_{BIT,BIT_EXT} also lie in this namespace">
+      <!-- Also used: 0x000000ff for bits reused from MapBufferUsageMask below -->
+    </enums>
+
     <enums namespace="GL" group="ClearBufferMask" type="bitmask" comment="GL_{DEPTH,ACCUM,STENCIL,COLOR}_BUFFER_BIT also lie in this namespace">
         <enum value="0x00008000" name="GL_COVERAGE_BUFFER_BIT_NV" comment="Collides with AttribMask bit GL_HINT_BIT. OK since this token is for OpenGL ES 2, which doesn't have attribute groups."/>
             <!-- Also used: 0x00004700 for bits reused from AttribMask above -->
     </enums>
 
     <enums namespace="GL" group="ClientAttribMask" type="bitmask">
         <enum value="0x00000001" name="GL_CLIENT_PIXEL_STORE_BIT"/>
         <enum value="0x00000002" name="GL_CLIENT_VERTEX_ARRAY_BIT"/>
@@ -3384,16 +3653,18 @@ typedef unsigned int GLhandleARB;
         <enum value="0x0080" name="GL_MAP_COHERENT_BIT_EXT"/>
         <enum value="0x0100" name="GL_DYNAMIC_STORAGE_BIT"/>
         <enum value="0x0100" name="GL_DYNAMIC_STORAGE_BIT_EXT"/>
         <enum value="0x0200" name="GL_CLIENT_STORAGE_BIT"/>
         <enum value="0x0200" name="GL_CLIENT_STORAGE_BIT_EXT"/>
         <enum value="0x0400" name="GL_SPARSE_STORAGE_BIT_ARB"/>
         <enum value="0x0800" name="GL_LGPU_SEPARATE_STORAGE_BIT_NVX"/>
         <enum value="0x0800" name="GL_PER_GPU_STORAGE_BIT_NV"/>
+            <unused start="0x1000" end="0x1000" comment="Reserved for NVIDIA"/>
+        <enum value="0x2000" name="GL_EXTERNAL_STORAGE_BIT_NVX"/>
     </enums>
 
     <enums namespace="GL" group="MemoryBarrierMask" type="bitmask">
         <enum value="0x00000001" name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT"/>
         <enum value="0x00000001" name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT"/>
         <enum value="0x00000002" name="GL_ELEMENT_ARRAY_BARRIER_BIT"/>
         <enum value="0x00000002" name="GL_ELEMENT_ARRAY_BARRIER_BIT_EXT"/>
         <enum value="0x00000004" name="GL_UNIFORM_BARRIER_BIT"/>
@@ -3420,17 +3691,17 @@ typedef unsigned int GLhandleARB;
         <enum value="0x00002000" name="GL_SHADER_STORAGE_BARRIER_BIT"/>
         <enum value="0x00004000" name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT"/>
         <enum value="0x00004000" name="GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT"/>
         <enum value="0x00008000" name="GL_QUERY_BUFFER_BARRIER_BIT"/>
         <enum value="0xFFFFFFFF" name="GL_ALL_BARRIER_BITS"/>
         <enum value="0xFFFFFFFF" name="GL_ALL_BARRIER_BITS_EXT"/>
     </enums>
 
-    <enums namespace="OcclusionQueryEventMaskAMD">
+    <enums namespace="GL" group="OcclusionQueryEventMaskAMD" type="bitmask">
         <enum value="0x00000001" name="GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD"/>
         <enum value="0x00000002" name="GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD"/>
         <enum value="0x00000004" name="GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD"/>
         <enum value="0x00000008" name="GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD"/>
         <enum value="0xFFFFFFFF" name="GL_QUERY_ALL_EVENT_BITS_AMD"/>
     </enums>
 
     <enums namespace="GL" group="SyncObjectMask" type="bitmask">
@@ -3448,16 +3719,18 @@ typedef unsigned int GLhandleARB;
         <enum value="0x00000004" name="GL_GEOMETRY_SHADER_BIT_OES"/>
         <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT"/>
         <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT_EXT"/>
         <enum value="0x00000008" name="GL_TESS_CONTROL_SHADER_BIT_OES"/>
         <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT"/>
         <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/>
         <enum value="0x00000010" name="GL_TESS_EVALUATION_SHADER_BIT_OES"/>
         <enum value="0x00000020" name="GL_COMPUTE_SHADER_BIT"/>
+        <enum value="0x00000040" name="GL_MESH_SHADER_BIT_NV"/>
+        <enum value="0x00000080" name="GL_TASK_SHADER_BIT_NV"/>
         <enum value="0xFFFFFFFF" name="GL_ALL_SHADER_BITS"/>
         <enum value="0xFFFFFFFF" name="GL_ALL_SHADER_BITS_EXT"/>
     </enums>
 
     <!-- Bitmasks defined by vendor extensions -->
 
     <enums namespace="GL" group="TextureStorageMaskAMD" type="bitmask">
         <enum value="0x00000001" name="GL_TEXTURE_STORAGE_SPARSE_BIT_AMD"/>
@@ -3583,16 +3856,17 @@ typedef unsigned int GLhandleARB;
         <enum value="0x20000000" name="GL_MULTISAMPLE_BUFFER_BIT5_QCOM"/>
         <enum value="0x40000000" name="GL_MULTISAMPLE_BUFFER_BIT6_QCOM"/>
         <enum value="0x80000000" name="GL_MULTISAMPLE_BUFFER_BIT7_QCOM"/>
     </enums>
 
     <enums namespace="GL" group="FoveationConfigBitQCOM" type="bitmask">
         <enum value="0x00000001" name="GL_FOVEATION_ENABLE_BIT_QCOM"/>
         <enum value="0x00000002" name="GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM"/>
+        <enum value="0x00000004" name="GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM"/>
     </enums>
 
     <enums namespace="GL" group="FfdMaskSGIX" type="bitmask">
         <enum value="0x00000001" name="GL_TEXTURE_DEFORMATION_BIT_SGIX"/>
         <enum value="0x00000002" name="GL_GEOMETRY_DEFORMATION_BIT_SGIX"/>
     </enums>
 
 
@@ -5490,17 +5764,18 @@ typedef unsigned int GLhandleARB;
         <enum value="0x82F9" name="GL_MAX_CULL_DISTANCES"/>
         <enum value="0x82F9" name="GL_MAX_CULL_DISTANCES_EXT" alias="GL_MAX_CULL_DISTANCES"/>
         <enum value="0x82FA" name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/>
         <enum value="0x82FA" name="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT" alias="GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES"/>
         <enum value="0x82FB" name="GL_CONTEXT_RELEASE_BEHAVIOR"/>
         <enum value="0x82FB" name="GL_CONTEXT_RELEASE_BEHAVIOR_KHR"/>
         <enum value="0x82FC" name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH"/>
         <enum value="0x82FC" name="GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR"/>
-            <unused start="0x82FD" end="0x830F" vendor="ARB"/>
+        <enum value="0x82FD" name="GL_ROBUST_GPU_TIMEOUT_MS_KHR" comment="Reserved for future"/>
+            <unused start="0x82FE" end="0x830F" vendor="ARB"/>
     </enums>
 
     <enums namespace="GL" start="0x8310" end="0x832F" vendor="SGI">
         <enum value="0x8310" name="GL_DEPTH_PASS_INSTRUMENT_SGIX"/>
         <enum value="0x8311" name="GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX"/>
         <enum value="0x8312" name="GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX"/>
         <enum value="0x8313" name="GL_FRAGMENTS_INSTRUMENT_SGIX"/>
         <enum value="0x8314" name="GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX"/>
@@ -5686,17 +5961,18 @@ typedef unsigned int GLhandleARB;
         <enum value="0x83F4" name="GL_PARALLEL_ARRAYS_INTEL"/>
         <enum value="0x83F5" name="GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL"/>
         <enum value="0x83F6" name="GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL"/>
         <enum value="0x83F7" name="GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL"/>
         <enum value="0x83F8" name="GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL"/>
         <enum value="0x83F9" name="GL_PERFQUERY_DONOT_FLUSH_INTEL"/>
         <enum value="0x83FA" name="GL_PERFQUERY_FLUSH_INTEL"/>
         <enum value="0x83FB" name="GL_PERFQUERY_WAIT_INTEL"/>
-            <unused start="0x83FC" end="0x83FD" vendor="INTEL"/>
+        <enum value="0x83FC" name="GL_BLACKHOLE_RENDER_INTEL"/>
+            <unused start="0x83FD" vendor="INTEL"/>
         <enum value="0x83FE" name="GL_CONSERVATIVE_RASTERIZATION_INTEL"/>
         <enum value="0x83FF" name="GL_TEXTURE_MEMORY_LAYOUT_INTEL"/>
     </enums>
 
     <enums namespace="GL" start="0x8400" end="0x846F" vendor="SGI">
         <enum value="0x8400" name="GL_FRAGMENT_LIGHTING_SGIX"/>
         <enum value="0x8401" name="GL_FRAGMENT_COLOR_MATERIAL_SGIX"/>
         <enum value="0x8402" name="GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX"/>
@@ -6673,17 +6949,17 @@ typedef unsigned int GLhandleARB;
         <enum value="0x8759" name="GL_TEXTURE_1D_STACK_MESAX"/>
         <enum value="0x875A" name="GL_DEBUG_PRINT_MESA" comment="NOT an alias. Accidental reuse of GL_TEXTURE_2D_STACK_MESAX"/>
         <enum value="0x875A" name="GL_TEXTURE_2D_STACK_MESAX"/>
         <enum value="0x875B" name="GL_DEBUG_ASSERT_MESA" comment="NOT an alias. Accidental reuse of GL_PROXY_TEXTURE_1D_STACK_MESAX"/>
         <enum value="0x875B" name="GL_PROXY_TEXTURE_1D_STACK_MESAX"/>
         <enum value="0x875C" name="GL_PROXY_TEXTURE_2D_STACK_MESAX"/>
         <enum value="0x875D" name="GL_TEXTURE_1D_STACK_BINDING_MESAX"/>
         <enum value="0x875E" name="GL_TEXTURE_2D_STACK_BINDING_MESAX"/>
-            <unused start="0x875F" vendor="MESA"/>
+        <enum value="0x875F" name="GL_PROGRAM_BINARY_FORMAT_MESA"/>
     </enums>
 
     <enums namespace="GL" start="0x8760" end="0x883F" vendor="AMD">
         <enum value="0x8760" name="GL_STATIC_ATI"/>
         <enum value="0x8761" name="GL_DYNAMIC_ATI"/>
         <enum value="0x8762" name="GL_PRESERVE_ATI"/>
         <enum value="0x8763" name="GL_DISCARD_ATI"/>
         <enum value="0x8764" name="GL_BUFFER_SIZE"/>
@@ -7736,16 +8012,20 @@ typedef unsigned int GLhandleARB;
         <enum value="0x8BB0" name="GL_FRAGMENT_PROGRAM_POSITION_MESA"/>
         <enum value="0x8BB1" name="GL_FRAGMENT_PROGRAM_CALLBACK_MESA"/>
         <enum value="0x8BB2" name="GL_FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA"/>
         <enum value="0x8BB3" name="GL_FRAGMENT_PROGRAM_CALLBACK_DATA_MESA"/>
         <enum value="0x8BB4" name="GL_VERTEX_PROGRAM_POSITION_MESA"/>
         <enum value="0x8BB5" name="GL_VERTEX_PROGRAM_CALLBACK_MESA"/>
         <enum value="0x8BB6" name="GL_VERTEX_PROGRAM_CALLBACK_FUNC_MESA"/>
         <enum value="0x8BB7" name="GL_VERTEX_PROGRAM_CALLBACK_DATA_MESA"/>
+        <enum value="0x8BB8" name="GL_TILE_RASTER_ORDER_FIXED_MESA"/>
+        <enum value="0x8BB9" name="GL_TILE_RASTER_ORDER_INCREASING_X_MESA"/>
+        <enum value="0x8BBA" name="GL_TILE_RASTER_ORDER_INCREASING_Y_MESA"/>
+        <enum value="0x8BBB" name="GL_FRAMEBUFFER_FLIP_Y_MESA" />
     </enums>
 
     <enums namespace="GL" start="0x8BC0" end="0x8BFF" vendor="QCOM" comment="Reassigned from AMD to QCOM">
         <enum value="0x8BC0" name="GL_COUNTER_TYPE_AMD"/>
         <enum value="0x8BC1" name="GL_COUNTER_RANGE_AMD"/>
         <enum value="0x8BC2" name="GL_UNSIGNED_INT64_AMD"/>
         <enum value="0x8BC3" name="GL_PERCENTAGE_AMD"/>
         <enum value="0x8BC4" name="GL_PERFMON_RESULT_AVAILABLE_AMD"/>
@@ -7762,17 +8042,21 @@ typedef unsigned int GLhandleARB;
         <enum value="0x8BD9" name="GL_TEXTURE_NUM_LEVELS_QCOM"/>
         <enum value="0x8BDA" name="GL_TEXTURE_TARGET_QCOM"/>
         <enum value="0x8BDB" name="GL_TEXTURE_OBJECT_VALID_QCOM"/>
         <enum value="0x8BDC" name="GL_STATE_RESTORE"/>
             <unused start="0x8BDD" end="0x8BE6" vendor="QCOM"/>
         <enum value="0x8BE7" name="GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT"/>
             <unused start="0x8BE8" end="0x8BEF" vendor="QCOM"/>
         <enum value="0x8BFA" name="GL_TEXTURE_PROTECTED_EXT"/>
-            <unused start="0x8BFB" end="0x8BFF" vendor="QCOM"/>
+        <enum value="0x8BFB" name="GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM"/>
+        <enum value="0x8BFC" name="GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM"/>
+        <enum value="0x8BFD" name="GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM"/>
+        <enum value="0x8BFE" name="GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM"/>
+        <enum value="0x8BFF" name="GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM"/>
     </enums>
 
     <enums namespace="GL" start="0x8C00" end="0x8C0F" vendor="IMG">
         <enum value="0x8C00" name="GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"/>
         <enum value="0x8C01" name="GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"/>
         <enum value="0x8C02" name="GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"/>
         <enum value="0x8C03" name="GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"/>
         <enum value="0x8C04" name="GL_MODULATE_COLOR_IMG"/>
@@ -8552,17 +8836,32 @@ typedef unsigned int GLhandleARB;
         <enum value="0x8E5D" name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES"/>
         <enum value="0x8E5D" name="GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV"/>
         <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET"/>
         <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/>
         <enum value="0x8E5E" name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/>
         <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET"/>
         <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB"/>
         <enum value="0x8E5F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV"/>
-            <unused start="0x8E60" end="0x8E6F" vendor="NV"/>
+        <enum value="0x8E60" name="GL_MAX_MESH_UNIFORM_BLOCKS_NV"/>
+        <enum value="0x8E61" name="GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV"/>
+        <enum value="0x8E62" name="GL_MAX_MESH_IMAGE_UNIFORMS_NV"/>
+        <enum value="0x8E63" name="GL_MAX_MESH_UNIFORM_COMPONENTS_NV"/>
+        <enum value="0x8E64" name="GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV"/>
+        <enum value="0x8E65" name="GL_MAX_MESH_ATOMIC_COUNTERS_NV"/>
+        <enum value="0x8E66" name="GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV"/>
+        <enum value="0x8E67" name="GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV"/>
+        <enum value="0x8E68" name="GL_MAX_TASK_UNIFORM_BLOCKS_NV"/>
+        <enum value="0x8E69" name="GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV"/>
+        <enum value="0x8E6A" name="GL_MAX_TASK_IMAGE_UNIFORMS_NV"/>
+        <enum value="0x8E6B" name="GL_MAX_TASK_UNIFORM_COMPONENTS_NV"/>
+        <enum value="0x8E6C" name="GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV"/>
+        <enum value="0x8E6D" name="GL_MAX_TASK_ATOMIC_COUNTERS_NV"/>
+        <enum value="0x8E6E" name="GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV"/>
+        <enum value="0x8E6F" name="GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV"/>
         <enum value="0x8E70" name="GL_MAX_TRANSFORM_FEEDBACK_BUFFERS"/>
         <enum value="0x8E71" name="GL_MAX_VERTEX_STREAMS"/>
         <enum value="0x8E72" name="GL_PATCH_VERTICES"/>
         <enum value="0x8E72" name="GL_PATCH_VERTICES_EXT"/>
         <enum value="0x8E72" name="GL_PATCH_VERTICES_OES"/>
         <enum value="0x8E73" name="GL_PATCH_DEFAULT_INNER_LEVEL"/>
         <enum value="0x8E73" name="GL_PATCH_DEFAULT_INNER_LEVEL_EXT"/>
         <enum value="0x8E74" name="GL_PATCH_DEFAULT_OUTER_LEVEL"/>
@@ -8801,27 +9100,28 @@ typedef unsigned int GLhandleARB;
         <enum value="0x8F9C" name="GL_SIGNED_NORMALIZED"/>
         <enum value="0x8F9D" name="GL_PRIMITIVE_RESTART"/>
         <enum value="0x8F9E" name="GL_PRIMITIVE_RESTART_INDEX"/>
         <enum value="0x8F9F" name="GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB"/>
     </enums>
 
     <enums namespace="GL" start="0x8FA0" end="0x8FBF" vendor="QCOM" comment="For Maurice Ribble, bug 4512">
         <enum value="0x8FA0" name="GL_PERFMON_GLOBAL_MODE_QCOM"/>
-            <unused start="0x8FA1" end="0x8FAF" vendor="QCOM"/>
+        <enum value="0x8FA1" name="GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM"/>
+            <unused start="0x8FA2" end="0x8FAF" vendor="QCOM"/>
         <enum value="0x8FB0" name="GL_BINNING_CONTROL_HINT_QCOM"/>
         <enum value="0x8FB1" name="GL_CPU_OPTIMIZED_QCOM"/>
         <enum value="0x8FB2" name="GL_GPU_OPTIMIZED_QCOM"/>
         <enum value="0x8FB3" name="GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM"/>
             <unused start="0x8FB4" end="0x8FBA" vendor="QCOM"/>
         <enum value="0x8FBB" name="GL_GPU_DISJOINT_EXT"/>
             <unused start="0x8FBC" vendor="QCOM"/>
         <enum value="0x8FBD" name="GL_SR8_EXT"/>
         <enum value="0x8FBE" name="GL_SRG8_EXT"/>
-            <unused start="0x8FBF" vendor="QCOM"/>
+        <enum value="0x8FBF" name="GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT"/>
     </enums>
 
     <enums namespace="GL" start="0x8FC0" end="0x8FDF" vendor="VIV" comment="For Frido Garritsen, bug 4526">
         <enum value="0x8FC4" name="GL_SHADER_BINARY_VIV"/>
     </enums>
 
     <enums namespace="GL" start="0x8FE0" end="0x8FFF" vendor="NV" comment="For Pat Brown, bug 4935">
         <enum value="0x8FE0" name="GL_INT8_NV"/>
@@ -9360,17 +9660,23 @@ typedef unsigned int GLhandleARB;
         <enum value="0x91AA" name="GL_NUM_SPARSE_LEVELS_EXT"/>
             <unused start="0x91AB" end="0x91AD" vendor="AMD"/>
         <enum value="0x91AE" name="GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD"/>
         <enum value="0x91AF" name="GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD"/>
         <enum value="0x91B0" name="GL_MAX_SHADER_COMPILER_THREADS_KHR"/>
         <enum value="0x91B0" name="GL_MAX_SHADER_COMPILER_THREADS_ARB" alias="GL_MAX_SHADER_COMPILER_THREADS_KHR"/>
         <enum value="0x91B1" name="GL_COMPLETION_STATUS_KHR"/>
         <enum value="0x91B1" name="GL_COMPLETION_STATUS_ARB" alias="GL_COMPLETION_STATUS_KHR"/>
-            <unused start="0x91B2" end="0x91B8" vendor="AMD"/>
+        <enum value="0x91B2" name="GL_RENDERBUFFER_STORAGE_SAMPLES_AMD"/>
+        <enum value="0x91B3" name="GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD"/>
+        <enum value="0x91B4" name="GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD"/>
+        <enum value="0x91B5" name="GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD"/>
+        <enum value="0x91B6" name="GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD"/>
+        <enum value="0x91B7" name="GL_SUPPORTED_MULTISAMPLE_MODES_AMD"/>
+            <unused start="0x91B8" end="0x91B8" vendor="AMD"/>
         <enum value="0x91B9" name="GL_COMPUTE_SHADER"/>
             <unused start="0x91BA" vendor="AMD"/>
         <enum value="0x91BB" name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/>
         <enum value="0x91BC" name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/>
         <enum value="0x91BD" name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/>
         <enum value="0x91BE" name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/>
         <enum value="0x91BF" name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/>
         <enum value="0x91BF" name="GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB" alias="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/>
@@ -9564,17 +9870,17 @@ typedef unsigned int GLhandleARB;
         <enum value="0x92D7" name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/>
         <enum value="0x92D8" name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/>
         <enum value="0x92D9" name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/>
         <enum value="0x92DA" name="GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX"/>
         <enum value="0x92DB" name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/>
         <enum value="0x92DC" name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/>
         <enum value="0x92DD" name="GL_FRAGMENT_COVERAGE_TO_COLOR_NV"/>
         <enum value="0x92DE" name="GL_FRAGMENT_COVERAGE_COLOR_NV"/>
-            <unused start="0x92DF" end="0x92DF" vendor="NV"/>
+        <enum value="0x92DF" name="GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV"/>
         <enum value="0x92E0" name="GL_DEBUG_OUTPUT"/>
         <enum value="0x92E0" name="GL_DEBUG_OUTPUT_KHR"/>
         <enum value="0x92E1" name="GL_UNIFORM"/>
         <enum value="0x92E2" name="GL_UNIFORM_BLOCK"/>
         <enum value="0x92E3" name="GL_PROGRAM_INPUT"/>
         <enum value="0x92E4" name="GL_PROGRAM_OUTPUT"/>
         <enum value="0x92E5" name="GL_BUFFER_VARIABLE"/>
         <enum value="0x92E6" name="GL_SHADER_STORAGE_BLOCK"/>
@@ -9704,17 +10010,19 @@ typedef unsigned int GLhandleARB;
         <enum value="0x935D" name="GL_CLIP_DEPTH_MODE_EXT" alias="GL_CLIP_DEPTH_MODE"/>
         <enum value="0x935E" name="GL_NEGATIVE_ONE_TO_ONE"/>
         <enum value="0x935E" name="GL_NEGATIVE_ONE_TO_ONE_EXT" alias="GL_NEGATIVE_ONE_TO_ONE"/>
         <enum value="0x935F" name="GL_ZERO_TO_ONE"/>
         <enum value="0x935F" name="GL_ZERO_TO_ONE_EXT" alias="GL_ZERO_TO_ONE"/>
             <unused start="0x9360" end="0x9364" vendor="NV"/>
         <enum value="0x9365" name="GL_CLEAR_TEXTURE"/>
         <enum value="0x9366" name="GL_TEXTURE_REDUCTION_MODE_ARB"/>
+        <enum value="0x9366" name="GL_TEXTURE_REDUCTION_MODE_EXT" alias="GL_TEXTURE_REDUCTION_MODE_ARB"/>
         <enum value="0x9367" name="GL_WEIGHTED_AVERAGE_ARB"/>
+        <enum value="0x9367" name="GL_WEIGHTED_AVERAGE_EXT" alias="GL_WEIGHTED_AVERAGE_ARB"/>
         <enum value="0x9368" name="GL_FONT_GLYPHS_AVAILABLE_NV"/>
         <enum value="0x9369" name="GL_FONT_TARGET_UNAVAILABLE_NV"/>
         <enum value="0x936A" name="GL_FONT_UNAVAILABLE_NV"/>
         <enum value="0x936B" name="GL_FONT_UNINTELLIGIBLE_NV"/>
         <enum value="0x936C" name="GL_STANDARD_FONT_FORMAT_NV"/>
         <enum value="0x936D" name="GL_FRAGMENT_INPUT_NV"/>
         <enum value="0x936E" name="GL_UNIFORM_BUFFER_UNIFIED_NV"/>
         <enum value="0x936F" name="GL_UNIFORM_BUFFER_ADDRESS_NV"/>
@@ -9725,26 +10033,55 @@ typedef unsigned int GLhandleARB;
         <enum value="0x9374" name="GL_CONFORMANT_NV"/>
             <unused start="0x9375" end="0x9378" vendor="NV"/>
         <enum value="0x9379" name="GL_CONSERVATIVE_RASTER_DILATE_NV"/>
         <enum value="0x937A" name="GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV"/>
         <enum value="0x937B" name="GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV"/>
         <enum value="0x937C" name="GL_VIEWPORT_POSITION_W_SCALE_NV"/>
         <enum value="0x937D" name="GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV"/>
         <enum value="0x937E" name="GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV"/>
-            <unused start="0x937F" vendor="NV"/>
+        <enum value="0x937F" name="GL_REPRESENTATIVE_FRAGMENT_TEST_NV"/>
     </enums>
 
     <enums namespace="GL" start="0x9380" end="0x939F" vendor="ARB">
         <enum value="0x9380" name="GL_NUM_SAMPLE_COUNTS"/>
         <enum value="0x9381" name="GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB"/>
         <enum value="0x9381" name="GL_MULTISAMPLE_LINE_WIDTH_RANGE"/>
         <enum value="0x9382" name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB"/>
         <enum value="0x9382" name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY"/>
-            <unused start="0x9383" end="0x939F" vendor="ARB"/>
+        <enum value="0x9383" name="GL_VIEW_CLASS_EAC_R11"/>
+        <enum value="0x9384" name="GL_VIEW_CLASS_EAC_RG11"/>
+        <enum value="0x9385" name="GL_VIEW_CLASS_ETC2_RGB"/>
+        <enum value="0x9386" name="GL_VIEW_CLASS_ETC2_RGBA"/>
+        <enum value="0x9387" name="GL_VIEW_CLASS_ETC2_EAC_RGBA"/>
+        <enum value="0x9388" name="GL_VIEW_CLASS_ASTC_4x4_RGBA"/>
+        <enum value="0x9389" name="GL_VIEW_CLASS_ASTC_5x4_RGBA"/>
+        <enum value="0x938A" name="GL_VIEW_CLASS_ASTC_5x5_RGBA"/>
+        <enum value="0x938B" name="GL_VIEW_CLASS_ASTC_6x5_RGBA"/>
+        <enum value="0x938C" name="GL_VIEW_CLASS_ASTC_6x6_RGBA"/>
+        <enum value="0x938D" name="GL_VIEW_CLASS_ASTC_8x5_RGBA"/>
+        <enum value="0x938E" name="GL_VIEW_CLASS_ASTC_8x6_RGBA"/>
+        <enum value="0x938F" name="GL_VIEW_CLASS_ASTC_8x8_RGBA"/>
+        <enum value="0x9390" name="GL_VIEW_CLASS_ASTC_10x5_RGBA"/>
+        <enum value="0x9391" name="GL_VIEW_CLASS_ASTC_10x6_RGBA"/>
+        <enum value="0x9392" name="GL_VIEW_CLASS_ASTC_10x8_RGBA"/>
+        <enum value="0x9393" name="GL_VIEW_CLASS_ASTC_10x10_RGBA"/>
+        <enum value="0x9394" name="GL_VIEW_CLASS_ASTC_12x10_RGBA"/>
+        <enum value="0x9395" name="GL_VIEW_CLASS_ASTC_12x12_RGBA"/>
+            <unused start="0x9396" end="0x939F" vendor="ARB" comment="reserved for ASTC 3D interactions with ARB_ifq2"/>
+            <!-- <enum value="0x9396" name="GL_VIEW_CLASS_ASTC_3x3x3_RGBA"/> -->
+            <!-- <enum value="0x9397" name="GL_VIEW_CLASS_ASTC_4x3x3_RGBA"/> -->
+            <!-- <enum value="0x9398" name="GL_VIEW_CLASS_ASTC_4x4x3_RGBA"/> -->
+            <!-- <enum value="0x9399" name="GL_VIEW_CLASS_ASTC_4x4x4_RGBA"/> -->
+            <!-- <enum value="0x939A" name="GL_VIEW_CLASS_ASTC_5x4x4_RGBA"/> -->
+            <!-- <enum value="0x939B" name="GL_VIEW_CLASS_ASTC_5x5x4_RGBA"/> -->
+            <!-- <enum value="0x939C" name="GL_VIEW_CLASS_ASTC_5x5x5_RGBA"/> -->
+            <!-- <enum value="0x939D" name="GL_VIEW_CLASS_ASTC_6x5x5_RGBA"/> -->
+            <!-- <enum value="0x939E" name="GL_VIEW_CLASS_ASTC_6x6x5_RGBA"/> -->
+            <!-- <enum value="0x939F" name="GL_VIEW_CLASS_ASTC_6x6x6_RGBA"/> -->
     </enums>
 
     <enums namespace="GL" start="0x93A0" end="0x93AF" vendor="ANGLE" comment="Khronos bug 8100">
         <enum value="0x93A0" name="GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE"/>
         <enum value="0x93A1" name="GL_BGRA8_EXT"/>
         <enum value="0x93A2" name="GL_TEXTURE_USAGE_ANGLE"/>
         <enum value="0x93A3" name="GL_FRAMEBUFFER_ATTACHMENT_ANGLE"/>
         <enum value="0x93A4" name="GL_PACK_REVERSE_ROW_ORDER_ANGLE"/>
@@ -9862,41 +10199,83 @@ typedef unsigned int GLhandleARB;
             <unused start="0x9501" end="0x950F" vendor="INTEL"/>
     </enums>
 
     <enums namespace="GL" start="0x9510" end="0x952F" vendor="Broadcom" comment="Khronos bug 12203">
             <unused start="0x9510" end="0x952F" vendor="Broadcom"/>
     </enums>
 
     <enums namespace="GL" start="0x9530" end="0x962F" vendor="NV" comment="Khronos bug 12977">
-            <unused start="0x9530" end="0x9539" vendor="NV"/>
+        <enum value="0x9530" name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/>
+        <enum value="0x9531" name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/>
+            <unused start="0x9532" end="0x9535" vendor="NV"/>
+        <enum value="0x9536" name="GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV"/>
+        <enum value="0x9537" name="GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV"/>
+        <enum value="0x9538" name="GL_MAX_MESH_OUTPUT_VERTICES_NV"/>
+        <enum value="0x9539" name="GL_MAX_MESH_OUTPUT_PRIMITIVES_NV"/>
+        <enum value="0x953A" name="GL_MAX_TASK_OUTPUT_COUNT_NV"/>
+        <enum value="0x953B" name="GL_MAX_MESH_WORK_GROUP_SIZE_NV"/>
+        <enum value="0x953C" name="GL_MAX_TASK_WORK_GROUP_SIZE_NV"/>
+        <enum value="0x953D" name="GL_MAX_DRAW_MESH_TASKS_COUNT_NV"/>
+        <enum value="0x953E" name="GL_MESH_WORK_GROUP_SIZE_NV"/>
+        <enum value="0x953F" name="GL_TASK_WORK_GROUP_SIZE_NV"/>
         <enum value="0x9540" name="GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV"/>
             <unused start="0x9541" vendor="NV"/>
         <enum value="0x9542" name="GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV"/>
-            <unused start="0x9543" vendor="NV"/>
+        <enum value="0x9543" name="GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV"/>
         <enum value="0x9544" name="GL_QUERY_RESOURCE_SYS_RESERVED_NV"/>
         <enum value="0x9545" name="GL_QUERY_RESOURCE_TEXTURE_NV"/>
         <enum value="0x9546" name="GL_QUERY_RESOURCE_RENDERBUFFER_NV"/>
         <enum value="0x9547" name="GL_QUERY_RESOURCE_BUFFEROBJECT_NV"/>
         <enum value="0x9548" name="GL_PER_GPU_STORAGE_NV"/>
         <enum value="0x9549" name="GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV"/>
             <unused start="0x954A" end="0x954C" vendor="NV"/>
         <enum value="0x954D" name="GL_CONSERVATIVE_RASTER_MODE_NV"/>
         <enum value="0x954E" name="GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV"/>
         <enum value="0x954F" name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV"/>
-            <unused start="0x9550" vendor="NV"/>
+        <enum value="0x9550" name="GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV"/>
         <enum value="0x9551" name="GL_SHADER_BINARY_FORMAT_SPIR_V"/>
         <enum value="0x9551" name="GL_SHADER_BINARY_FORMAT_SPIR_V_ARB" alias="GL_SHADER_BINARY_FORMAT_SPIR_V"/>
         <enum value="0x9552" name="GL_SPIR_V_BINARY"/>
         <enum value="0x9552" name="GL_SPIR_V_BINARY_ARB" alias="GL_SPIR_V_BINARY"/>
         <enum value="0x9553" name="GL_SPIR_V_EXTENSIONS"/>
         <enum value="0x9554" name="GL_NUM_SPIR_V_EXTENSIONS"/>
-            <unused start="0x9555" end="0x9557" vendor="NV"/>
+        <enum value="0x9555" name="GL_SCISSOR_TEST_EXCLUSIVE_NV"/>
+        <enum value="0x9556" name="GL_SCISSOR_BOX_EXCLUSIVE_NV"/>
+        <enum value="0x9557" name="GL_MAX_MESH_VIEWS_NV"/>
         <enum value="0x9558" name="GL_RENDER_GPU_MASK_NV"/>
-            <unused start="0x9559" end="0x957F" vendor="NV"/>
+        <enum value="0x9559" name="GL_MESH_SHADER_NV"/>
+        <enum value="0x955A" name="GL_TASK_SHADER_NV"/>
+        <enum value="0x955B" name="GL_SHADING_RATE_IMAGE_BINDING_NV"/>
+        <enum value="0x955C" name="GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV"/>
+        <enum value="0x955D" name="GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV"/>
+        <enum value="0x955E" name="GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV"/>
+        <enum value="0x955F" name="GL_MAX_COARSE_FRAGMENT_SAMPLES_NV"/>
+            <unused start="0x9560" end="0x9562" vendor="NV"/>
+        <enum value="0x9563" name="GL_SHADING_RATE_IMAGE_NV"/>
+        <enum value="0x9564" name="GL_SHADING_RATE_NO_INVOCATIONS_NV"/>
+        <enum value="0x9565" name="GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV"/>
+        <enum value="0x9566" name="GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV"/>
+        <enum value="0x9567" name="GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV"/>
+        <enum value="0x9568" name="GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV"/>
+        <enum value="0x9569" name="GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV"/>
+        <enum value="0x956A" name="GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV"/>
+        <enum value="0x956B" name="GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV"/>
+        <enum value="0x956C" name="GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV"/>
+        <enum value="0x956D" name="GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV"/>
+        <enum value="0x956E" name="GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV"/>
+        <enum value="0x956F" name="GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV"/>
+            <unused start="0x9570" end="0x9578" vendor="NV"/>
+        <enum value="0x9579" name="GL_MESH_VERTICES_OUT_NV"/>
+        <enum value="0x957A" name="GL_MESH_PRIMITIVES_OUT_NV"/>
+        <enum value="0x957B" name="GL_MESH_OUTPUT_TYPE_NV"/>
+        <enum value="0x957C" name="GL_MESH_SUBROUTINE_NV"/>
+        <enum value="0x957D" name="GL_TASK_SUBROUTINE_NV"/>
+        <enum value="0x957E" name="GL_MESH_SUBROUTINE_UNIFORM_NV"/>
+        <enum value="0x957F" name="GL_TASK_SUBROUTINE_UNIFORM_NV"/>
         <enum value="0x9580" name="GL_TEXTURE_TILING_EXT"/>
         <enum value="0x9581" name="GL_DEDICATED_MEMORY_OBJECT_EXT"/>
         <enum value="0x9582" name="GL_NUM_TILING_TYPES_EXT"/>
         <enum value="0x9583" name="GL_TILING_TYPES_EXT"/>
         <enum value="0x9584" name="GL_OPTIMAL_TILING_EXT"/>
         <enum value="0x9585" name="GL_LINEAR_TILING_EXT"/>
         <enum value="0x9586" name="GL_HANDLE_TYPE_OPAQUE_FD_EXT"/>
         <enum value="0x9587" name="GL_HANDLE_TYPE_OPAQUE_WIN32_EXT"/>
@@ -9915,17 +10294,38 @@ typedef unsigned int GLhandleARB;
         <enum value="0x9594" name="GL_HANDLE_TYPE_D3D12_FENCE_EXT"/>
         <enum value="0x9595" name="GL_D3D12_FENCE_VALUE_EXT"/>
         <enum value="0x9596" name="GL_NUM_DEVICE_UUIDS_EXT"/>
         <enum value="0x9597" name="GL_DEVICE_UUID_EXT"/>
         <enum value="0x9598" name="GL_DRIVER_UUID_EXT"/>
         <enum value="0x9599" name="GL_DEVICE_LUID_EXT"/>
         <enum value="0x959A" name="GL_DEVICE_NODE_MASK_EXT"/>
         <enum value="0x959B" name="GL_PROTECTED_MEMORY_OBJECT_EXT"/>
-            <unused start="0x959C" end="0x962F" vendor="NV"/>
+        <enum value="0x959C" name="GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV"/>
+        <enum value="0x959D" name="GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV"/>
+        <enum value="0x959E" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV"/>
+        <enum value="0x959F" name="GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV"/>
+        <enum value="0x95A0" name="GL_REFERENCED_BY_MESH_SHADER_NV"/>
+        <enum value="0x95A1" name="GL_REFERENCED_BY_TASK_SHADER_NV"/>
+        <enum value="0x95A2" name="GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV"/>
+        <enum value="0x95A3" name="GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV"/>
+        <enum value="0x95A4" name="GL_ATTACHED_MEMORY_OBJECT_NV"/>
+        <enum value="0x95A5" name="GL_ATTACHED_MEMORY_OFFSET_NV"/>
+        <enum value="0x95A6" name="GL_MEMORY_ATTACHABLE_ALIGNMENT_NV"/>
+        <enum value="0x95A7" name="GL_MEMORY_ATTACHABLE_SIZE_NV"/>
+        <enum value="0x95A8" name="GL_MEMORY_ATTACHABLE_NV"/>
+        <enum value="0x95A9" name="GL_DETACHED_MEMORY_INCARNATION_NV"/>
+        <enum value="0x95AA" name="GL_DETACHED_TEXTURES_NV"/>
+        <enum value="0x95AB" name="GL_DETACHED_BUFFERS_NV"/>
+        <enum value="0x95AC" name="GL_MAX_DETACHED_TEXTURES_NV"/>
+        <enum value="0x95AD" name="GL_MAX_DETACHED_BUFFERS_NV"/>
+        <enum value="0x95AE" name="GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV"/>
+        <enum value="0x95AF" name="GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV"/>
+        <enum value="0x95B0" name="GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV"/>
+        <unused start="0x9581" end="0x962F" vendor="NV"/>
     </enums>
 
     <enums namespace="GL" start="0x9630" end="0x963F" vendor="Oculus" comment="Email from Cass Everitt">
         <enum value="0x9630" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR"/>
         <enum value="0x9631" name="GL_MAX_VIEWS_OVR"/>
         <enum value="0x9632" name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR"/>
         <enum value="0x9633" name="GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR"/>
             <unused start="0x9634" end="0x963F" vendor="Oculus"/>
@@ -10261,16 +10661,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glBeginQueryIndexed</name></proto>
             <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint</ptype> <name>id</name></param>
         </command>
         <command>
             <proto>void <name>glBeginTransformFeedback</name></proto>
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>primitiveMode</name></param>
+            <glx type="render" opcode="357"/>
         </command>
         <command>
             <proto>void <name>glBeginTransformFeedbackEXT</name></proto>
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>primitiveMode</name></param>
             <alias name="glBeginTransformFeedback"/>
         </command>
         <command>
             <proto>void <name>glBeginTransformFeedbackNV</name></proto>
@@ -10308,16 +10709,17 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <alias name="glBindBuffer"/>
         </command>
         <command>
             <proto>void <name>glBindBufferBase</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
+            <glx type="render" opcode="356"/>
         </command>
         <command>
             <proto>void <name>glBindBufferBaseEXT</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <alias name="glBindBufferBase"/>
         </command>
@@ -10345,16 +10747,17 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glBindBufferRange</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
+            <glx type="render" opcode="355"/>
         </command>
         <command>
             <proto>void <name>glBindBufferRangeEXT</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>offset</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
@@ -10525,16 +10928,20 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glBindSamplers</name></proto>
             <param><ptype>GLuint</ptype> <name>first</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="count">const <ptype>GLuint</ptype> *<name>samplers</name></param>
         </command>
         <command>
+            <proto>void <name>glBindShadingRateImageNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>texture</name></param>
+        </command>
+        <command>
             <proto><ptype>GLuint</ptype> <name>glBindTexGenParameterEXT</name></proto>
             <param group="TextureUnit"><ptype>GLenum</ptype> <name>unit</name></param>
             <param group="TextureCoordName"><ptype>GLenum</ptype> <name>coord</name></param>
             <param group="TextureGenParameter"><ptype>GLenum</ptype> <name>value</name></param>
         </command>
         <command>
             <proto>void <name>glBindTexture</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
@@ -10977,17 +11384,17 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLint</ptype> <name>srcX0</name></param>
             <param><ptype>GLint</ptype> <name>srcY0</name></param>
             <param><ptype>GLint</ptype> <name>srcX1</name></param>
             <param><ptype>GLint</ptype> <name>srcY1</name></param>
             <param><ptype>GLint</ptype> <name>dstX0</name></param>
             <param><ptype>GLint</ptype> <name>dstY0</name></param>
             <param><ptype>GLint</ptype> <name>dstX1</name></param>
             <param><ptype>GLint</ptype> <name>dstY1</name></param>
-            <param><ptype>GLbitfield</ptype> <name>mask</name></param>
+            <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param>
             <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param>
         </command>
         <command>
             <proto>void <name>glBlitFramebufferEXT</name></proto>
             <param><ptype>GLint</ptype> <name>srcX0</name></param>
             <param><ptype>GLint</ptype> <name>srcY0</name></param>
             <param><ptype>GLint</ptype> <name>srcX1</name></param>
             <param><ptype>GLint</ptype> <name>srcY1</name></param>
@@ -11005,43 +11412,49 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLint</ptype> <name>srcX0</name></param>
             <param><ptype>GLint</ptype> <name>srcY0</name></param>
             <param><ptype>GLint</ptype> <name>srcX1</name></param>
             <param><ptype>GLint</ptype> <name>srcY1</name></param>
             <param><ptype>GLint</ptype> <name>dstX0</name></param>
             <param><ptype>GLint</ptype> <name>dstY0</name></param>
             <param><ptype>GLint</ptype> <name>dstX1</name></param>
             <param><ptype>GLint</ptype> <name>dstY1</name></param>
-            <param><ptype>GLbitfield</ptype> <name>mask</name></param>
+            <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param>
             <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param>
             <alias name="glBlitFramebuffer"/>
         </command>
         <command>
             <proto>void <name>glBlitNamedFramebuffer</name></proto>
             <param><ptype>GLuint</ptype> <name>readFramebuffer</name></param>
             <param><ptype>GLuint</ptype> <name>drawFramebuffer</name></param>
             <param><ptype>GLint</ptype> <name>srcX0</name></param>
             <param><ptype>GLint</ptype> <name>srcY0</name></param>
             <param><ptype>GLint</ptype> <name>srcX1</name></param>
             <param><ptype>GLint</ptype> <name>srcY1</name></param>
             <param><ptype>GLint</ptype> <name>dstX0</name></param>
             <param><ptype>GLint</ptype> <name>dstY0</name></param>
             <param><ptype>GLint</ptype> <name>dstX1</name></param>
             <param><ptype>GLint</ptype> <name>dstY1</name></param>
-            <param><ptype>GLbitfield</ptype> <name>mask</name></param>
+            <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param>
             <param group="BlitFramebufferFilter"><ptype>GLenum</ptype> <name>filter</name></param>
         </command>
         <command>
             <proto>void <name>glBufferAddressRangeNV</name></proto>
             <param><ptype>GLenum</ptype> <name>pname</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLuint64EXT</ptype> <name>address</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param>
         </command>
         <command>
+            <proto>void <name>glBufferAttachMemoryNV</name></proto>
+            <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLuint64</ptype> <name>offset</name></param>
+        </command>
+        <command>
             <proto>void <name>glBufferData</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param len="size">const void *<name>data</name></param>
             <param group="BufferUsageARB"><ptype>GLenum</ptype> <name>usage</name></param>
         </command>
         <command>
             <proto>void <name>glBufferDataARB</name></proto>
@@ -11064,33 +11477,33 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLenum</ptype> <name>pname</name></param>
             <param><ptype>GLint</ptype> <name>param</name></param>
         </command>
         <command>
             <proto>void <name>glBufferStorage</name></proto>
             <param group="BufferStorageTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param len="size">const void *<name>data</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glBufferStorageEXT</name></proto>
             <param group="BufferStorageTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param len="size">const void *<name>data</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
             <alias name="glBufferStorage"/>
         </command>
         <command>
             <proto>void <name>glBufferStorageExternalEXT</name></proto>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param><ptype>GLeglClientBufferEXT</ptype> <name>clientBuffer</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glBufferStorageMemEXT</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param><ptype>GLuint</ptype> <name>memory</name></param>
             <param><ptype>GLuint64</ptype> <name>offset</name></param>
         </command>
@@ -11202,34 +11615,38 @@ typedef unsigned int GLhandleARB;
             <param len="COMPSIZE(format,type)">const void *<name>data</name></param>
         </command>
         <command>
             <proto>void <name>glClearBufferfi</name></proto>
             <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param>
             <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param>
             <param><ptype>GLfloat</ptype> <name>depth</name></param>
             <param><ptype>GLint</ptype> <name>stencil</name></param>
+            <glx type="render" opcode="360"/>
         </command>
         <command>
             <proto>void <name>glClearBufferfv</name></proto>
             <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param>
             <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param>
             <param len="COMPSIZE(buffer)">const <ptype>GLfloat</ptype> *<name>value</name></param>
+            <glx type="render" opcode="361"/>
         </command>
         <command>
             <proto>void <name>glClearBufferiv</name></proto>
             <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param>
             <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param>
             <param len="COMPSIZE(buffer)">const <ptype>GLint</ptype> *<name>value</name></param>
+            <glx type="render" opcode="362"/>
         </command>
         <command>
             <proto>void <name>glClearBufferuiv</name></proto>
             <param group="Buffer"><ptype>GLenum</ptype> <name>buffer</name></param>
             <param group="DrawBufferName"><ptype>GLint</ptype> <name>drawbuffer</name></param>
             <param len="COMPSIZE(buffer)">const <ptype>GLuint</ptype> *<name>value</name></param>
+            <glx type="render" opcode="363"/>
         </command>
         <command>
             <proto>void <name>glClearColor</name></proto>
             <param group="ColorF"><ptype>GLfloat</ptype> <name>red</name></param>
             <param group="ColorF"><ptype>GLfloat</ptype> <name>green</name></param>
             <param group="ColorF"><ptype>GLfloat</ptype> <name>blue</name></param>
             <param group="ColorF"><ptype>GLfloat</ptype> <name>alpha</name></param>
             <glx type="render" opcode="130"/>
@@ -11434,36 +11851,36 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glClientAttribDefaultEXT</name></proto>
             <param group="ClientAttribMask"><ptype>GLbitfield</ptype> <name>mask</name></param>
         </command>
         <command>
             <proto group="SyncStatus"><ptype>GLenum</ptype> <name>glClientWaitSync</name></proto>
             <param group="sync"><ptype>GLsync</ptype> <name>sync</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="SyncObjectMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
             <param><ptype>GLuint64</ptype> <name>timeout</name></param>
         </command>
         <command>
             <proto group="SyncStatus"><ptype>GLenum</ptype> <name>glClientWaitSyncAPPLE</name></proto>
             <param><ptype>GLsync</ptype> <name>sync</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="SyncObjectMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
             <param><ptype>GLuint64</ptype> <name>timeout</name></param>
             <alias name="glClientWaitSync"/>
         </command>
         <command>
             <proto>void <name>glClipControl</name></proto>
             <param group="ClipControlOrigin"><ptype>GLenum</ptype> <name>origin</name></param>
             <param group="ClipControlDepth"><ptype>GLenum</ptype> <name>depth</name></param>
         </command>
         <command>
             <proto>void <name>glClipControlEXT</name></proto>
             <param><ptype>GLenum</ptype> <name>origin</name></param>
             <param><ptype>GLenum</ptype> <name>depth</name></param>
-            <alias name="glClipControlEXT"/>
+            <alias name="glClipControl"/>
         </command>
         <command>
             <proto>void <name>glClipPlane</name></proto>
             <param group="ClipPlaneName"><ptype>GLenum</ptype> <name>plane</name></param>
             <param len="4">const <ptype>GLdouble</ptype> *<name>equation</name></param>
             <glx type="render" opcode="77"/>
         </command>
         <command>
@@ -11868,16 +12285,17 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glColorMaskIndexedEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param>
             <alias name="glColorMaski"/>
+            <glx type="render" opcode="352"/>
         </command>
         <command>
             <proto>void <name>glColorMaski</name></proto>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>r</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>g</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>b</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>a</name></param>
@@ -12621,16 +13039,17 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glCopyBufferSubData</name></proto>
             <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>readTarget</name></param>
             <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>writeTarget</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>readOffset</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>writeOffset</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
+            <glx type="single" opcode="221"/>
         </command>
         <command>
             <proto>void <name>glCopyBufferSubDataNV</name></proto>
             <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>readTarget</name></param>
             <param group="CopyBufferSubDataTarget"><ptype>GLenum</ptype> <name>writeTarget</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>readOffset</name></param>
             <param group="BufferOffset"><ptype>GLintptr</ptype> <name>writeOffset</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
@@ -13582,17 +14001,17 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glDeleteSamplers</name></proto>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="count">const <ptype>GLuint</ptype> *<name>samplers</name></param>
         </command>
         <command>
             <proto>void <name>glDeleteSemaphoresEXT</name></proto>
             <param><ptype>GLsizei</ptype> <name>n</name></param>
-            <param len="count">const <ptype>GLuint</ptype> *<name>semaphores</name></param>
+            <param len="n">const <ptype>GLuint</ptype> *<name>semaphores</name></param>
         </command>
         <command>
             <proto>void <name>glDeleteShader</name></proto>
             <param><ptype>GLuint</ptype> <name>shader</name></param>
             <glx type="single" opcode="195"/>
         </command>
         <command>
             <proto>void <name>glDeleteStatesNV</name></proto>
@@ -13672,18 +14091,18 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glDepthMask</name></proto>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>flag</name></param>
             <glx type="render" opcode="135"/>
         </command>
         <command>
             <proto>void <name>glDepthRange</name></proto>
-            <param><ptype>GLdouble</ptype> <name>near</name></param>
-            <param><ptype>GLdouble</ptype> <name>far</name></param>
+            <param><ptype>GLdouble</ptype> <name>n</name></param>
+            <param><ptype>GLdouble</ptype> <name>f</name></param>
             <glx type="render" opcode="174"/>
         </command>
         <command>
             <proto>void <name>glDepthRangeArrayfvNV</name></proto>
             <param><ptype>GLuint</ptype> <name>first</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param>const <ptype>GLfloat</ptype> *<name>v</name></param>
         </command>
@@ -13786,16 +14205,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glDisableDriverControlQCOM</name></proto>
             <param><ptype>GLuint</ptype> <name>driverControl</name></param>
         </command>
         <command>
             <proto>void <name>glDisableIndexedEXT</name></proto>
             <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <alias name="glDisablei"/>
+            <glx type="render" opcode="354"/>
         </command>
         <command>
             <proto>void <name>glDisableVariantClientStateEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
         </command>
         <command>
             <proto>void <name>glDisableVertexArrayAttrib</name></proto>
             <param><ptype>GLuint</ptype> <name>vaobj</name></param>
@@ -14188,16 +14608,25 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glDrawMeshArraysSUN</name></proto>
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param>
             <param><ptype>GLint</ptype> <name>first</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
         </command>
         <command>
+            <proto>void <name>glDrawMeshTasksNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>first</name></param>
+            <param><ptype>GLuint</ptype> <name>count</name></param>
+        </command>
+        <command>
+            <proto>void <name>glDrawMeshTasksIndirectNV</name></proto>
+            <param><ptype>GLintptr</ptype> <name>indirect</name></param>
+        </command>
+        <command>
             <proto>void <name>glDrawPixels</name></proto>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param len="COMPSIZE(format,type,width,height)">const void *<name>pixels</name></param>
             <glx type="render" opcode="173"/>
             <glx type="render" opcode="322" name="glDrawPixelsPBO" comment="PBO protocol"/>
@@ -14270,44 +14699,47 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glDrawTexfOES</name></proto>
             <param><ptype>GLfloat</ptype> <name>x</name></param>
             <param><ptype>GLfloat</ptype> <name>y</name></param>
             <param><ptype>GLfloat</ptype> <name>z</name></param>
             <param><ptype>GLfloat</ptype> <name>width</name></param>
             <param><ptype>GLfloat</ptype> <name>height</name></param>
+            <vecequiv name="glDrawTexfvOES"/>
         </command>
         <command>
             <proto>void <name>glDrawTexfvOES</name></proto>
-            <param>const <ptype>GLfloat</ptype> *<name>coords</name></param>
+            <param len="5">const <ptype>GLfloat</ptype> *<name>coords</name></param>
         </command>
         <command>
             <proto>void <name>glDrawTexiOES</name></proto>
             <param><ptype>GLint</ptype> <name>x</name></param>
             <param><ptype>GLint</ptype> <name>y</name></param>
             <param><ptype>GLint</ptype> <name>z</name></param>
             <param><ptype>GLint</ptype> <name>width</name></param>
             <param><ptype>GLint</ptype> <name>height</name></param>
+            <vecequiv name="glDrawTexivOES"/>
         </command>
         <command>
             <proto>void <name>glDrawTexivOES</name></proto>
-            <param>const <ptype>GLint</ptype> *<name>coords</name></param>
+            <param len="5">const <ptype>GLint</ptype> *<name>coords</name></param>
         </command>
         <command>
             <proto>void <name>glDrawTexsOES</name></proto>
             <param><ptype>GLshort</ptype> <name>x</name></param>
             <param><ptype>GLshort</ptype> <name>y</name></param>
             <param><ptype>GLshort</ptype> <name>z</name></param>
             <param><ptype>GLshort</ptype> <name>width</name></param>
             <param><ptype>GLshort</ptype> <name>height</name></param>
+            <vecequiv name="glDrawTexsvOES"/>
         </command>
         <command>
             <proto>void <name>glDrawTexsvOES</name></proto>
-            <param>const <ptype>GLshort</ptype> *<name>coords</name></param>
+            <param len="5">const <ptype>GLshort</ptype> *<name>coords</name></param>
         </command>
         <command>
             <proto>void <name>glDrawTextureNV</name></proto>
             <param><ptype>GLuint</ptype> <name>texture</name></param>
             <param><ptype>GLuint</ptype> <name>sampler</name></param>
             <param><ptype>GLfloat</ptype> <name>x0</name></param>
             <param><ptype>GLfloat</ptype> <name>y0</name></param>
             <param><ptype>GLfloat</ptype> <name>x1</name></param>
@@ -14320,20 +14752,21 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glDrawTexxOES</name></proto>
             <param><ptype>GLfixed</ptype> <name>x</name></param>
             <param><ptype>GLfixed</ptype> <name>y</name></param>
             <param><ptype>GLfixed</ptype> <name>z</name></param>
             <param><ptype>GLfixed</ptype> <name>width</name></param>
             <param><ptype>GLfixed</ptype> <name>height</name></param>
+            <vecequiv name="glDrawTexxvOES"/>
         </command>
         <command>
             <proto>void <name>glDrawTexxvOES</name></proto>
-            <param>const <ptype>GLfixed</ptype> *<name>coords</name></param>
+            <param len="5">const <ptype>GLfixed</ptype> *<name>coords</name></param>
         </command>
         <command>
             <proto>void <name>glDrawTransformFeedback</name></proto>
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param>
             <param><ptype>GLuint</ptype> <name>id</name></param>
         </command>
         <command>
             <proto>void <name>glDrawTransformFeedbackEXT</name></proto>
@@ -14374,21 +14807,33 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLsizei</ptype> <name>instancecount</name></param>
         </command>
         <command>
             <proto>void <name>glEGLImageTargetRenderbufferStorageOES</name></proto>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLeglImageOES</ptype> <name>image</name></param>
         </command>
         <command>
+            <proto>void <name>glEGLImageTargetTexStorageEXT</name></proto>
+            <param><ptype>GLenum</ptype> <name>target</name></param>
+            <param><ptype>GLeglImageOES</ptype> <name>image</name></param>
+            <param>const <ptype>GLint</ptype>* <name>attrib_list</name></param>
+        </command>
+        <command>
             <proto>void <name>glEGLImageTargetTexture2DOES</name></proto>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLeglImageOES</ptype> <name>image</name></param>
         </command>
         <command>
+            <proto>void <name>glEGLImageTargetTextureStorageEXT</name></proto>
+            <param><ptype>GLuint</ptype> <name>texture</name></param>
+            <param><ptype>GLeglImageOES</ptype> <name>image</name></param>
+            <param>const <ptype>GLint</ptype>* <name>attrib_list</name></param>
+        </command>
+        <command>
             <proto>void <name>glEdgeFlag</name></proto>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>flag</name></param>
             <vecequiv name="glEdgeFlagv"/>
         </command>
         <command>
             <proto>void <name>glEdgeFlagFormatNV</name></proto>
             <param><ptype>GLsizei</ptype> <name>stride</name></param>
         </command>
@@ -14447,16 +14892,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glEnableDriverControlQCOM</name></proto>
             <param><ptype>GLuint</ptype> <name>driverControl</name></param>
         </command>
         <command>
             <proto>void <name>glEnableIndexedEXT</name></proto>
             <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <alias name="glEnablei"/>
+            <glx type="render" opcode="353"/>
         </command>
         <command>
             <proto>void <name>glEnableVariantClientStateEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
         </command>
         <command>
             <proto>void <name>glEnableVertexArrayAttrib</name></proto>
             <param><ptype>GLuint</ptype> <name>vaobj</name></param>
@@ -14559,20 +15005,21 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glEndQueryIndexed</name></proto>
             <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
         </command>
         <command>
             <proto>void <name>glEndTilingQCOM</name></proto>
-            <param><ptype>GLbitfield</ptype> <name>preserveMask</name></param>
+            <param group="BufferBitQCOM"><ptype>GLbitfield</ptype> <name>preserveMask</name></param>
         </command>
         <command>
             <proto>void <name>glEndTransformFeedback</name></proto>
+            <glx type="render" opcode="358"/>
         </command>
         <command>
             <proto>void <name>glEndTransformFeedbackEXT</name></proto>
             <alias name="glEndTransformFeedback"/>
         </command>
         <command>
             <proto>void <name>glEndTransformFeedbackNV</name></proto>
             <alias name="glEndTransformFeedback"/>
@@ -15105,16 +15552,19 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glFramebufferDrawBuffersEXT</name></proto>
             <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param>
             <param><ptype>GLsizei</ptype> <name>n</name></param>
             <param group="DrawBufferMode" len="n">const <ptype>GLenum</ptype> *<name>bufs</name></param>
         </command>
         <command>
+            <proto>void <name>glFramebufferFetchBarrierEXT</name></proto>
+        </command>
+        <command>
             <proto>void <name>glFramebufferFetchBarrierQCOM</name></proto>
         </command>
         <command>
             <proto>void <name>glFramebufferFoveationConfigQCOM</name></proto>
             <param group="Framebuffer"><ptype>GLuint</ptype> <name>framebuffer</name></param>
             <param><ptype>GLuint</ptype> <name>numLayers</name></param>
             <param><ptype>GLuint</ptype> <name>focalPointsPerLayer</name></param>
             <param><ptype>GLuint</ptype> <name>requestedFeatures</name></param>
@@ -15595,17 +16045,17 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glGenSamplers</name></proto>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="count"><ptype>GLuint</ptype> *<name>samplers</name></param>
         </command>
         <command>
             <proto>void <name>glGenSemaphoresEXT</name></proto>
             <param><ptype>GLsizei</ptype> <name>n</name></param>
-            <param len="count"><ptype>GLuint</ptype> *<name>semaphores</name></param>
+            <param len="n"><ptype>GLuint</ptype> *<name>semaphores</name></param>
         </command>
         <command>
             <proto><ptype>GLuint</ptype> <name>glGenSymbolsEXT</name></proto>
             <param group="DataTypeEXT"><ptype>GLenum</ptype> <name>datatype</name></param>
             <param group="VertexShaderStorageTypeEXT"><ptype>GLenum</ptype> <name>storagetype</name></param>
             <param group="ParameterRangeEXT"><ptype>GLenum</ptype> <name>range</name></param>
             <param><ptype>GLuint</ptype> <name>components</name></param>
         </command>
@@ -15760,39 +16210,43 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glGetActiveUniformBlockName</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param len="bufSize"><ptype>GLchar</ptype> *<name>uniformBlockName</name></param>
+            <glx type="single" opcode="220"/>
         </command>
         <command>
             <proto>void <name>glGetActiveUniformBlockiv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param>
             <param group="UniformBlockPName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(program,uniformBlockIndex,pname)"><ptype>GLint</ptype> *<name>params</name></param>
+            <glx type="single" opcode="219"/>
         </command>
         <command>
             <proto>void <name>glGetActiveUniformName</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>uniformIndex</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param len="bufSize"><ptype>GLchar</ptype> *<name>uniformName</name></param>
+            <glx type="single" opcode="217"/>
         </command>
         <command>
             <proto>void <name>glGetActiveUniformsiv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLsizei</ptype> <name>uniformCount</name></param>
             <param len="uniformCount">const <ptype>GLuint</ptype> *<name>uniformIndices</name></param>
             <param group="UniformPName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(uniformCount,pname)"><ptype>GLint</ptype> *<name>params</name></param>
+            <glx type="single" opcode="216"/>
         </command>
         <command>
             <proto>void <name>glGetActiveVaryingNV</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param>
@@ -15837,16 +16291,17 @@ typedef unsigned int GLhandleARB;
             <alias name="glGetAttribLocation"/>
         </command>
         <command>
             <proto>void <name>glGetBooleanIndexedvEXT</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param group="Boolean" len="COMPSIZE(target)"><ptype>GLboolean</ptype> *<name>data</name></param>
             <alias name="glGetBooleani_v"/>
+            <glx type="single" opcode="210"/>
         </command>
         <command>
             <proto>void <name>glGetBooleani_v</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param group="Boolean" len="COMPSIZE(target)"><ptype>GLboolean</ptype> *<name>data</name></param>
         </command>
         <command>
@@ -16431,16 +16886,17 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatus</name></proto>
         </command>
         <command>
             <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusARB</name></proto>
         </command>
         <command>
             <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusEXT</name></proto>
+            <alias name="glGetGraphicsResetStatus"/>
         </command>
         <command>
             <proto group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>glGetGraphicsResetStatusKHR</name></proto>
             <alias name="glGetGraphicsResetStatus"/>
         </command>
         <command>
             <proto group="handleARB"><ptype>GLhandleARB</ptype> <name>glGetHandleARB</name></proto>
             <param><ptype>GLenum</ptype> <name>pname</name></param>
@@ -16555,16 +17011,17 @@ typedef unsigned int GLhandleARB;
             <alias name="glGetInteger64v"/>
         </command>
         <command>
             <proto>void <name>glGetIntegerIndexedvEXT</name></proto>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param len="COMPSIZE(target)"><ptype>GLint</ptype> *<name>data</name></param>
             <alias name="glGetIntegeri_v"/>
+            <glx type="single" opcode="211"/>
         </command>
         <command>
             <proto>void <name>glGetIntegeri_v</name></proto>
             <param group="TypeEnum"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param len="COMPSIZE(target)"><ptype>GLint</ptype> *<name>data</name></param>
         </command>
         <command>
@@ -16786,16 +17243,24 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glGetMaterialxvOES</name></proto>
             <param group="MaterialFace"><ptype>GLenum</ptype> <name>face</name></param>
             <param group="MaterialParameter"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLfixed</ptype> *<name>params</name></param>
         </command>
         <command>
+            <proto>void <name>glGetMemoryObjectDetachedResourcesuivNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLenum</ptype> <name>pname</name></param>
+            <param><ptype>GLint</ptype> <name>first</name></param>
+            <param><ptype>GLsizei</ptype> <name>count</name></param>
+            <param><ptype>GLuint</ptype> *<name>params</name></param>
+        </command>
+        <command>
             <proto>void <name>glGetMemoryObjectParameterivEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>memoryObject</name></param>
             <param group="MemoryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param><ptype>GLint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetMinmax</name></proto>
             <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param>
@@ -17331,17 +17796,17 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLsizei</ptype> <name>groupsSize</name></param>
             <param len="groupsSize"><ptype>GLuint</ptype> *<name>groups</name></param>
         </command>
         <command>
             <proto>void <name>glGetPerfQueryDataINTEL</name></proto>
             <param><ptype>GLuint</ptype> <name>queryHandle</name></param>
             <param><ptype>GLuint</ptype> <name>flags</name></param>
             <param><ptype>GLsizei</ptype> <name>dataSize</name></param>
-            <param><ptype>GLvoid</ptype> *<name>data</name></param>
+            <param>void *<name>data</name></param>
             <param><ptype>GLuint</ptype> *<name>bytesWritten</name></param>
         </command>
         <command>
             <proto>void <name>glGetPerfQueryIdByNameINTEL</name></proto>
             <param><ptype>GLchar</ptype> *<name>queryName</name></param>
             <param><ptype>GLuint</ptype> *<name>queryId</name></param>
         </command>
         <command>
@@ -17742,17 +18207,17 @@ typedef unsigned int GLhandleARB;
             <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetQueryObjectiv"/>
         </command>
         <command>
             <proto>void <name>glGetQueryObjectivEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
             <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
-            <param><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetQueryObjectiv"/>
         </command>
         <command>
             <proto>void <name>glGetQueryObjectui64v</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
             <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLuint64</ptype> *<name>params</name></param>
         </command>
@@ -17777,17 +18242,17 @@ typedef unsigned int GLhandleARB;
             <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param>
             <alias name="glGetQueryObjectuiv"/>
         </command>
         <command>
             <proto>void <name>glGetQueryObjectuivEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
             <param group="QueryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
-            <param><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="COMPSIZE(pname)"><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetQueryiv</name></proto>
             <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <glx type="single" opcode="164"/>
         </command>
@@ -17797,17 +18262,17 @@ typedef unsigned int GLhandleARB;
             <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetQueryiv"/>
         </command>
         <command>
             <proto>void <name>glGetQueryivEXT</name></proto>
             <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="QueryParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
-            <param><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetRenderbufferParameteriv</name></proto>
             <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="RenderbufferParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <glx type="vendor" opcode="1424"/>
         </command>
@@ -17937,16 +18402,29 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glGetShaderiv</name></proto>
             <param><ptype>GLuint</ptype> <name>shader</name></param>
             <param group="ShaderParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param len="COMPSIZE(pname)"><ptype>GLint</ptype> *<name>params</name></param>
             <glx type="single" opcode="198"/>
         </command>
         <command>
+            <proto>void <name>glGetShadingRateImagePaletteNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>viewport</name></param>
+            <param><ptype>GLuint</ptype> <name>entry</name></param>
+            <param len="1"><ptype>GLenum</ptype> *<name>rate</name></param>
+        </command>
+        <command>
+            <proto>void <name>glGetShadingRateSampleLocationivNV</name></proto>
+            <param><ptype>GLenum</ptype> <name>rate</name></param>
+            <param><ptype>GLuint</ptype> <name>samples</name></param>
+            <param><ptype>GLuint</ptype> <name>index</name></param>
+            <param len="3"><ptype>GLint</ptype> *<name>location</name></param>
+        </command>
+        <command>
             <proto>void <name>glGetSharpenTexFuncSGIS</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param len="COMPSIZE(target)"><ptype>GLfloat</ptype> *<name>points</name></param>
             <glx type="vendor" opcode="4097"/>
         </command>
         <command>
             <proto><ptype>GLushort</ptype> <name>glGetStageIndexNV</name></proto>
             <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param>
@@ -17955,16 +18433,17 @@ typedef unsigned int GLhandleARB;
             <proto group="String">const <ptype>GLubyte</ptype> *<name>glGetString</name></proto>
             <param group="StringName"><ptype>GLenum</ptype> <name>name</name></param>
             <glx type="single" opcode="129"/>
         </command>
         <command>
             <proto group="String">const <ptype>GLubyte</ptype> *<name>glGetStringi</name></proto>
             <param group="StringName"><ptype>GLenum</ptype> <name>name</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
+            <glx type="single" opcode="214"/>
         </command>
         <command>
             <proto><ptype>GLuint</ptype> <name>glGetSubroutineIndex</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param group="ShaderType"><ptype>GLenum</ptype> <name>shadertype</name></param>
             <param>const <ptype>GLchar</ptype> *<name>name</name></param>
         </command>
         <command>
@@ -18335,16 +18814,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glGetTransformFeedbackVarying</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param>
             <param len="1"><ptype>GLenum</ptype> *<name>type</name></param>
             <param len="bufSize"><ptype>GLchar</ptype> *<name>name</name></param>
+            <glx type="single" opcode="213"/>
         </command>
         <command>
             <proto>void <name>glGetTransformFeedbackVaryingEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>size</name></param>
@@ -18384,28 +18864,30 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLsizei</ptype> <name>bufsize</name></param>
             <param len="1"><ptype>GLsizei</ptype> *<name>length</name></param>
             <param><ptype>GLchar</ptype> *<name>source</name></param>
         </command>
         <command>
             <proto><ptype>GLuint</ptype> <name>glGetUniformBlockIndex</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param len="COMPSIZE()">const <ptype>GLchar</ptype> *<name>uniformBlockName</name></param>
+            <glx type="single" opcode="218"/>
         </command>
         <command>
             <proto><ptype>GLint</ptype> <name>glGetUniformBufferSizeEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
         </command>
         <command>
             <proto>void <name>glGetUniformIndices</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLsizei</ptype> <name>uniformCount</name></param>
             <param len="COMPSIZE(uniformCount)">const <ptype>GLchar</ptype> *const*<name>uniformNames</name></param>
             <param len="COMPSIZE(uniformCount)"><ptype>GLuint</ptype> *<name>uniformIndices</name></param>
+            <glx type="single" opcode="215"/>
         </command>
         <command>
             <proto><ptype>GLint</ptype> <name>glGetUniformLocation</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param>const <ptype>GLchar</ptype> *<name>name</name></param>
         </command>
         <command>
             <proto><ptype>GLint</ptype> <name>glGetUniformLocationARB</name></proto>
@@ -18995,47 +19477,47 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glGetnTexImage</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLint</ptype> <name>level</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>pixels</name></param>
+            <param len="bufSize">void *<name>pixels</name></param>
         </command>
         <command>
             <proto>void <name>glGetnTexImageARB</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLint</ptype> <name>level</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="bufSize">void *<name>img</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformdv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLdouble</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformdvARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="bufSize"><ptype>GLdouble</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformfv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformfvARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
         </command>
@@ -19047,32 +19529,32 @@ typedef unsigned int GLhandleARB;
             <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
             <alias name="glGetnUniformfv"/>
         </command>
         <command>
             <proto>void <name>glGetnUniformfvKHR</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLfloat</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLfloat</ptype> *<name>params</name></param>
             <alias name="glGetnUniformfv"/>
         </command>
         <command>
             <proto>void <name>glGetnUniformi64vARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLint64</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLint64</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformiv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformivARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
         </command>
@@ -19084,46 +19566,46 @@ typedef unsigned int GLhandleARB;
             <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformiv"/>
         </command>
         <command>
             <proto>void <name>glGetnUniformivKHR</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLint</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformiv"/>
         </command>
         <command>
             <proto>void <name>glGetnUniformui64vARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLuint64</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLuint64</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuiv</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuivARB</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
             <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glGetnUniformuivKHR</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param><ptype>GLuint</ptype> *<name>params</name></param>
+            <param len="bufSize"><ptype>GLuint</ptype> *<name>params</name></param>
             <alias name="glGetnUniformuiv"/>
         </command>
         <command>
             <proto>void <name>glGlobalAlphaFactorbSUN</name></proto>
             <param><ptype>GLbyte</ptype> <name>factor</name></param>
         </command>
         <command>
             <proto>void <name>glGlobalAlphaFactordSUN</name></proto>
@@ -19472,16 +19954,17 @@ typedef unsigned int GLhandleARB;
             <param group="EnableCap"><ptype>GLenum</ptype> <name>cap</name></param>
             <glx type="single" opcode="140"/>
         </command>
         <command>
             <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnabledIndexedEXT</name></proto>
             <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <alias name="glIsEnabledi"/>
+            <glx type="single" opcode="212"/>
         </command>
         <command>
             <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnabledi</name></proto>
             <param group="EnableCap"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
         </command>
         <command>
             <proto group="Boolean"><ptype>GLboolean</ptype> <name>glIsEnablediEXT</name></proto>
@@ -20144,17 +20627,17 @@ typedef unsigned int GLhandleARB;
             <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param>
             <glx type="single" opcode="205"/>
         </command>
         <command>
             <proto>void *<name>glMapBufferRangeEXT</name></proto>
             <param group="BufferTargetARB"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>length</name></param>
-            <param><ptype>GLbitfield</ptype> <name>access</name></param>
+            <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param>
             <alias name="glMapBufferRange"/>
         </command>
         <command>
             <proto>void <name>glMapControlPointsNV</name></proto>
             <param group="EvalTargetNV"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param group="MapTypeNV"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>ustride</name></param>
@@ -20222,17 +20705,17 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferAccessARB"><ptype>GLenum</ptype> <name>access</name></param>
         </command>
         <command>
             <proto>void *<name>glMapNamedBufferRange</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>length</name></param>
-            <param><ptype>GLbitfield</ptype> <name>access</name></param>
+            <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param>
         </command>
         <command>
             <proto>void *<name>glMapNamedBufferRangeEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>length</name></param>
             <param group="BufferAccessMask"><ptype>GLbitfield</ptype> <name>access</name></param>
         </command>
@@ -20549,25 +21032,25 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glMaxShaderCompilerThreadsARB</name></proto>
             <param><ptype>GLuint</ptype> <name>count</name></param>
             <alias name="glMaxShaderCompilerThreadsKHR"/>
         </command>
         <command>
             <proto>void <name>glMemoryBarrier</name></proto>
-            <param><ptype>GLbitfield</ptype> <name>barriers</name></param>
+            <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param>
         </command>
         <command>
             <proto>void <name>glMemoryBarrierByRegion</name></proto>
-            <param><ptype>GLbitfield</ptype> <name>barriers</name></param>
+            <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param>
         </command>
         <command>
             <proto>void <name>glMemoryBarrierEXT</name></proto>
-            <param><ptype>GLbitfield</ptype> <name>barriers</name></param>
+            <param group="MemoryBarrierMask"><ptype>GLbitfield</ptype> <name>barriers</name></param>
             <alias name="glMemoryBarrier"/>
         </command>
         <command>
             <proto>void <name>glMemoryObjectParameterivEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>memoryObject</name></param>
             <param group="MemoryObjectParameterName"><ptype>GLenum</ptype> <name>pname</name></param>
             <param>const <ptype>GLint</ptype> *<name>params</name></param>
         </command>
@@ -20815,16 +21298,29 @@ typedef unsigned int GLhandleARB;
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param>
             <param group="DrawElementsType"><ptype>GLenum</ptype> <name>type</name></param>
             <param len="COMPSIZE(drawcount,stride)">const void *<name>indirect</name></param>
             <param><ptype>GLsizei</ptype> <name>drawcount</name></param>
             <param><ptype>GLsizei</ptype> <name>stride</name></param>
             <alias name="glMultiDrawElementsIndirect"/>
         </command>
         <command>
+            <proto>void <name>glMultiDrawMeshTasksIndirectNV</name></proto>
+            <param><ptype>GLintptr</ptype> <name>indirect</name></param>
+            <param><ptype>GLsizei</ptype> <name>drawcount</name></param>
+            <param><ptype>GLsizei</ptype> <name>stride</name></param>
+        </command>
+        <command>
+            <proto>void <name>glMultiDrawMeshTasksIndirectCountNV</name></proto>
+            <param><ptype>GLintptr</ptype> <name>indirect</name></param>
+            <param><ptype>GLintptr</ptype> <name>drawcount</name></param>
+            <param><ptype>GLsizei</ptype> <name>maxdrawcount</name></param>
+            <param><ptype>GLsizei</ptype> <name>stride</name></param>
+        </command>
+        <command>
             <proto>void <name>glMultiDrawRangeElementArrayAPPLE</name></proto>
             <param group="PrimitiveType"><ptype>GLenum</ptype> <name>mode</name></param>
             <param><ptype>GLuint</ptype> <name>start</name></param>
             <param><ptype>GLuint</ptype> <name>end</name></param>
             <param len="primcount">const <ptype>GLint</ptype> *<name>first</name></param>
             <param len="primcount">const <ptype>GLsizei</ptype> *<name>count</name></param>
             <param><ptype>GLsizei</ptype> <name>primcount</name></param>
         </command>
@@ -21739,26 +22235,26 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLint</ptype> <name>srcX0</name></param>
             <param><ptype>GLint</ptype> <name>srcY0</name></param>
             <param><ptype>GLint</ptype> <name>srcX1</name></param>
             <param><ptype>GLint</ptype> <name>srcY1</name></param>
             <param><ptype>GLint</ptype> <name>dstX0</name></param>
             <param><ptype>GLint</ptype> <name>dstY0</name></param>
             <param><ptype>GLint</ptype> <name>dstX1</name></param>
             <param><ptype>GLint</ptype> <name>dstY1</name></param>
-            <param><ptype>GLbitfield</ptype> <name>mask</name></param>
+            <param group="ClearBufferMask"><ptype>GLbitfield</ptype> <name>mask</name></param>
             <param><ptype>GLenum</ptype> <name>filter</name></param>
         </command>
         <command>
             <proto>void <name>glMulticastBufferSubDataNV</name></proto>
             <param><ptype>GLbitfield</ptype> <name>gpuMask</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
-            <param>const <ptype>GLvoid</ptype> *<name>data</name></param>
+            <param>const void *<name>data</name></param>
         </command>
         <command>
             <proto>void <name>glMulticastCopyBufferSubDataNV</name></proto>
             <param><ptype>GLuint</ptype> <name>readGpu</name></param>
             <param><ptype>GLbitfield</ptype> <name>writeGpuMask</name></param>
             <param><ptype>GLuint</ptype> <name>readBuffer</name></param>
             <param><ptype>GLuint</ptype> <name>writeBuffer</name></param>
             <param><ptype>GLintptr</ptype> <name>readOffset</name></param>
@@ -21822,16 +22318,22 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLuint</ptype> *<name>params</name></param>
         </command>
         <command>
             <proto>void <name>glMulticastWaitSyncNV</name></proto>
             <param><ptype>GLuint</ptype> <name>signalGpu</name></param>
             <param><ptype>GLbitfield</ptype> <name>waitGpuMask</name></param>
         </command>
         <command>
+            <proto>void <name>glNamedBufferAttachMemoryNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>buffer</name></param>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLuint64</ptype> <name>offset</name></param>
+        </command>
+        <command>
             <proto>void <name>glNamedBufferData</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param>const void *<name>data</name></param>
             <param group="VertexBufferObjectUsage"><ptype>GLenum</ptype> <name>usage</name></param>
         </command>
         <command>
             <proto>void <name>glNamedBufferDataEXT</name></proto>
@@ -21854,32 +22356,32 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param><ptype>GLboolean</ptype> <name>commit</name></param>
         </command>
         <command>
             <proto>void <name>glNamedBufferStorage</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param len="size">const void *<name>data</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glNamedBufferStorageExternalEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param><ptype>GLintptr</ptype> <name>offset</name></param>
             <param><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param><ptype>GLeglClientBufferEXT</ptype> <name>clientBuffer</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glNamedBufferStorageEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param len="size">const void *<name>data</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="MapBufferUsageMask"><ptype>GLbitfield</ptype> <name>flags</name></param>
             <alias name="glNamedBufferStorage"/>
         </command>
         <command>
             <proto>void <name>glNamedBufferStorageMemEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <param group="BufferSize"><ptype>GLsizeiptr</ptype> <name>size</name></param>
             <param><ptype>GLuint</ptype> <name>memory</name></param>
             <param><ptype>GLuint64</ptype> <name>offset</name></param>
@@ -22155,16 +22657,25 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glNamedRenderbufferStorageMultisample</name></proto>
             <param><ptype>GLuint</ptype> <name>renderbuffer</name></param>
             <param><ptype>GLsizei</ptype> <name>samples</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
         </command>
         <command>
+            <proto>void <name>glNamedRenderbufferStorageMultisampleAdvancedAMD</name></proto>
+            <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param>
+            <param><ptype>GLsizei</ptype> <name>samples</name></param>
+            <param><ptype>GLsizei</ptype> <name>storageSamples</name></param>
+            <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
+            <param><ptype>GLsizei</ptype> <name>width</name></param>
+            <param><ptype>GLsizei</ptype> <name>height</name></param>
+        </command>
+        <command>
             <proto>void <name>glNamedRenderbufferStorageMultisampleCoverageEXT</name></proto>
             <param group="Renderbuffer"><ptype>GLuint</ptype> <name>renderbuffer</name></param>
             <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param>
             <param><ptype>GLsizei</ptype> <name>colorSamples</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
         </command>
@@ -22569,27 +23080,27 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glPathFogGenNV</name></proto>
             <param group="PathGenMode"><ptype>GLenum</ptype> <name>genMode</name></param>
         </command>
         <command>
             <proto><ptype>GLenum</ptype> <name>glPathGlyphIndexArrayNV</name></proto>
             <param><ptype>GLuint</ptype> <name>firstPathName</name></param>
             <param><ptype>GLenum</ptype> <name>fontTarget</name></param>
             <param>const void *<name>fontName</name></param>
-            <param><ptype>GLbitfield</ptype> <name>fontStyle</name></param>
+            <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param>
             <param><ptype>GLuint</ptype> <name>firstGlyphIndex</name></param>
             <param><ptype>GLsizei</ptype> <name>numGlyphs</name></param>
             <param><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param>
             <param><ptype>GLfloat</ptype> <name>emScale</name></param>
         </command>
         <command>
             <proto><ptype>GLenum</ptype> <name>glPathGlyphIndexRangeNV</name></proto>
             <param><ptype>GLenum</ptype> <name>fontTarget</name></param>
             <param>const void *<name>fontName</name></param>
-            <param><ptype>GLbitfield</ptype> <name>fontStyle</name></param>
+            <param group="PathFontStyle"><ptype>GLbitfield</ptype> <name>fontStyle</name></param>
             <param><ptype>GLuint</ptype> <name>pathParameterTemplate</name></param>
             <param><ptype>GLfloat</ptype> <name>emScale</name></param>
             <param><ptype>GLuint</ptype> <name>baseAndCount</name>[2]</param>
         </command>
         <command>
             <proto>void <name>glPathGlyphRangeNV</name></proto>
             <param group="Path"><ptype>GLuint</ptype> <name>firstPathName</name></param>
             <param group="PathFontTarget"><ptype>GLenum</ptype> <name>fontTarget</name></param>
@@ -23126,19 +23637,21 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glPrimitiveRestartIndex</name></proto>
             <param><ptype>GLuint</ptype> <name>index</name></param>
         </command>
         <command>
             <proto>void <name>glPrimitiveRestartIndexNV</name></proto>
             <param><ptype>GLuint</ptype> <name>index</name></param>
+            <glx type="render" opcode="365"/>
         </command>
         <command>
             <proto>void <name>glPrimitiveRestartNV</name></proto>
+            <glx type="render" opcode="364"/>
         </command>
         <command>
             <proto>void <name>glPrioritizeTextures</name></proto>
             <param><ptype>GLsizei</ptype> <name>n</name></param>
             <param group="Texture" len="n">const <ptype>GLuint</ptype> *<name>textures</name></param>
             <param len="n">const <ptype>GLfloat</ptype> *<name>priorities</name></param>
             <glx type="render" opcode="4118"/>
         </command>
@@ -24621,38 +25134,38 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glPushName</name></proto>
             <param group="SelectName"><ptype>GLuint</ptype> <name>name</name></param>
             <glx type="render" opcode="125"/>
         </command>
         <command>
             <proto>void <name>glQueryCounter</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
-            <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
+            <param group="QueryCounterTarget"><ptype>GLenum</ptype> <name>target</name></param>
         </command>
         <command>
             <proto>void <name>glQueryCounterEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>id</name></param>
-            <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
+            <param group="QueryCounterTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <alias name="glQueryCounter"/>
         </command>
         <command>
             <proto><ptype>GLbitfield</ptype> <name>glQueryMatrixxOES</name></proto>
             <param len="16"><ptype>GLfixed</ptype> *<name>mantissa</name></param>
             <param len="16"><ptype>GLint</ptype> *<name>exponent</name></param>
         </command>
         <command>
             <proto>void <name>glQueryObjectParameteruiAMD</name></proto>
             <param group="QueryTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLuint</ptype> <name>id</name></param>
             <param><ptype>GLenum</ptype> <name>pname</name></param>
             <param group="OcclusionQueryEventMaskAMD"><ptype>GLuint</ptype> <name>param</name></param>
         </command>
         <command>
-            <proto>GLint <name>glQueryResourceNV</name></proto>
+            <proto><ptype>GLint</ptype> <name>glQueryResourceNV</name></proto>
             <param><ptype>GLenum</ptype> <name>queryType</name></param>
             <param><ptype>GLint</ptype> <name>tagId</name></param>
             <param><ptype>GLuint</ptype> <name>bufSize</name></param>
             <param><ptype>GLint</ptype> *<name>buffer</name></param>
         </command>
         <command>
             <proto>void <name>glQueryResourceTagNV</name></proto>
             <param><ptype>GLint</ptype> <name>tagId</name></param>
@@ -24872,17 +25385,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glReadnPixels</name></proto>
             <param><ptype>GLint</ptype> <name>x</name></param>
             <param><ptype>GLint</ptype> <name>y</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLsizei</ptype> <name>bufSize</name></param>
-            <param>void *<name>data</name></param>
+            <param len="bufSize">void *<name>data</name></param>
         </command>
         <command>
             <proto>void <name>glReadnPixelsARB</name></proto>
             <param><ptype>GLint</ptype> <name>x</name></param>
             <param><ptype>GLint</ptype> <name>y</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
@@ -25043,16 +25556,25 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glRenderbufferStorageMultisampleAPPLE</name></proto>
             <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizei</ptype> <name>samples</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
         </command>
         <command>
+            <proto>void <name>glRenderbufferStorageMultisampleAdvancedAMD</name></proto>
+            <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param>
+            <param><ptype>GLsizei</ptype> <name>samples</name></param>
+            <param><ptype>GLsizei</ptype> <name>storageSamples</name></param>
+            <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
+            <param><ptype>GLsizei</ptype> <name>width</name></param>
+            <param><ptype>GLsizei</ptype> <name>height</name></param>
+        </command>
+        <command>
             <proto>void <name>glRenderbufferStorageMultisampleCoverageNV</name></proto>
             <param group="RenderbufferTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizei</ptype> <name>coverageSamples</name></param>
             <param><ptype>GLsizei</ptype> <name>colorSamples</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
         </command>
@@ -25273,16 +25795,21 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glResetHistogramEXT</name></proto>
             <param group="HistogramTargetEXT"><ptype>GLenum</ptype> <name>target</name></param>
             <alias name="glResetHistogram"/>
             <glx type="render" opcode="4112"/>
         </command>
         <command>
+            <proto>void <name>glResetMemoryObjectParameterNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLenum</ptype> <name>pname</name></param>
+        </command>
+        <command>
             <proto>void <name>glResetMinmax</name></proto>
             <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param>
             <glx type="render" opcode="4113"/>
         </command>
         <command>
             <proto>void <name>glResetMinmaxEXT</name></proto>
             <param group="MinmaxTargetEXT"><ptype>GLenum</ptype> <name>target</name></param>
             <alias name="glResetMinmax"/>
@@ -25508,16 +26035,29 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glScissorArrayvOES</name></proto>
             <param><ptype>GLuint</ptype> <name>first</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>v</name></param>
             <alias name="glScissorArrayv"/>
         </command>
         <command>
+            <proto>void <name>glScissorExclusiveArrayvNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>first</name></param>
+            <param><ptype>GLsizei</ptype> <name>count</name></param>
+            <param len="COMPSIZE(count)">const <ptype>GLint</ptype> *<name>v</name></param>
+        </command>
+        <command>
+            <proto>void <name>glScissorExclusiveNV</name></proto>
+            <param group="WinCoord"><ptype>GLint</ptype> <name>x</name></param>
+            <param group="WinCoord"><ptype>GLint</ptype> <name>y</name></param>
+            <param><ptype>GLsizei</ptype> <name>width</name></param>
+            <param><ptype>GLsizei</ptype> <name>height</name></param>
+        </command>
+        <command>
             <proto>void <name>glScissorIndexed</name></proto>
             <param><ptype>GLuint</ptype> <name>index</name></param>
             <param><ptype>GLint</ptype> <name>left</name></param>
             <param><ptype>GLint</ptype> <name>bottom</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
         </command>
         <command>
@@ -25943,16 +26483,37 @@ typedef unsigned int GLhandleARB;
         </command>
         <command>
             <proto>void <name>glShaderStorageBlockBinding</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>storageBlockIndex</name></param>
             <param><ptype>GLuint</ptype> <name>storageBlockBinding</name></param>
         </command>
         <command>
+            <proto>void <name>glShadingRateImageBarrierNV</name></proto>
+            <param><ptype>GLboolean</ptype> <name>synchronize</name></param>
+        </command>
+        <command>
+            <proto>void <name>glShadingRateImagePaletteNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>viewport</name></param>
+            <param><ptype>GLuint</ptype> <name>first</name></param>
+            <param><ptype>GLsizei</ptype> <name>count</name></param>
+            <param len="count">const <ptype>GLenum</ptype> *<name>rates</name></param>
+        </command>
+        <command>
+            <proto>void <name>glShadingRateSampleOrderNV</name></proto>
+            <param><ptype>GLenum</ptype> <name>order</name></param>
+        </command>
+        <command>
+            <proto>void <name>glShadingRateSampleOrderCustomNV</name></proto>
+            <param><ptype>GLenum</ptype> <name>rate</name></param>
+            <param><ptype>GLuint</ptype> <name>samples</name></param>
+            <param len="COMPSIZE(rate,samples)">const <ptype>GLint</ptype> *<name>locations</name></param>
+        </command>
+        <command>
             <proto>void <name>glSharpenTexFuncSGIS</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizei</ptype> <name>n</name></param>
             <param len="n*2">const <ptype>GLfloat</ptype> *<name>points</name></param>
             <glx type="render" opcode="2052"/>
         </command>
         <command>
             <proto>void <name>glSignalSemaphoreEXT</name></proto>
@@ -26009,17 +26570,17 @@ typedef unsigned int GLhandleARB;
             <glx type="render" opcode="2069"/>
         </command>
         <command>
             <proto>void <name>glStartTilingQCOM</name></proto>
             <param><ptype>GLuint</ptype> <name>x</name></param>
             <param><ptype>GLuint</ptype> <name>y</name></param>
             <param><ptype>GLuint</ptype> <name>width</name></param>
             <param><ptype>GLuint</ptype> <name>height</name></param>
-            <param><ptype>GLbitfield</ptype> <name>preserveMask</name></param>
+            <param group="BufferBitQCOM"><ptype>GLbitfield</ptype> <name>preserveMask</name></param>
         </command>
         <command>
             <proto>void <name>glStateCaptureNV</name></proto>
             <param><ptype>GLuint</ptype> <name>state</name></param>
             <param><ptype>GLenum</ptype> <name>mode</name></param>
         </command>
         <command>
             <proto>void <name>glStencilClearTagEXT</name></proto>
@@ -26272,27 +26833,34 @@ typedef unsigned int GLhandleARB;
             <glx type="vendor" opcode="1279"/>
         </command>
         <command>
             <proto group="Boolean"><ptype>GLboolean</ptype> <name>glTestObjectAPPLE</name></proto>
             <param group="ObjectTypeAPPLE"><ptype>GLenum</ptype> <name>object</name></param>
             <param><ptype>GLuint</ptype> <name>name</name></param>
         </command>
         <command>
+            <proto>void <name>glTexAttachMemoryNV</name></proto>
+            <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLuint64</ptype> <name>offset</name></param>
+        </command>
+        <command>
             <proto>void <name>glTexBuffer</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
         </command>
         <command>
             <proto>void <name>glTexBufferARB</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <alias name="glTexBuffer"/>
+            <glx type="render" opcode="367"/>
         </command>
         <command>
             <proto>void <name>glTexBufferEXT</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalformat</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
             <alias name="glTexBuffer"/>
         </command>
@@ -27372,17 +27940,17 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glTexStorageSparseAMD</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalFormat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
             <param><ptype>GLsizei</ptype> <name>depth</name></param>
             <param><ptype>GLsizei</ptype> <name>layers</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="TextureStorageMaskAMD"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glTexSubImage1D</name></proto>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param>
             <param group="CheckedInt32"><ptype>GLint</ptype> <name>xoffset</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
@@ -27490,16 +28058,22 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLsizei</ptype> <name>depth</name></param>
             <param><ptype>GLsizei</ptype> <name>size4d</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
             <param group="PixelType"><ptype>GLenum</ptype> <name>type</name></param>
             <param len="COMPSIZE(format,type,width,height,depth,size4d)">const void *<name>pixels</name></param>
             <glx type="render" opcode="2058"/>
         </command>
         <command>
+            <proto>void <name>glTextureAttachMemoryNV</name></proto>
+            <param><ptype>GLuint</ptype> <name>texture</name></param>
+            <param><ptype>GLuint</ptype> <name>memory</name></param>
+            <param><ptype>GLuint64</ptype> <name>offset</name></param>
+        </command>
+        <command>
             <proto>void <name>glTextureBarrier</name></proto>
         </command>
         <command>
             <proto>void <name>glTextureBarrierNV</name></proto>
             <glx type="render" opcode="4348"/>
         </command>
         <command>
             <proto>void <name>glTextureBuffer</name></proto>
@@ -27535,16 +28109,27 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glTextureColorMaskSGIS</name></proto>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>red</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>green</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>blue</name></param>
             <param group="Boolean"><ptype>GLboolean</ptype> <name>alpha</name></param>
             <glx type="render" opcode="2082"/>
         </command>
         <command>
+            <proto>void <name>glTextureFoveationParametersQCOM</name></proto>
+            <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param>
+            <param><ptype>GLuint</ptype> <name>layer</name></param>
+            <param><ptype>GLuint</ptype> <name>focalPoint</name></param>
+            <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalX</name></param>
+            <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>focalY</name></param>
+            <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainX</name></param>
+            <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>gainY</name></param>
+            <param group="CheckedFloat32"><ptype>GLfloat</ptype> <name>foveaArea</name></param>
+        </command>
+        <command>
             <proto>void <name>glTextureImage1DEXT</name></proto>
             <param group="Texture"><ptype>GLuint</ptype> <name>texture</name></param>
             <param group="TextureTarget"><ptype>GLenum</ptype> <name>target</name></param>
             <param group="CheckedInt32"><ptype>GLint</ptype> <name>level</name></param>
             <param group="InternalFormat"><ptype>GLint</ptype> <name>internalformat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param group="CheckedInt32"><ptype>GLint</ptype> <name>border</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
@@ -27887,17 +28472,17 @@ typedef unsigned int GLhandleARB;
             <proto>void <name>glTextureStorageSparseAMD</name></proto>
             <param><ptype>GLuint</ptype> <name>texture</name></param>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param group="InternalFormat"><ptype>GLenum</ptype> <name>internalFormat</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param><ptype>GLsizei</ptype> <name>height</name></param>
             <param><ptype>GLsizei</ptype> <name>depth</name></param>
             <param><ptype>GLsizei</ptype> <name>layers</name></param>
-            <param><ptype>GLbitfield</ptype> <name>flags</name></param>
+            <param group="TextureStorageMaskAMD"><ptype>GLbitfield</ptype> <name>flags</name></param>
         </command>
         <command>
             <proto>void <name>glTextureSubImage1D</name></proto>
             <param><ptype>GLuint</ptype> <name>texture</name></param>
             <param><ptype>GLint</ptype> <name>level</name></param>
             <param><ptype>GLint</ptype> <name>xoffset</name></param>
             <param><ptype>GLsizei</ptype> <name>width</name></param>
             <param group="PixelFormat"><ptype>GLenum</ptype> <name>format</name></param>
@@ -28041,16 +28626,17 @@ typedef unsigned int GLhandleARB;
             <param><ptype>GLenum</ptype> <name>bufferMode</name></param>
         </command>
         <command>
             <proto>void <name>glTransformFeedbackVaryings</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="count">const <ptype>GLchar</ptype> *const*<name>varyings</name></param>
             <param><ptype>GLenum</ptype> <name>bufferMode</name></param>
+            <glx type="render" opcode="359"/>
         </command>
         <command>
             <proto>void <name>glTransformFeedbackVaryingsEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLsizei</ptype> <name>count</name></param>
             <param len="count">const <ptype>GLchar</ptype> *const*<name>varyings</name></param>
             <param><ptype>GLenum</ptype> <name>bufferMode</name></param>
             <alias name="glTransformFeedbackVaryings"/>
@@ -28669,16 +29255,17 @@ typedef unsigned int GLhandleARB;
             <param len="count*4">const <ptype>GLuint</ptype> *<name>value</name></param>
             <alias name="glUniform4uiv"/>
         </command>
         <command>
             <proto>void <name>glUniformBlockBinding</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLuint</ptype> <name>uniformBlockIndex</name></param>
             <param><ptype>GLuint</ptype> <name>uniformBlockBinding</name></param>
+            <glx type="render" opcode="366"/>
         </command>
         <command>
             <proto>void <name>glUniformBufferEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>program</name></param>
             <param><ptype>GLint</ptype> <name>location</name></param>
             <param><ptype>GLuint</ptype> <name>buffer</name></param>
         </command>
         <command>
@@ -28986,23 +29573,23 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto>void <name>glUseProgramObjectARB</name></proto>
             <param group="handleARB"><ptype>GLhandleARB</ptype> <name>programObj</name></param>
             <alias name="glUseProgram"/>
         </command>
         <command>
             <proto>void <name>glUseProgramStages</name></proto>
             <param><ptype>GLuint</ptype> <name>pipeline</name></param>
-            <param><ptype>GLbitfield</ptype> <name>stages</name></param>
+            <param group="UseProgramStageMask"><ptype>GLbitfield</ptype> <name>stages</name></param>
             <param><ptype>GLuint</ptype> <name>program</name></param>
         </command>
         <command>
             <proto>void <name>glUseProgramStagesEXT</name></proto>
             <param><ptype>GLuint</ptype> <name>pipeline</name></param>
-            <param><ptype>GLbitfield</ptype> <name>stages</name></param>
+            <param group="UseProgramStageMask"><ptype>GLbitfield</ptype> <name>stages</name></param>
             <param><ptype>GLuint</ptype> <name>program</name></param>
         </command>
         <command>
             <proto>void <name>glUseShaderProgramEXT</name></proto>
             <param><ptype>GLenum</ptype> <name>type</name></param>
             <param><ptype>GLuint</ptype> <name>program</name></param>
         </command>
         <command>
@@ -29040,16 +29627,24 @@ typedef unsigned int GLhandleARB;
         <command>
             <proto group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>glVDPAURegisterVideoSurfaceNV</name></proto>
             <param>const void *<name>vdpSurface</name></param>
             <param><ptype>GLenum</ptype> <name>target</name></param>
             <param><ptype>GLsizei</ptype> <name>numTextureNames</name></param>
             <param len="numTextureNames">const <ptype>GLuint</ptype> *<name>textureNames</name></param>
         </command>
         <command>
+            <proto group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>glVDPAURegisterVideoSurfaceWithPictureStructureNV</name></proto>
+            <param>const void *<name>vdpSurface</name></param>
+            <param><ptype>GLenum</ptype> <name>target</name></param>
+            <param><ptype>GLsizei</ptype> <name>numTextureNames</name></param>
+            <param len="numTextureNames">const <ptype>GLuint</ptype> *<name>textureNames</name></param>
+            <param group="Boolean"><ptype>GLboolean</ptype> <name>isFrameStructure</name></param>
+        </command>
+        <command>
             <proto>void <name>glVDPAUSurfaceAccessNV</name></proto>
             <param group="vdpauSurfaceNV"><ptype>GLvdpauSurfaceNV</ptype> <name>surface</name></param>
             <param><ptype>GLenum</ptype> <name>access</name></param>
         </command>
         <command>
             <proto>void <name>glVDPAUUnmapSurfacesNV</name></proto>
             <param><ptype>GLsizei</ptype> <name>numSurface</name></param>
             <param group="vdpauSurfaceNV" len="numSurface">const <ptype>GLvdpauSurfaceNV</ptype> *<name>surfaces</name></param>
@@ -33748,16 +34343,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_RENDERBUFFER_RED_SIZE"/>
             <enum name="GL_RENDERBUFFER_GREEN_SIZE"/>
             <enum name="GL_RENDERBUFFER_BLUE_SIZE"/>
             <enum name="GL_RENDERBUFFER_ALPHA_SIZE"/>
             <enum name="GL_RENDERBUFFER_DEPTH_SIZE"/>
             <enum name="GL_RENDERBUFFER_STENCIL_SIZE"/>
             <enum name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/>
             <enum name="GL_MAX_SAMPLES"/>
+            <enum name="GL_INDEX"/>
             <command name="glIsRenderbuffer"/>
             <command name="glBindRenderbuffer"/>
             <command name="glDeleteRenderbuffers"/>
             <command name="glGenRenderbuffers"/>
             <command name="glRenderbufferStorage"/>
             <command name="glGetRenderbufferParameteriv"/>
             <command name="glIsFramebuffer"/>
             <command name="glBindFramebuffer"/>
@@ -33769,18 +34365,17 @@ typedef unsigned int GLhandleARB;
             <command name="glFramebufferTexture3D"/>
             <command name="glFramebufferRenderbuffer"/>
             <command name="glGetFramebufferAttachmentParameteriv"/>
             <command name="glGenerateMipmap"/>
             <command name="glBlitFramebuffer"/>
             <command name="glRenderbufferStorageMultisample"/>
             <command name="glFramebufferTextureLayer"/>
         </require>
-        <require profile="compatibility" comment="Reuse ARB_framebuffer_object compatibility profile">
-            <enum name="GL_INDEX"/>
+        <require comment="Reuse ARB_texture_float">
             <enum name="GL_TEXTURE_LUMINANCE_TYPE"/>
             <enum name="GL_TEXTURE_INTENSITY_TYPE"/>
         </require>
         <require comment="Reuse ARB_framebuffer_sRGB">
             <enum name="GL_FRAMEBUFFER_SRGB"/>
         </require>
         <require comment="Reuse ARB_half_float_vertex">
             <type name="GLhalf"/>
@@ -34818,16 +35413,17 @@ typedef unsigned int GLhandleARB;
             <enum name="GL_SLUMINANCE8"/>
             <enum name="GL_COMPRESSED_SLUMINANCE"/>
             <enum name="GL_COMPRESSED_SLUMINANCE_ALPHA"/>
         </remove>
         <remove profile="core" comment="Compatibility-only GL 3.0 features removed from GL 3.2">
             <enum name="GL_CLAMP_VERTEX_COLOR"/>
             <enum name="GL_CLAMP_FRAGMENT_COLOR"/>
             <enum name="GL_ALPHA_INTEGER"/>
+            <enum name="GL_INDEX"/>
             <enum name="GL_TEXTURE_LUMINANCE_TYPE"/>
             <enum name="GL_TEXTURE_INTENSITY_TYPE"/>
         </remove>
         <!-- Deprecated (not removed) in OpenGL 3.2 core;
              deprecate tag not defined/supported yet
           <deprecate profile="core">
             <enum name="GL_MAX_VARYING_FLOATS"/>
             <enum name="GL_MAX_VARYING_COMPONENTS"/>
@@ -35811,17 +36407,16 @@ typedef unsigned int GLhandleARB;
             <command name="glGetPointerv"/>
         </require>
         <require profile="compatibility" comment="KHR_debug functionality not supported in core profile">
             <enum name="GL_DISPLAY_LIST"/>
         </require>
         <require profile="core" comment="Restore functionality removed in GL 3.2 core to GL 4.3. Needed for debug interface.">
             <enum name="GL_STACK_UNDERFLOW"/>
             <enum name="GL_STACK_OVERFLOW"/>
-            <command name="glGetPointerv"/>
         </require>
         <!-- Deprecated in OpenGL 4.3 core;
              deprecate tag not defined/supported yet
           <deprecate profile="core">
             <enum name="GL_UNPACK_LSB_FIRST"/>
             <enum name="GL_PACK_LSB_FIRST"/>
           </deprecate>
         -->
@@ -38591,16 +39186,28 @@ typedef unsigned int GLhandleARB;
         <extension name="GL_AMD_draw_buffers_blend" supported="gl">
             <require>
                 <command name="glBlendFuncIndexedAMD"/>
                 <command name="glBlendFuncSeparateIndexedAMD"/>
                 <command name="glBlendEquationIndexedAMD"/>
                 <command name="glBlendEquationSeparateIndexedAMD"/>
             </require>
         </extension>
+        <extension name="GL_AMD_framebuffer_multisample_advanced" supported="gl|glcore|gles2">
+            <require>
+                <enum name="GL_RENDERBUFFER_STORAGE_SAMPLES_AMD"/>
+                <enum name="GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD"/>
+                <enum name="GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD"/>
+                <enum name="GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD"/>
+                <enum name="GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD"/>
+                <enum name="GL_SUPPORTED_MULTISAMPLE_MODES_AMD"/>
+                <command name="glRenderbufferStorageMultisampleAdvancedAMD"/>
+                <command name="glNamedRenderbufferStorageMultisampleAdvancedAMD"/>
+            </require>
+        </extension>
         <extension name="GL_AMD_framebuffer_sample_positions" supported="gl">
             <require>
                 <enum name="GL_SUBSAMPLE_DISTANCE_AMD"/>
                 <enum name="GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD"/>
                 <enum name="GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD"/>
                 <enum name="GL_ALL_PIXELS_AMD"/>
                 <command name="glFramebufferSamplePositionsfvAMD"/>
                 <command name="glNamedFramebufferSamplePositionsfvAMD"/>
@@ -38785,16 +39392,17 @@ typedef unsigned int GLhandleARB;
         </extension>
         <extension name="GL_AMD_seamless_cubemap_per_texture" supported="gl">
             <require>
                 <enum name="GL_TEXTURE_CUBE_MAP_SEAMLESS"/>
             </require>
         </extension>
         <extension name="GL_AMD_shader_atomic_counter_ops" supported="gl"/>
         <extension name="GL_AMD_shader_ballot" supported="gl"/>
+        <extension name="GL_AMD_shader_gpu_shader_half_float_fetch" supported="gl"/>
         <extension name="GL_AMD_shader_image_load_store_lod" supported="gl"/>
         <extension name="GL_AMD_shader_stencil_export" supported="gl"/>
         <extension name="GL_AMD_shader_trinary_minmax" supported="gl"/>
         <extension name="GL_AMD_shader_explicit_vertex_parameter" supported="gl"/>
         <extension name="GL_AMD_sparse_texture" supported="gl">
             <require>
                 <enum name="GL_VIRTUAL_PAGE_SIZE_X_AMD"/>
                 <enum name="GL_VIRTUAL_PAGE_SIZE_Y_AMD"/>
@@ -40295,16 +40903,39 @@ typedef unsigned int GLhandleARB;
                 <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGB"/>
                 <enum name="GL_VIEW_CLASS_S3TC_DXT1_RGBA"/>
                 <enum name="GL_VIEW_CLASS_S3TC_DXT3_RGBA"/>
                 <enum name="GL_VIEW_CLASS_S3TC_DXT5_RGBA"/>
                 <enum name="GL_VIEW_CLASS_RGTC1_RED"/>
                 <enum name="GL_VIEW_CLASS_RGTC2_RG"/>
                 <enum name="GL_VIEW_CLASS_BPTC_UNORM"/>
                 <enum name="GL_VIEW_CLASS_BPTC_FLOAT"/>
+            </require>
+            <require comment="Supported only if GL_ARB_ES3_compatibility is supported">
+                <enum name="GL_VIEW_CLASS_EAC_R11"/>
+                <enum name="GL_VIEW_CLASS_EAC_RG11"/>
+                <enum name="GL_VIEW_CLASS_ETC2_RGB"/>
+                <enum name="GL_VIEW_CLASS_ETC2_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ETC2_EAC_RGBA"/>
+            </require>
+            <require comment="Supported only if GL_KHR_texture_compression_astc_ldr is supported">
+                <enum name="GL_VIEW_CLASS_ASTC_4x4_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_5x4_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_5x5_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_6x5_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_6x6_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_8x5_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_8x6_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_8x8_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_10x5_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_10x6_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_10x8_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_10x10_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_12x10_RGBA"/>
+                <enum name="GL_VIEW_CLASS_ASTC_12x12_RGBA"/>
                 <command name="glGetInternalformati64v"/>
             </require>
         </extension>
         <extension name="GL_ARB_invalidate_subdata" supported="gl|glcore">
             <require>
                 <command name="glInvalidateTexSubImage"/>
                 <command name="glInvalidateTexImage"/>
                 <command name="glInvalidateBufferSubData"/>
@@ -42400,16 +43031,25 @@ typedef unsigned int GLhandleARB;
                 <enum name="GL_422_EXT"/>
                 <enum name="GL_422_REV_EXT"/>
                 <enum name="GL_422_AVERAGE_EXT"/>
                 <enum name="GL_422_REV_AVERAGE_EXT"/>
             </require>
         </extension>
         <extension name="GL_EXT_EGL_image_array" supported="gles2">
         </extension>
+        <extension name="GL_EXT_EGL_image_storage" supported="gl|glcore|gles2">
+            <require>
+                <type name="GLeglImageOES"/>
+                <command name="glEGLImageTargetTexStorageEXT"/>
+            </require>
+            <require comment="Supported only if GL_EXT_direct_state_access, ARB_direct_state_access, or OpenGL 4.5 are supported">
+                <command name="glEGLImageTargetTextureStorageEXT"/>
+            </require>
+        </extension>
         <extension name="GL_EXT_YUV_target" supported="gles2">
             <require>
                 <enum name="GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT"/>
                 <enum name="GL_TEXTURE_EXTERNAL_OES"/>
                 <enum name="GL_TEXTURE_BINDING_EXTERNAL_OES"/>
                 <enum name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES"/>
             </require>
         </extension>
@@ -42700,17 +43340,17 @@ typedef unsigned int GLhandleARB;
                 <command name="glLabelObjectEXT"/>
                 <command name="glGetObjectLabelEXT"/>
             </require>
             <require comment="Depends on OpenGL ES 3.0">
                 <enum name="GL_SAMPLER"/>
                 <enum name="GL_TRANSFORM_FEEDBACK"/>
             </require>
         </extension>
-        <extension name="GL_EXT_debug_marker" supported="gl|glcore|gles2">
+        <extension name="GL_EXT_debug_marker" supported="gl|glcore|gles1|gles2">
             <require>
                 <command name="glInsertEventMarkerEXT"/>
                 <command name="glPushGroupMarkerEXT"/>
                 <command name="glPopGroupMarkerEXT"/>
             </require>
         </extension>
         <extension name="GL_EXT_depth_bounds_test" supported="gl">
             <require>
@@ -43875,16 +44515,18 @@ typedef unsigned int GLhandleARB;
                 <enum name="GL_UUID_SIZE_EXT"/>
                 <enum name="GL_LAYOUT_GENERAL_EXT"/>
                 <enum name="GL_LAYOUT_COLOR_ATTACHMENT_EXT"/>
                 <enum name="GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT"/>
                 <enum name="GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT"/>
                 <enum name="GL_LAYOUT_SHADER_READ_ONLY_EXT"/>
                 <enum name="GL_LAYOUT_TRANSFER_SRC_EXT"/>
                 <enum name="GL_LAYOUT_TRANSFER_DST_EXT"/>
+                <enum name="GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT"/>
+                <enum name="GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT"/>
                 <command name="glGetUnsignedBytevEXT"/>
                 <command name="glGetUnsignedBytei_vEXT"/>
                 <command name="glGenSemaphoresEXT"/>
                 <command name="glDeleteSemaphoresEXT"/>
                 <command name="glIsSemaphoreEXT"/>
                 <command name="glSemaphoreParameterui64vEXT"/>
                 <command name="glGetSemaphoreParameterui64vEXT"/>
                 <command name="glWaitSemaphoreEXT"/>
@@ -44016,21 +44658,27 @@ typedef unsigned int GLhandleARB;
         </extension>
         <extension name="GL_EXT_separate_specular_color" supported="gl">
             <require>
                 <enum name="GL_LIGHT_MODEL_COLOR_CONTROL_EXT"/>
                 <enum name="GL_SINGLE_COLOR_EXT"/>
                 <enum name="GL_SEPARATE_SPECULAR_COLOR_EXT"/>
             </require>
         </extension>
-        <extension name="GL_EXT_shader_framebuffer_fetch" supported="gles2">
+        <extension name="GL_EXT_shader_framebuffer_fetch" supported="gl|glcore|gles2">
             <require>
                 <enum name="GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT"/>
             </require>
         </extension>