Import Cobalt 21.master.0.272029
diff --git a/src/base/files/file_util_unittest.cc b/src/base/files/file_util_unittest.cc
index e9d9de1..5858ba4 100644
--- a/src/base/files/file_util_unittest.cc
+++ b/src/base/files/file_util_unittest.cc
@@ -71,6 +71,10 @@
 #include "starboard/types.h"
 #endif
 
+#if defined(STARBOARD)
+#include "starboard/file.h"
+#endif
+
 // This macro helps avoid wrapped lines in the test structs.
 #define FPL(x) FILE_PATH_LITERAL(x)
 
@@ -298,15 +302,38 @@
 // Simple function to dump some text into a new file.
 void CreateTextFile(const FilePath& filename,
                     const std::wstring& contents) {
+#if defined(STARBOARD)
+  const std::string contents_ascii = UTF16ToASCII(WideToUTF16(contents));
+  SbFileError file_error = kSbFileOk;
+  SbFile file =
+      SbFileOpen(filename.value().c_str(), kSbFileCreateAlways | kSbFileWrite,
+                 nullptr, &file_error);
+  SB_CHECK((file_error == kSbFileOk));
+  SB_CHECK(SbFileWriteAll(file, contents_ascii.data(), contents_ascii.size()) ==
+           contents_ascii.size());
+  SB_CHECK(SbFileClose(file));
+#else   // !defined(STARBOARD)
   std::wofstream file;
   file.open(filename.value().c_str());
   ASSERT_TRUE(file.is_open());
   file << contents;
   file.close();
+#endif  // defined(STARBOARD)
 }
 
 // Simple function to take out some text from a file.
 std::wstring ReadTextFile(const FilePath& filename) {
+#if defined(STARBOARD)
+  const int size_in_bytes = 64 * sizeof(wchar_t);
+  char contents[size_in_bytes]{0};
+  SbFileError file_error = kSbFileOk;
+  SbFile file = SbFileOpen(filename.value().c_str(),
+                           kSbFileOpenOnly | kSbFileRead, nullptr, &file_error);
+  SB_CHECK(file_error == kSbFileOk);
+  SB_CHECK(SbFileReadAll(file, contents, size_in_bytes) != -1);
+  SB_CHECK(SbFileClose(file));
+  return UTF16ToWide(ASCIIToUTF16(contents));
+#else   // !defined(STARBOARD)
   wchar_t contents[64];
   std::wifstream file;
   file.open(filename.value().c_str());
@@ -314,6 +341,7 @@
   file.getline(contents, arraysize(contents));
   file.close();
   return std::wstring(contents);
+#endif  // defined(STARBOARD)
 }
 
 #if !defined(STARBOARD)
diff --git a/src/base/memory/ref_counted.h b/src/base/memory/ref_counted.h
index c19072a..f52e803 100644
--- a/src/base/memory/ref_counted.h
+++ b/src/base/memory/ref_counted.h
@@ -26,6 +26,7 @@
  public:
   bool HasOneRef() const { return ref_count_ == 1; }
   bool HasAtLeastOneRef() const { return ref_count_ >= 1; }
+  int RefCounts() const { return ref_count_; }
 
  protected:
   explicit RefCountedBase(StartRefCountFromZeroTag) {
diff --git a/src/base/strings/safe_sprintf_unittest.cc b/src/base/strings/safe_sprintf_unittest.cc
index b9ebeae..29de95a 100644
--- a/src/base/strings/safe_sprintf_unittest.cc
+++ b/src/base/strings/safe_sprintf_unittest.cc
@@ -13,10 +13,14 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(STARBOARD)
+#include "starboard/client_porting/poem/stdio_poem.h"
 #include "starboard/common/string.h"
 #include "starboard/memory.h"
 #include "starboard/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
+#endif
 
 // Death tests on Android are currently very flaky. No need to add more flaky
 // tests, as they just make it hard to spot real problems.
diff --git a/src/build/common.gypi b/src/build/common.gypi
index 7afc5e9..bb8d913 100644
--- a/src/build/common.gypi
+++ b/src/build/common.gypi
@@ -141,6 +141,11 @@
     # whether warnings are treated as errors.
     'chromium_code%': 0,
 
+    # Crashpad relies on excluding files in GYP based on platform specific
+    # names, so it has its own set of filename_rules.gypi located under
+    # "third_party/mini_chromium/build/".
+    'crashpad_code%': 0,
+
     # TODO(thakis): Make this a blacklist instead, http://crbug.com/101600
     'enable_wexit_time_destructors%': 0,
 
@@ -232,6 +237,10 @@
       # processing.
       'chromium_code%': '<(chromium_code)',
 
+      # The crashpad_code variable operates the same way as described above for
+      # the chromium_code variable.
+      'crashpad_code%': '<(crashpad_code)',
+
       # See http://msdn.microsoft.com/en-us/library/aa652360(VS.71).aspx
       'win_release_Optimization%': '2', # 2 = /Os
       'win_debug_Optimization%': '0',   # 0 = /Od
@@ -321,6 +330,14 @@
            # Rules for excluding e.g. foo_win.cc from the build on non-Windows.
           'filename_rules.gypi',
         ],
+      }],
+      ['crashpad_code!=0', {
+        'includes': [
+           # Rules for excluding e.g. foo_win.cc from the build on non-Windows.
+          '<(DEPTH)/third_party/mini_chromium/build/filename_rules.gypi',
+        ],
+      }],
+      ['chromium_code!=0 or crashpad_code!=0', {
         # In Chromium code, we define __STDC_foo_MACROS in order to get the
         # C99 macros on Mac and Linux.
         'defines': [
diff --git a/src/cobalt/black_box_tests/black_box_tests.py b/src/cobalt/black_box_tests/black_box_tests.py
index 91fa034..8fdd65f 100644
--- a/src/cobalt/black_box_tests/black_box_tests.py
+++ b/src/cobalt/black_box_tests/black_box_tests.py
@@ -42,6 +42,7 @@
     'cancel_sync_loads_when_suspended',
     'preload_font',
     'preload_visibility',
+    'preload_launch_parameter',
     'signal_handler_doesnt_crash',
     'suspend_visibility',
     'timer_hit_after_preload',
diff --git a/src/cobalt/black_box_tests/testdata/preload_launch_parameter.html b/src/cobalt/black_box_tests/testdata/preload_launch_parameter.html
new file mode 100644
index 0000000..792003f
--- /dev/null
+++ b/src/cobalt/black_box_tests/testdata/preload_launch_parameter.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+
+<head>
+  <title>Cobalt preload state visibility test</title>
+  <script src='black_box_js_test_utils.js'></script>
+</head>
+
+<body>
+  <h1>
+    <span>ID element</span>
+  </h1>
+  <script>
+    // In preload mode, visibility should be "prerender" and window/document
+    // should not have focus.
+    assertEqual("prerender", document.visibilityState);
+    assertFalse(document.hasFocus());
+
+    // Wait for visibility change to verify visibilityState and having focus.
+    function handleVisibilityChange() {
+      assertEqual("visible", document.visibilityState);
+      assertTrue(document.hasFocus());
+      // Ensure that the document URL still has the launch=preload parameter after becoming visible.
+      assertTrue(document.URL.includes('?foo=bar&launch=preload') || document.URL.includes('?launch=preload'));
+      document.removeEventListener("visibilitychange", handleVisibilityChange);
+      onEndTest();
+    }
+    document.addEventListener("visibilitychange", handleVisibilityChange);
+
+    console.log('document.URL == ' + document.URL);
+    // Ensure that the document URL has the launch=preload parameter when preloading.
+    assertTrue(document.URL.includes('?foo=bar&launch=preload') || document.URL.includes('?launch=preload'));
+
+    setupFinished();
+  </script>
+</body>
\ No newline at end of file
diff --git a/src/cobalt/black_box_tests/testdata/preload_visibility.html b/src/cobalt/black_box_tests/testdata/preload_visibility.html
index 7793e3d..551f407 100644
--- a/src/cobalt/black_box_tests/testdata/preload_visibility.html
+++ b/src/cobalt/black_box_tests/testdata/preload_visibility.html
@@ -19,6 +19,7 @@
     function handleVisibilityChange() {
       assertEqual("visible", document.visibilityState);
       assertTrue(document.hasFocus());
+      document.removeEventListener("visibilitychange", handleVisibilityChange);
       onEndTest();
     }
     document.addEventListener("visibilitychange", handleVisibilityChange);
diff --git a/src/cobalt/black_box_tests/tests/preload_launch_parameter.py b/src/cobalt/black_box_tests/tests/preload_launch_parameter.py
new file mode 100644
index 0000000..8d9316b
--- /dev/null
+++ b/src/cobalt/black_box_tests/tests/preload_launch_parameter.py
@@ -0,0 +1,47 @@
+# Copyright 2020 The Cobalt Authors. All Rights Reserved.
+#
+# 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
+# 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.
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import _env  # pylint: disable=unused-import
+
+from cobalt.black_box_tests import black_box_tests
+from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
+
+
+class PreloadLaunchParameterTest(black_box_tests.BlackBoxTestCase):
+  """Set a JS timer that expires after exiting preload mode."""
+
+  def test_simple(self):
+
+    with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server:
+      url = server.GetURL(file_name='testdata/preload_launch_parameter.html')
+
+      # Test without other parameters.
+      with self.CreateCobaltRunner(
+          url=url, target_params=['--preload']) as runner:
+        runner.WaitForJSTestsSetup()
+        self.assertTrue(runner.IsInPreload())
+        runner.SendResume()
+        self.assertTrue(runner.JSTestsSucceeded())
+
+      # Test with another parameter.
+      with self.CreateCobaltRunner(
+          url=url + "?foo=bar", target_params=['--preload']) as runner:
+        runner.WaitForJSTestsSetup()
+        self.assertTrue(runner.IsInPreload())
+        runner.SendResume()
+        self.assertTrue(runner.JSTestsSucceeded())
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 408f6ec..e478a82 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -196,7 +196,7 @@
 }
 #endif  // ENABLE_WEBDRIVER
 
-GURL GetInitialURL() {
+GURL GetInitialURL(bool should_preload) {
   GURL initial_url = GURL(kDefaultURL);
   // Allow the user to override the default URL via a command line parameter.
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
@@ -220,6 +220,17 @@
     }
   }
 
+  if (should_preload) {
+    std::string query = initial_url.query();
+    if (!query.empty()) {
+      query += "&";
+    }
+    query += "launch=preload";
+    GURL::Replacements replacements;
+    replacements.SetQueryStr(query);
+    initial_url = initial_url.ReplaceComponents(replacements);
+  }
+
 #if SB_API_VERSION >= 11
   if (!command_line->HasSwitch(
           switches::kOmitDeviceAuthenticationQueryParameters)) {
@@ -525,7 +536,7 @@
       base::Bind(&Application::UpdatePeriodicStats, base::Unretained(this)));
 
   // Get the initial URL.
-  GURL initial_url = GetInitialURL();
+  GURL initial_url = GetInitialURL(should_preload);
   DLOG(INFO) << "Initial URL: " << initial_url;
 
   // Get the fallback splash screen URL.
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index ed5660c..b1d084f 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-270962
\ No newline at end of file
+272029
\ No newline at end of file
diff --git a/src/cobalt/css_parser/grammar.y b/src/cobalt/css_parser/grammar.y
index 798c4b6..920cce8 100644
--- a/src/cobalt/css_parser/grammar.y
+++ b/src/cobalt/css_parser/grammar.y
@@ -27,15 +27,15 @@
 %{
 // Specify how the location of an action should be calculated in terms
 // of its children.
-#define YYLLOC_DEFAULT(Current, Rhs, N)          \
-  if (N) {                                       \
-    Current.first_line   = Rhs[1].first_line;    \
-    Current.first_column = Rhs[1].first_column;  \
-    Current.line_start   = Rhs[1].line_start;    \
-  } else {                                       \
-    Current.first_line   = Rhs[0].first_line;    \
-    Current.first_column = Rhs[0].first_column;  \
-    Current.line_start   = Rhs[0].line_start;    \
+#define YYLLOC_DEFAULT(Current, Rhs, N)            \
+  if (N) {                                         \
+    (Current).first_line   = Rhs[1].first_line;    \
+    (Current).first_column = Rhs[1].first_column;  \
+    (Current).line_start   = Rhs[1].line_start;    \
+  } else {                                         \
+    (Current).first_line   = Rhs[0].first_line;    \
+    (Current).first_column = Rhs[0].first_column;  \
+    (Current).line_start   = Rhs[0].line_start;    \
   }
 %}
 
diff --git a/src/cobalt/dom/lottie_player.cc b/src/cobalt/dom/lottie_player.cc
index 3ee7c9d..efd6ebb 100644
--- a/src/cobalt/dom/lottie_player.cc
+++ b/src/cobalt/dom/lottie_player.cc
@@ -104,6 +104,13 @@
   SetAttribute("speed", base::NumberToString(speed));
 }
 
+std::string LottiePlayer::preserve_aspect_ratio() const {
+  // Skottie animations default to "xMidYMid meet", meaning that the animation
+  // will be uniformly scaled and centered relative to the element's width and
+  // height.
+  return "xMidYMid meet";
+}
+
 std::string LottiePlayer::renderer() const {
   // Cobalt uses a custom compiled-in renderer.
   return "skottie-m79";
diff --git a/src/cobalt/dom/lottie_player.h b/src/cobalt/dom/lottie_player.h
index 5151138..bd3358b 100644
--- a/src/cobalt/dom/lottie_player.h
+++ b/src/cobalt/dom/lottie_player.h
@@ -65,6 +65,7 @@
   void set_mode(std::string mode);
   double speed() const;
   void set_speed(double speed);
+  std::string preserve_aspect_ratio() const;
   std::string renderer() const;
   void Load(std::string src);
   void Play();
diff --git a/src/cobalt/dom/lottie_player.idl b/src/cobalt/dom/lottie_player.idl
index ea4b975..1a80f0e 100644
--- a/src/cobalt/dom/lottie_player.idl
+++ b/src/cobalt/dom/lottie_player.idl
@@ -25,6 +25,9 @@
   attribute DOMString mode;
   attribute boolean loop;
   attribute double speed;
+  // Custom behavior: preserveAspectRatio and renderer should also be writeable
+  // according to the spec.
+  readonly attribute DOMString preserveAspectRatio;
   readonly attribute DOMString renderer;
   void load(DOMString src);
   void play();
diff --git a/src/cobalt/layout_tests/web_platform_test_parser.cc b/src/cobalt/layout_tests/web_platform_test_parser.cc
index 0e1b721..864148b 100644
--- a/src/cobalt/layout_tests/web_platform_test_parser.cc
+++ b/src/cobalt/layout_tests/web_platform_test_parser.cc
@@ -126,6 +126,7 @@
                     << "\"" << top_level << "\"";
       return std::vector<WebPlatformTestInfo>();
     }
+    DLOG(INFO) << "[Temporary debugging] javascript engine for parser exiting";
   }
 
   base::FilePath test_dir(GetTestInputRootDirectory()
diff --git a/src/cobalt/layout_tests/web_platform_tests.cc b/src/cobalt/layout_tests/web_platform_tests.cc
index 90b82a6..d2aea53 100644
--- a/src/cobalt/layout_tests/web_platform_tests.cc
+++ b/src/cobalt/layout_tests/web_platform_tests.cc
@@ -145,15 +145,20 @@
       FROM_HERE, run_loop->QuitClosure());
 }
 
-// Called when layout completes and results have been produced.  We use this
-// signal to stop the WebModule's message loop since our work is done after a
-// layout has been performed.
+// Called upon window.close(), which indicates that the test has finished.
+// We use this signal to stop the WebModule's message loop since our work is
+// done once the window is closed. A timeout will also trigger window.close().
+void WindowCloseCallback(base::RunLoop* run_loop,
+                         base::MessageLoop* message_loop,
+                         base::TimeDelta delta) {
+  message_loop->task_runner()->PostTask(FROM_HERE, base::Bind(Quit, run_loop));
+}
+
+// Called when layout completes.
 void WebModuleOnRenderTreeProducedCallback(
     base::Optional<browser::WebModule::LayoutResults>* out_results,
-    base::RunLoop* run_loop, base::MessageLoop* message_loop,
     const browser::WebModule::LayoutResults& results) {
   out_results->emplace(results.render_tree, results.layout_time);
-  message_loop->task_runner()->PostTask(FROM_HERE, base::Bind(Quit, run_loop));
 }
 
 // This callback, when called, quits a message loop, outputs the error message
@@ -212,11 +217,10 @@
   // Create the WebModule and wait for a layout to occur.
   browser::WebModule web_module(
       url, base::kApplicationStateStarted,
-      base::Bind(&WebModuleOnRenderTreeProducedCallback, &results, &run_loop,
-                 base::MessageLoop::current()),
+      base::Bind(&WebModuleOnRenderTreeProducedCallback, &results),
       base::Bind(&WebModuleErrorCallback, &run_loop,
                  base::MessageLoop::current()),
-      browser::WebModule::CloseCallback() /* window_close_callback */,
+      base::Bind(&WindowCloseCallback, &run_loop, base::MessageLoop::current()),
       base::Closure() /* window_minimize_callback */,
       can_play_type_handler.get(), media_module.get(), &network_module,
       kDefaultViewportSize, &resource_provider, 60.0f, web_module_options);
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_image.cc b/src/cobalt/renderer/rasterizer/skia/hardware_image.cc
index c86c6d8..6e1fb8e 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_image.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_image.cc
@@ -301,14 +301,14 @@
 HardwareFrontendImage::HardwareFrontendImage(
     std::unique_ptr<HardwareImageData> image_data,
     backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-    base::MessageLoop* rasterizer_message_loop)
+    scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner)
     : is_opaque_(image_data->GetDescriptor().alpha_format ==
                  render_tree::kAlphaFormatOpaque),
       alternate_rgba_format_(AlternateRgbaFormatFromImageDataDescriptor(
           image_data->GetDescriptor())),
       size_(AdjustSizeForFormat(image_data->GetDescriptor().size,
                                 alternate_rgba_format_)),
-      rasterizer_message_loop_(rasterizer_message_loop) {
+      rasterizer_task_runner_(rasterizer_task_runner) {
   backend_image_.reset(new HardwareBackendImage(
       base::Bind(&HardwareBackendImage::InitializeFromImageData,
                  base::Passed(&image_data), cobalt_context, gr_context)));
@@ -319,12 +319,12 @@
     const scoped_refptr<backend::ConstRawTextureMemoryEGL>& raw_texture_memory,
     intptr_t offset, const render_tree::ImageDataDescriptor& descriptor,
     backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-    base::MessageLoop* rasterizer_message_loop)
+    scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner)
     : is_opaque_(descriptor.alpha_format == render_tree::kAlphaFormatOpaque),
       alternate_rgba_format_(
           AlternateRgbaFormatFromImageDataDescriptor(descriptor)),
       size_(AdjustSizeForFormat(descriptor.size, alternate_rgba_format_)),
-      rasterizer_message_loop_(rasterizer_message_loop) {
+      rasterizer_task_runner_(rasterizer_task_runner) {
   TRACE_EVENT0("cobalt::renderer",
                "HardwareFrontendImage::HardwareFrontendImage()");
   backend_image_.reset(new HardwareBackendImage(base::Bind(
@@ -338,7 +338,7 @@
     render_tree::AlphaFormat alpha_format,
     backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
     std::unique_ptr<math::RectF> content_region,
-    base::MessageLoop* rasterizer_message_loop,
+    scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner,
     base::Optional<AlternateRgbaFormat> alternate_rgba_format)
     : is_opaque_(alpha_format == render_tree::kAlphaFormatOpaque),
       content_region_(std::move(content_region)),
@@ -348,7 +348,7 @@
                                        std::abs(content_region_->height()))
                           : texture->GetSize(),
           alternate_rgba_format_)),
-      rasterizer_message_loop_(rasterizer_message_loop) {
+      rasterizer_task_runner_(rasterizer_task_runner) {
   TRACE_EVENT0("cobalt::renderer",
                "HardwareFrontendImage::HardwareFrontendImage()");
   backend_image_.reset(new HardwareBackendImage(
@@ -361,13 +361,13 @@
     const scoped_refptr<render_tree::Node>& root,
     const SubmitOffscreenCallback& submit_offscreen_callback,
     backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-    base::MessageLoop* rasterizer_message_loop)
+    scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner)
     : is_opaque_(false),
       size_(AdjustSizeForFormat(
           math::Size(static_cast<int>(root->GetBounds().right()),
                      static_cast<int>(root->GetBounds().bottom())),
           alternate_rgba_format_)),
-      rasterizer_message_loop_(rasterizer_message_loop) {
+      rasterizer_task_runner_(rasterizer_task_runner) {
   TRACE_EVENT0("cobalt::renderer",
                "HardwareFrontendImage::HardwareFrontendImage()");
   backend_image_.reset(new HardwareBackendImage(
@@ -382,10 +382,10 @@
   // InitializeBackend() posted a task to call backend_image_'s
   // InitializeTask(). Make sure that task has finished before
   // destroying backend_image_.
-  if (rasterizer_message_loop_) {
-    if (rasterizer_message_loop_ != base::MessageLoop::current() ||
+  if (rasterizer_task_runner_) {
+    if (!rasterizer_task_runner_->BelongsToCurrentThread() ||
         !backend_image_->TryDestroy()) {
-      rasterizer_message_loop_->task_runner()->DeleteSoon(
+      rasterizer_task_runner_->DeleteSoon(
           FROM_HERE, backend_image_.release());
     }
   }  // else let the scoped pointer clean it up immediately.
@@ -396,15 +396,16 @@
   // rasterizer to initialize it when needed. The image initialization process
   // may take some time, so doing a lazy initialize can cause a big spike in
   // frame time if multiple images are initialized in one frame.
-  if (rasterizer_message_loop_) {
-    rasterizer_message_loop_->task_runner()->PostTask(
+  if (rasterizer_task_runner_) {
+    rasterizer_task_runner_->PostTask(
         FROM_HERE, base::Bind(&HardwareBackendImage::InitializeTask,
                               base::Unretained(backend_image_.get())));
   }
 }
 
 const sk_sp<SkImage>& HardwareFrontendImage::GetImage() const {
-  DCHECK_EQ(rasterizer_message_loop_, base::MessageLoop::current());
+  DCHECK(!rasterizer_task_runner_ ||
+         rasterizer_task_runner_->BelongsToCurrentThread());
   // Forward this call to the backend image.  This method must be called from
   // the rasterizer thread (e.g. during a render tree visitation).  The backend
   // image will check that this is being called from the correct thread.
@@ -412,12 +413,14 @@
 }
 
 const backend::TextureEGL* HardwareFrontendImage::GetTextureEGL() const {
-  DCHECK_EQ(rasterizer_message_loop_, base::MessageLoop::current());
+  DCHECK(!rasterizer_task_runner_ ||
+         rasterizer_task_runner_->BelongsToCurrentThread());
   return backend_image_->GetTextureEGL();
 }
 
 bool HardwareFrontendImage::CanRenderInSkia() const {
-  DCHECK_EQ(rasterizer_message_loop_, base::MessageLoop::current());
+  DCHECK(!rasterizer_task_runner_ ||
+         rasterizer_task_runner_->BelongsToCurrentThread());
   // In some cases, especially when dealing with SbDecodeTargets, we may end
   // up with a GLES2 texture whose target is not GL_TEXTURE_2D, in which case
   // we cannot use our typical Skia flow to render it, and we delegate to
@@ -431,7 +434,8 @@
 }
 
 bool HardwareFrontendImage::EnsureInitialized() {
-  DCHECK_EQ(rasterizer_message_loop_, base::MessageLoop::current());
+  DCHECK(!rasterizer_task_runner_ ||
+         rasterizer_task_runner_->BelongsToCurrentThread());
   return backend_image_->EnsureInitialized();
 }
 
@@ -439,7 +443,7 @@
     std::unique_ptr<HardwareRawImageMemory> raw_image_memory,
     const render_tree::MultiPlaneImageDataDescriptor& descriptor,
     backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-    base::MessageLoop* rasterizer_message_loop)
+    scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner)
     : size_(descriptor.GetPlaneDescriptor(0).size),
       estimated_size_in_bytes_(raw_image_memory->GetSizeInBytes()),
       format_(descriptor.image_format()) {
@@ -452,7 +456,7 @@
     planes_[i] = new HardwareFrontendImage(
         const_raw_texture_memory, descriptor.GetPlaneOffset(i),
         descriptor.GetPlaneDescriptor(i), cobalt_context, gr_context,
-        rasterizer_message_loop);
+        rasterizer_task_runner);
   }
 }
 
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_image.h b/src/cobalt/renderer/rasterizer/skia/hardware_image.h
index 0e6b000..29e25e9 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_image.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_image.h
@@ -93,28 +93,29 @@
 class HardwareFrontendImage : public SinglePlaneImage {
  public:
   HardwareFrontendImage(std::unique_ptr<HardwareImageData> image_data,
-                        backend::GraphicsContextEGL* cobalt_context,
-                        GrContext* gr_context,
-                        base::MessageLoop* rasterizer_message_loop);
-  HardwareFrontendImage(const scoped_refptr<backend::ConstRawTextureMemoryEGL>&
-                            raw_texture_memory,
-                        intptr_t offset,
-                        const render_tree::ImageDataDescriptor& descriptor,
-                        backend::GraphicsContextEGL* cobalt_context,
-                        GrContext* gr_context,
-                        base::MessageLoop* rasterizer_message_loop);
+      backend::GraphicsContextEGL* cobalt_context,
+      GrContext* gr_context,
+      scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
+  HardwareFrontendImage(
+      const scoped_refptr<backend::ConstRawTextureMemoryEGL>&
+          raw_texture_memory,
+      intptr_t offset,
+      const render_tree::ImageDataDescriptor& descriptor,
+      backend::GraphicsContextEGL* cobalt_context,
+      GrContext* gr_context,
+      scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
   HardwareFrontendImage(
       std::unique_ptr<backend::TextureEGL> texture,
       render_tree::AlphaFormat alpha_format,
       backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
       std::unique_ptr<math::RectF> content_region,
-      base::MessageLoop* rasterizer_message_loop,
+      scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner,
       base::Optional<AlternateRgbaFormat> alternate_rgba_format);
   HardwareFrontendImage(
       const scoped_refptr<render_tree::Node>& root,
       const SubmitOffscreenCallback& submit_offscreen_callback,
       backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-      base::MessageLoop* rasterizer_message_loop);
+      scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
 
   const math::Size& GetSize() const override { return size_; }
 
@@ -171,7 +172,7 @@
   // can issue graphics commands.  Specifically, this is the message loop
   // where all HardwareBackendImage (described below) logic is executed
   // on.
-  base::MessageLoop* rasterizer_message_loop_;
+  scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner_;
 
   // The HardwareBackendImage object is where all our rasterizer thread
   // specific objects live, such as the backend Skia graphics reference to
@@ -198,7 +199,7 @@
       std::unique_ptr<HardwareRawImageMemory> raw_image_memory,
       const render_tree::MultiPlaneImageDataDescriptor& descriptor,
       backend::GraphicsContextEGL* cobalt_context, GrContext* gr_context,
-      base::MessageLoop* rasterizer_message_loop);
+      scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner);
 
   HardwareMultiPlaneImage(
       render_tree::MultiPlaneImageFormat format,
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_mesh.cc b/src/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
index f5fd77c..19ad127 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_mesh.cc
@@ -41,7 +41,9 @@
 
 const VertexBufferObject* HardwareMesh::GetVBO() const {
   if (!vbo_) {
-    rasterizer_message_loop_ = base::MessageLoop::current();
+    if (base::MessageLoop::current()) {
+      rasterizer_task_runner_ = base::MessageLoop::current()->task_runner();
+    }
     vbo_.reset(new VertexBufferObject(std::move(vertices_), draw_mode_));
   }
 
@@ -60,12 +62,15 @@
 }  // namespace
 
 HardwareMesh::~HardwareMesh() {
-  if (rasterizer_message_loop_ == base::MessageLoop::current()) {
-    DestroyVBO(cobalt_context_, std::move(vbo_));
+  if (!vbo_) {
     return;
   }
 
-  DCHECK(rasterizer_message_loop_);
+  if (!rasterizer_task_runner_ ||
+      rasterizer_task_runner_->BelongsToCurrentThread()) {
+    DestroyVBO(cobalt_context_, std::move(vbo_));
+    return;
+  }
 
   // Make sure that VBO cleanup always happens on the thread that created
   // the VBO in the first place.  We are passing cobalt_context_ by pointer
@@ -73,7 +78,7 @@
   // executed because this Mesh object must be destroyed before the
   // rasterizer, and the rasterizer must be destroyed before the GL
   // context.
-  rasterizer_message_loop_->task_runner()->PostTask(
+  rasterizer_task_runner_->PostTask(
       FROM_HERE, base::Bind(&DestroyVBO, cobalt_context_, base::Passed(&vbo_)));
 }
 
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_mesh.h b/src/cobalt/renderer/rasterizer/skia/hardware_mesh.h
index 851b705..5aa0765 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_mesh.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_mesh.h
@@ -96,7 +96,7 @@
   // object, so that we can ensure that regardless of which thread destroys
   // this HardwareMesh instance, we will always ensure that the owned VBO is
   // destroyed on the thread it was created from.
-  mutable base::MessageLoop* rasterizer_message_loop_ = nullptr;
+  mutable scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner_;
 };
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
index fa0748f..8b43221 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -60,8 +60,11 @@
       submit_offscreen_callback_(submit_offscreen_callback),
       purge_skia_font_caches_on_destruction_(
           purge_skia_font_caches_on_destruction),
-      max_texture_size_(gr_context->maxTextureSize()),
-      self_message_loop_(base::MessageLoop::current()) {
+      max_texture_size_(gr_context->maxTextureSize()) {
+  if (base::MessageLoop::current()) {
+    rasterizer_task_runner_ = base::MessageLoop::current()->task_runner();
+  }
+
   // Initialize the font manager now to ensure that it doesn't get initialized
   // on multiple threads simultaneously later.
   SkFontMgr::RefDefault();
@@ -88,8 +91,9 @@
 void HardwareResourceProvider::Finish() {
   // Wait for any resource-related to complete (by waiting for all tasks to
   // complete).
-  if (base::MessageLoop::current() != self_message_loop_) {
-    self_message_loop_->task_runner()->WaitForFence();
+  if (rasterizer_task_runner_ &&
+      !rasterizer_task_runner_->BelongsToCurrentThread()) {
+    rasterizer_task_runner_->WaitForFence();
   }
 }
 
@@ -158,7 +162,7 @@
   // any subsequently submitted render trees referencing the frontend image.
   return base::WrapRefCounted(new HardwareFrontendImage(
       std::move(skia_hardware_source_data), cobalt_context_, gr_context_,
-      self_message_loop_));
+      rasterizer_task_runner_));
 }
 
 namespace {
@@ -321,7 +325,8 @@
 
     planes.push_back(base::WrapRefCounted(new HardwareFrontendImage(
         std::move(texture), alpha_format, cobalt_context_, gr_context_,
-        std::move(content_region), self_message_loop_, alternate_rgba_format)));
+        std::move(content_region), rasterizer_task_runner_,
+        alternate_rgba_format)));
   }
 
   if (planes_per_format == 1) {
@@ -355,13 +360,14 @@
       reinterpret_cast<HardwareResourceProvider*>(
           graphics_context_provider->gles_context_runner_context);
 
-  if (base::MessageLoop::current() != provider->self_message_loop_) {
+  if (provider->rasterizer_task_runner_ &&
+      !provider->rasterizer_task_runner_->BelongsToCurrentThread()) {
     // Post a task to the rasterizer thread to have it run the requested
     // function, and wait for it to complete before returning.
     base::WaitableEvent done_event(
         base::WaitableEvent::ResetPolicy::MANUAL,
         base::WaitableEvent::InitialState::NOT_SIGNALED);
-    provider->self_message_loop_->task_runner()->PostTask(
+    provider->rasterizer_task_runner_->PostTask(
         FROM_HERE, base::Bind(&RunGraphicsContextRunnerOnRasterizerThread,
                               target_function, target_function_context,
                               provider->cobalt_context_, &done_event));
@@ -409,7 +415,7 @@
 
   return base::WrapRefCounted(new HardwareMultiPlaneImage(
       std::move(skia_hardware_raw_image_memory), descriptor, cobalt_context_,
-      gr_context_, self_message_loop_));
+      gr_context_, rasterizer_task_runner_));
 }
 
 bool HardwareResourceProvider::HasLocalFontFamily(
@@ -557,7 +563,7 @@
     const scoped_refptr<render_tree::Node>& root) {
   return base::WrapRefCounted(new HardwareFrontendImage(
       root, submit_offscreen_callback_, cobalt_context_, gr_context_,
-      self_message_loop_));
+      rasterizer_task_runner_));
 }
 
 }  // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
index 63d4e5e..e6b7252 100644
--- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
+++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -146,7 +146,7 @@
   // commands, such as during the creation of an image.  If the message loop
   // is NULL, we will try to issue the graphics commands from the current
   // thread.
-  base::MessageLoop* self_message_loop_;
+  scoped_refptr<base::SingleThreadTaskRunner> rasterizer_task_runner_;
 };
 
 }  // namespace skia
diff --git a/src/cobalt/script/v8c/v8c_global_environment.cc b/src/cobalt/script/v8c/v8c_global_environment.cc
index 4d43ade..010b61d 100644
--- a/src/cobalt/script/v8c/v8c_global_environment.cc
+++ b/src/cobalt/script/v8c/v8c_global_environment.cc
@@ -105,6 +105,8 @@
                "V8cGlobalEnvironment::~V8cGlobalEnvironment()");
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   InvalidateWeakPtrs();
+  destruction_helper_.global_wrappable_ = global_wrappable_.get();
+  destruction_helper_.wrapper_factory_ = wrapper_factory_.get();
 }
 
 void V8cGlobalEnvironment::CreateGlobalObject() {
@@ -320,6 +322,13 @@
   // Another GC to make sure global object is collected.
   isolate_->LowMemoryNotification();
   isolate_->SetEmbedderHeapTracer(nullptr);
+  if (global_wrappable_ && global_wrappable_->RefCounts() != 1) {
+    // At this point only environment should hold the last reference.
+    DLOG(INFO) << "[Temporary debugging] more than one ref alive, ref_count: "
+               << global_wrappable_->RefCounts();
+    DLOG(INFO) << "[Temporary debugging] window's v8 wrapper alive?"
+               << wrapper_factory_->HasWrapper(global_wrappable_);
+  }
 }
 
 // static
diff --git a/src/cobalt/script/v8c/v8c_global_environment.h b/src/cobalt/script/v8c/v8c_global_environment.h
index c131a8d..be1f6aa 100644
--- a/src/cobalt/script/v8c/v8c_global_environment.h
+++ b/src/cobalt/script/v8c/v8c_global_environment.h
@@ -132,6 +132,9 @@
     explicit DestructionHelper(v8::Isolate* isolate) : isolate_(isolate) {}
     ~DestructionHelper();
 
+    script::Wrappable* global_wrappable_;
+    WrapperFactory* wrapper_factory_;
+
    private:
     v8::Isolate* isolate_;
   };
@@ -162,10 +165,10 @@
   // destruct.  Were we to not do this, finalizers can run in the order (e.g.)
   // document window, which the Cobalt DOM does not support.
   scoped_refptr<Wrappable> global_wrappable_;
+  std::unique_ptr<WrapperFactory> wrapper_factory_;
   DestructionHelper destruction_helper_;
   v8::Global<v8::Context> context_;
 
-  std::unique_ptr<WrapperFactory> wrapper_factory_;
   std::unique_ptr<V8cScriptValueFactory> script_value_factory_;
 
   // Data that is cached on a per-interface basis. Note that we can get to
diff --git a/src/cobalt/script/v8c/wrapper_factory.cc b/src/cobalt/script/v8c/wrapper_factory.cc
index e123d1d..27c3463 100644
--- a/src/cobalt/script/v8c/wrapper_factory.cc
+++ b/src/cobalt/script/v8c/wrapper_factory.cc
@@ -38,6 +38,17 @@
       << "RegisterWrappableType registered for type more than once.";
 }
 
+bool WrapperFactory::HasWrapper(Wrappable* wrappable) {
+  v8::Local<v8::Object> wrapper;
+  v8::MaybeLocal<v8::Object> maybe_wrapper =
+      V8cWrapperHandle::MaybeGetObject(isolate_, GetCachedWrapper(wrappable));
+  if (!maybe_wrapper.ToLocal(&wrapper)) {
+    return false;
+  } else {
+    return true;
+  }
+}
+
 v8::Local<v8::Object> WrapperFactory::GetWrapper(
     const scoped_refptr<Wrappable>& wrappable) {
   v8::Local<v8::Object> wrapper;
diff --git a/src/cobalt/script/v8c/wrapper_factory.h b/src/cobalt/script/v8c/wrapper_factory.h
index a78a9de..986e740 100644
--- a/src/cobalt/script/v8c/wrapper_factory.h
+++ b/src/cobalt/script/v8c/wrapper_factory.h
@@ -50,6 +50,8 @@
 
   v8::Local<v8::Object> GetWrapper(const scoped_refptr<Wrappable>& wrappable);
 
+  // Added temporarily for debugging purpose, will be removed soon.
+  bool HasWrapper(Wrappable* wrappable);
   // Attempt to get the |WrapperPrivate| associated with |wrappable|.  Returns
   // |nullptr| if no |WrapperPrivate| was found.
   WrapperPrivate* MaybeGetWrapperPrivate(Wrappable* wrappable);
diff --git a/src/cobalt/site/docs/reference/starboard/configuration-public.md b/src/cobalt/site/docs/reference/starboard/configuration-public.md
index 91ec75d..c3cbb64 100644
--- a/src/cobalt/site/docs/reference/starboard/configuration-public.md
+++ b/src/cobalt/site/docs/reference/starboard/configuration-public.md
@@ -69,7 +69,7 @@
 
 | Properties |
 | :--- |
-| **`SB_HAS_QUIRK_SEEK_TO_KEYFRAME`**<br><br>After a seek is triggerred, the default behavior is to append video frames from the last key frame before the seek time and append audio frames from the seek time because usually all audio frames are key frames.  On platforms that cannot decode video frames without displaying them, this will cause the video being played without audio for several seconds after seeking.  When the following macro is defined, the app will append audio frames start from the timestamp that is before the timestamp of the video key frame being appended.<br><br>By default, this property is undefined. |
+| **`SB_HAS_QUIRK_SEEK_TO_KEYFRAME`**<br><br>After a seek is triggered, the default behavior is to append video frames from the last keyframe before the seek time and append audio frames from the seek time because usually all audio frames are keyframes.  On platforms that cannot decode video frames without displaying them, this will cause the video being played without audio for several seconds after seeking.  When the following macro is defined, the app will append audio frames start from the timestamp that is before the timestamp of the video keyframe being appended.<br><br>By default, this property is undefined.<br><br>This quirk is **deprecated in Starboard version 12 or later**.  On platforms in Starboard version 12 or later that require this feature, the implementation should skip all video frames before the second video keyframe, and skip all audio access units whose timestamps are before the timestamp of the second video frame.<br><br>It is worth noting that after a seek the H5 player only needs to append audio access units right before the seek time, instead of before the first video keyframe.  The H5 player used to have a special workaround to append audio access units before the first video keyframe after a seek to make this quirk possible, and the special workaround is no longer supported.  To skip all audio and video access units before the second video frame as mentioned above allows the Starboard implementation to no longer depend on any special workaround of the H5 player.||
 | **`SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES`**<br><br>The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only when this macro is defined.<br><br>By default, this property is undefined. |
 | **`SB_HAS_QUIRK_NO_FFS`**<br><br>dlmalloc will use the ffs intrinsic if available.  Platforms on which this is not available should define the following quirk.<br><br>By default, this property is undefined. |
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
index 6cb7819..848031a 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/10/configuration.md
@@ -78,14 +78,6 @@
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
-
-Deprecated feature macros These feature macros are deprecated in Starboard
-version 6 and later, and are no longer referenced by application code. They will
-be removed in a future version. Any Starboard implementation that supports
-Starboard version 6 or later should be modified to no longer depend on these
-macros, with the assumption that their values are always 1.
-
 ### SB_HAS_GLES2 ###
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
@@ -93,10 +85,6 @@
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_GRAPHICS ###
-
-Specifies whether this platform has any kind of supported graphics system.
-
 ### SB_HAS_QUIRK(SB_FEATURE) ###
 
 Determines at compile-time whether this platform has a quirk.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
index 78739ad..787109b 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/configuration.md
@@ -78,14 +78,6 @@
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
-
-Deprecated feature macros These feature macros are deprecated in Starboard
-version 6 and later, and are no longer referenced by application code. They will
-be removed in a future version. Any Starboard implementation that supports
-Starboard version 6 or later should be modified to no longer depend on these
-macros, with the assumption that their values are always 1.
-
 ### SB_HAS_GLES2 ###
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
@@ -93,10 +85,6 @@
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_GRAPHICS ###
-
-Specifies whether this platform has any kind of supported graphics system.
-
 ### SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT ###
 
 Legal values for SB_PREFERRED_RGBA_BYTE_ORDER are defined in this file above as
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/egl.md b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
index 1938b5b..6990f44 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/egl.md
@@ -72,48 +72,163 @@
 
 #### Members ####
 
-*   `SbEglBoolean(* eglChooseConfig`
-*   `SbEglBoolean(* eglCopyBuffers`
-*   `SbEglContext(* eglCreateContext`
-*   `SbEglSurface(* eglCreatePbufferSurface`
-*   `SbEglSurface(* eglCreatePixmapSurface`
-*   `SbEglSurface(* eglCreateWindowSurface`
-*   `SbEglBoolean(* eglDestroyContext`
-*   `SbEglBoolean(* eglDestroySurface`
-*   `SbEglBoolean(* eglGetConfigAttrib`
-*   `SbEglBoolean(* eglGetConfigs`
-*   `SbEglDisplay(* eglGetCurrentDisplay`
-*   `SbEglSurface(* eglGetCurrentSurface`
-*   `SbEglDisplay(* eglGetDisplay`
-*   `SbEglInt32(* eglGetError`
-*   `SbEglCastsToProperFunctionPointerType(* eglGetProcAddress`
-*   `SbEglBoolean(* eglInitialize`
-*   `SbEglBoolean(* eglMakeCurrent`
-*   `SbEglBoolean(* eglQueryContext`
-*   `const char *(* eglQueryString`
-*   `SbEglBoolean(* eglQuerySurface`
-*   `SbEglBoolean(* eglSwapBuffers`
-*   `SbEglBoolean(* eglTerminate`
-*   `SbEglBoolean(* eglWaitGL`
-*   `SbEglBoolean(* eglWaitNative`
-*   `SbEglBoolean(* eglBindTexImage`
-*   `SbEglBoolean(* eglReleaseTexImage`
-*   `SbEglBoolean(* eglSurfaceAttrib`
-*   `SbEglBoolean(* eglSwapInterval`
-*   `SbEglBoolean(* eglBindAPI`
-*   `SbEglEnum(* eglQueryAPI`
-*   `SbEglSurface(* eglCreatePbufferFromClientBuffer`
-*   `SbEglBoolean(* eglReleaseThread`
-*   `SbEglBoolean(* eglWaitClient`
-*   `SbEglContext(* eglGetCurrentContext`
-*   `SbEglSync(* eglCreateSync`
-*   `SbEglBoolean(* eglDestroySync`
-*   `SbEglInt32(* eglClientWaitSync`
-*   `SbEglBoolean(* eglGetSyncAttrib`
-*   `SbEglImage(* eglCreateImage`
-*   `SbEglBoolean(* eglDestroyImage`
-*   `SbEglDisplay(* eglGetPlatformDisplay`
-*   `SbEglSurface(* eglCreatePlatformWindowSurface`
-*   `SbEglSurface(* eglCreatePlatformPixmapSurface`
-*   `SbEglBoolean(* eglWaitSync`
+*   ` eglChooseConfig`
+
+    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
+    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
+    num_config);
+*   ` eglCopyBuffers`
+
+    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target);
+*   ` eglCreateContext`
+
+    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32\* attrib_list);
+*   ` eglCreatePbufferSurface`
+
+    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32\* attrib_list);
+*   ` eglCreatePixmapSurface`
+
+    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
+*   ` eglCreateWindowSurface`
+
+    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
+*   ` eglDestroyContext`
+
+    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
+*   ` eglDestroySurface`
+
+    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglGetConfigAttrib`
+
+    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglGetConfigs`
+
+    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
+    SbEglInt32 config_size, SbEglInt32\* num_config);
+*   ` eglGetCurrentDisplay`
+
+    SbEglDisplay (\*eglGetCurrentDisplay)(void);
+*   ` eglGetCurrentSurface`
+
+    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
+*   ` eglGetDisplay`
+
+    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
+*   ` eglGetError`
+
+    SbEglInt32 (\*eglGetError)(void);
+*   ` eglGetProcAddress`
+
+    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
+    procname);
+*   ` eglInitialize`
+
+    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
+    SbEglInt32\* minor);
+*   ` eglMakeCurrent`
+
+    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx);
+*   ` eglQueryContext`
+
+    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglQueryString`
+
+    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
+*   ` eglQuerySurface`
+
+    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglSwapBuffers`
+
+    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglTerminate`
+
+    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
+*   ` eglWaitGL`
+
+    SbEglBoolean (\*eglWaitGL)(void);
+*   ` eglWaitNative`
+
+    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
+*   ` eglBindTexImage`
+
+    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglReleaseTexImage`
+
+    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglSurfaceAttrib`
+
+    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value);
+*   ` eglSwapInterval`
+
+    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
+*   ` eglBindAPI`
+
+    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
+*   ` eglQueryAPI`
+
+    SbEglEnum (\*eglQueryAPI)(void);
+*   ` eglCreatePbufferFromClientBuffer`
+
+    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
+    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
+    SbEglInt32\* attrib_list);
+*   ` eglReleaseThread`
+
+    SbEglBoolean (\*eglReleaseThread)(void);
+*   ` eglWaitClient`
+
+    SbEglBoolean (\*eglWaitClient)(void);
+*   ` eglGetCurrentContext`
+
+    SbEglContext (\*eglGetCurrentContext)(void);
+*   ` eglCreateSync`
+
+    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib\* attrib_list);
+*   ` eglDestroySync`
+
+    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
+*   ` eglClientWaitSync`
+
+    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 flags, SbEglTime timeout);
+*   ` eglGetSyncAttrib`
+
+    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib\* value);
+*   ` eglCreateImage`
+
+    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
+*   ` eglDestroyImage`
+
+    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
+*   ` eglGetPlatformDisplay`
+
+    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
+    native_display, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformWindowSurface`
+
+    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformPixmapSurface`
+
+    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
+*   ` eglWaitSync`
+
+    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/11/gles.md b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
index e3a5508..20c5924 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/11/gles.md
@@ -60,256 +60,895 @@
 
 #### Members ####
 
-*   `void(* glActiveTexture`
+*   ` glActiveTexture`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
-    .
-*   `void(* glAttachShader`
-*   `void(* glBindAttribLocation`
-*   `void(* glBindBuffer`
-*   `void(* glBindFramebuffer`
-*   `void(* glBindRenderbuffer`
-*   `void(* glBindTexture`
-*   `void(* glBlendColor`
-*   `void(* glBlendEquation`
-*   `void(* glBlendEquationSeparate`
-*   `void(* glBlendFunc`
-*   `void(* glBlendFuncSeparate`
-*   `void(* glBufferData`
-*   `void(* glBufferSubData`
-*   `SbGlEnum(* glCheckFramebufferStatus`
-*   `void(* glClear`
-*   `void(* glClearColor`
-*   `void(* glClearDepthf`
-*   `void(* glClearStencil`
-*   `void(* glColorMask`
-*   `void(* glCompileShader`
-*   `void(* glCompressedTexImage2D`
-*   `void(* glCompressedTexSubImage2D`
-*   `void(* glCopyTexImage2D`
-*   `void(* glCopyTexSubImage2D`
-*   `SbGlUInt32(* glCreateProgram`
-*   `SbGlUInt32(* glCreateShader`
-*   `void(* glCullFace`
-*   `void(* glDeleteBuffers`
-*   `void(* glDeleteFramebuffers`
-*   `void(* glDeleteProgram`
-*   `void(* glDeleteRenderbuffers`
-*   `void(* glDeleteShader`
-*   `void(* glDeleteTextures`
-*   `void(* glDepthFunc`
-*   `void(* glDepthMask`
-*   `void(* glDepthRangef`
-*   `void(* glDetachShader`
-*   `void(* glDisable`
-*   `void(* glDisableVertexAttribArray`
-*   `void(* glDrawArrays`
-*   `void(* glDrawElements`
-*   `void(* glEnable`
-*   `void(* glEnableVertexAttribArray`
-*   `void(* glFinish`
-*   `void(* glFlush`
-*   `void(* glFramebufferRenderbuffer`
-*   `void(* glFramebufferTexture2D`
-*   `void(* glFrontFace`
-*   `void(* glGenBuffers`
-*   `void(* glGenerateMipmap`
-*   `void(* glGenFramebuffers`
-*   `void(* glGenRenderbuffers`
-*   `void(* glGenTextures`
-*   `void(* glGetActiveAttrib`
-*   `void(* glGetActiveUniform`
-*   `void(* glGetAttachedShaders`
-*   `SbGlInt32(* glGetAttribLocation`
-*   `void(* glGetBooleanv`
-*   `void(* glGetBufferParameteriv`
-*   `SbGlEnum(* glGetError`
-*   `void(* glGetFloatv`
-*   `void(* glGetFramebufferAttachmentParameteriv`
-*   `void(* glGetIntegerv`
-*   `void(* glGetProgramiv`
-*   `void(* glGetProgramInfoLog`
-*   `void(* glGetRenderbufferParameteriv`
-*   `void(* glGetShaderiv`
-*   `void(* glGetShaderInfoLog`
-*   `void(* glGetShaderPrecisionFormat`
-*   `void(* glGetShaderSource`
-*   `const SbGlUInt8 *(* glGetString`
-*   `void(* glGetTexParameterfv`
-*   `void(* glGetTexParameteriv`
-*   `void(* glGetUniformfv`
-*   `void(* glGetUniformiv`
-*   `SbGlInt32(* glGetUniformLocation`
-*   `void(* glGetVertexAttribfv`
-*   `void(* glGetVertexAttribiv`
-*   `void(* glGetVertexAttribPointerv`
-*   `void(* glHint`
-*   `SbGlBoolean(* glIsBuffer`
-*   `SbGlBoolean(* glIsEnabled`
-*   `SbGlBoolean(* glIsFramebuffer`
-*   `SbGlBoolean(* glIsProgram`
-*   `SbGlBoolean(* glIsRenderbuffer`
-*   `SbGlBoolean(* glIsShader`
-*   `SbGlBoolean(* glIsTexture`
-*   `void(* glLineWidth`
-*   `void(* glLinkProgram`
-*   `void(* glPixelStorei`
-*   `void(* glPolygonOffset`
-*   `void(* glReadPixels`
-*   `void(* glReleaseShaderCompiler`
-*   `void(* glRenderbufferStorage`
-*   `void(* glSampleCoverage`
-*   `void(* glScissor`
-*   `void(* glShaderBinary`
-*   `void(* glShaderSource`
-*   `void(* glStencilFunc`
-*   `void(* glStencilFuncSeparate`
-*   `void(* glStencilMask`
-*   `void(* glStencilMaskSeparate`
-*   `void(* glStencilOp`
-*   `void(* glStencilOpSeparate`
-*   `void(* glTexImage2D`
-*   `void(* glTexParameterf`
-*   `void(* glTexParameterfv`
-*   `void(* glTexParameteri`
-*   `void(* glTexParameteriv`
-*   `void(* glTexSubImage2D`
-*   `void(* glUniform1f`
-*   `void(* glUniform1fv`
-*   `void(* glUniform1i`
-*   `void(* glUniform1iv`
-*   `void(* glUniform2f`
-*   `void(* glUniform2fv`
-*   `void(* glUniform2i`
-*   `void(* glUniform2iv`
-*   `void(* glUniform3f`
-*   `void(* glUniform3fv`
-*   `void(* glUniform3i`
-*   `void(* glUniform3iv`
-*   `void(* glUniform4f`
-*   `void(* glUniform4fv`
-*   `void(* glUniform4i`
-*   `void(* glUniform4iv`
-*   `void(* glUniformMatrix2fv`
-*   `void(* glUniformMatrix3fv`
-*   `void(* glUniformMatrix4fv`
-*   `void(* glUseProgram`
-*   `void(* glValidateProgram`
-*   `void(* glVertexAttrib1f`
-*   `void(* glVertexAttrib1fv`
-*   `void(* glVertexAttrib2f`
-*   `void(* glVertexAttrib2fv`
-*   `void(* glVertexAttrib3f`
-*   `void(* glVertexAttrib3fv`
-*   `void(* glVertexAttrib4f`
-*   `void(* glVertexAttrib4fv`
-*   `void(* glVertexAttribPointer`
-*   `void(* glViewport`
-*   `void(* glReadBuffer`
+    void (\*glActiveTexture)(SbGlEnum texture);
+*   ` glAttachShader`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
-    .
-*   `void(* glDrawRangeElements`
-*   `void(* glTexImage3D`
-*   `void(* glTexSubImage3D`
-*   `void(* glCopyTexSubImage3D`
-*   `void(* glCompressedTexImage3D`
-*   `void(* glCompressedTexSubImage3D`
-*   `void(* glGenQueries`
-*   `void(* glDeleteQueries`
-*   `SbGlBoolean(* glIsQuery`
-*   `void(* glBeginQuery`
-*   `void(* glEndQuery`
-*   `void(* glGetQueryiv`
-*   `void(* glGetQueryObjectuiv`
-*   `SbGlBoolean(* glUnmapBuffer`
-*   `void(* glGetBufferPointerv`
-*   `void(* glDrawBuffers`
-*   `void(* glUniformMatrix2x3fv`
-*   `void(* glUniformMatrix3x2fv`
-*   `void(* glUniformMatrix2x4fv`
-*   `void(* glUniformMatrix4x2fv`
-*   `void(* glUniformMatrix3x4fv`
-*   `void(* glUniformMatrix4x3fv`
-*   `void(* glBlitFramebuffer`
-*   `void(* glRenderbufferStorageMultisample`
-*   `void(* glFramebufferTextureLayer`
-*   `void *(* glMapBufferRange`
-*   `void(* glFlushMappedBufferRange`
-*   `void(* glBindVertexArray`
-*   `void(* glDeleteVertexArrays`
-*   `void(* glGenVertexArrays`
-*   `SbGlBoolean(* glIsVertexArray`
-*   `void(* glGetIntegeri_v`
-*   `void(* glBeginTransformFeedback`
-*   `void(* glEndTransformFeedback`
-*   `void(* glBindBufferRange`
-*   `void(* glBindBufferBase`
-*   `void(* glTransformFeedbackVaryings`
-*   `void(* glGetTransformFeedbackVarying`
-*   `void(* glVertexAttribIPointer`
-*   `void(* glGetVertexAttribIiv`
-*   `void(* glGetVertexAttribIuiv`
-*   `void(* glVertexAttribI4i`
-*   `void(* glVertexAttribI4ui`
-*   `void(* glVertexAttribI4iv`
-*   `void(* glVertexAttribI4uiv`
-*   `void(* glGetUniformuiv`
-*   `SbGlInt32(* glGetFragDataLocation`
-*   `void(* glUniform1ui`
-*   `void(* glUniform2ui`
-*   `void(* glUniform3ui`
-*   `void(* glUniform4ui`
-*   `void(* glUniform1uiv`
-*   `void(* glUniform2uiv`
-*   `void(* glUniform3uiv`
-*   `void(* glUniform4uiv`
-*   `void(* glClearBufferiv`
-*   `void(* glClearBufferuiv`
-*   `void(* glClearBufferfv`
-*   `void(* glClearBufferfi`
-*   `const SbGlUInt8 *(* glGetStringi`
-*   `void(* glCopyBufferSubData`
-*   `void(* glGetUniformIndices`
-*   `void(* glGetActiveUniformsiv`
-*   `SbGlUInt32(* glGetUniformBlockIndex`
-*   `void(* glGetActiveUniformBlockiv`
-*   `void(* glGetActiveUniformBlockName`
-*   `void(* glUniformBlockBinding`
-*   `void(* glDrawArraysInstanced`
-*   `void(* glDrawElementsInstanced`
-*   `SbGlSync(* glFenceSync`
-*   `SbGlBoolean(* glIsSync`
-*   `void(* glDeleteSync`
-*   `SbGlEnum(* glClientWaitSync`
-*   `void(* glWaitSync`
-*   `void(* glGetInteger64v`
-*   `void(* glGetSynciv`
-*   `void(* glGetInteger64i_v`
-*   `void(* glGetBufferParameteri64v`
-*   `void(* glGenSamplers`
-*   `void(* glDeleteSamplers`
-*   `SbGlBoolean(* glIsSampler`
-*   `void(* glBindSampler`
-*   `void(* glSamplerParameteri`
-*   `void(* glSamplerParameteriv`
-*   `void(* glSamplerParameterf`
-*   `void(* glSamplerParameterfv`
-*   `void(* glGetSamplerParameteriv`
-*   `void(* glGetSamplerParameterfv`
-*   `void(* glVertexAttribDivisor`
-*   `void(* glBindTransformFeedback`
-*   `void(* glDeleteTransformFeedbacks`
-*   `void(* glGenTransformFeedbacks`
-*   `SbGlBoolean(* glIsTransformFeedback`
-*   `void(* glPauseTransformFeedback`
-*   `void(* glResumeTransformFeedback`
-*   `void(* glGetProgramBinary`
-*   `void(* glProgramBinary`
-*   `void(* glProgramParameteri`
-*   `void(* glInvalidateFramebuffer`
-*   `void(* glInvalidateSubFramebuffer`
-*   `void(* glTexStorage2D`
-*   `void(* glTexStorage3D`
-*   `void(* glGetInternalformativ`
+    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glBindAttribLocation`
+
+    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar\* name);
+*   ` glBindBuffer`
+
+    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
+*   ` glBindFramebuffer`
+
+    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
+*   ` glBindRenderbuffer`
+
+    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
+*   ` glBindTexture`
+
+    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
+*   ` glBlendColor`
+
+    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glBlendEquation`
+
+    void (\*glBlendEquation)(SbGlEnum mode);
+*   ` glBlendEquationSeparate`
+
+    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
+*   ` glBlendFunc`
+
+    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
+*   ` glBlendFuncSeparate`
+
+    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
+*   ` glBufferData`
+
+    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
+    SbGlEnum usage);
+*   ` glBufferSubData`
+
+    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void\* data);
+*   ` glCheckFramebufferStatus`
+
+    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
+*   ` glClear`
+
+    void (\*glClear)(SbGlBitfield mask);
+*   ` glClearColor`
+
+    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glClearDepthf`
+
+    void (\*glClearDepthf)(SbGlFloat d);
+*   ` glClearStencil`
+
+    void (\*glClearStencil)(SbGlInt32 s);
+*   ` glColorMask`
+
+    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha);
+*   ` glCompileShader`
+
+    void (\*glCompileShader)(SbGlUInt32 shader);
+*   ` glCompressedTexImage2D`
+
+    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage2D`
+
+    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
+    SbGlEnum format, SbGlSizei imageSize, const void\* data);
+*   ` glCopyTexImage2D`
+
+    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
+    SbGlInt32 border);
+*   ` glCopyTexSubImage2D`
+
+    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
+    SbGlSizei height);
+*   ` glCreateProgram`
+
+    SbGlUInt32 (\*glCreateProgram)(void);
+*   ` glCreateShader`
+
+    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
+*   ` glCullFace`
+
+    void (\*glCullFace)(SbGlEnum mode);
+*   ` glDeleteBuffers`
+
+    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
+*   ` glDeleteFramebuffers`
+
+    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
+*   ` glDeleteProgram`
+
+    void (\*glDeleteProgram)(SbGlUInt32 program);
+*   ` glDeleteRenderbuffers`
+
+    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
+    renderbuffers);
+*   ` glDeleteShader`
+
+    void (\*glDeleteShader)(SbGlUInt32 shader);
+*   ` glDeleteTextures`
+
+    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
+*   ` glDepthFunc`
+
+    void (\*glDepthFunc)(SbGlEnum func);
+*   ` glDepthMask`
+
+    void (\*glDepthMask)(SbGlBoolean flag);
+*   ` glDepthRangef`
+
+    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
+*   ` glDetachShader`
+
+    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glDisable`
+
+    void (\*glDisable)(SbGlEnum cap);
+*   ` glDisableVertexAttribArray`
+
+    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
+*   ` glDrawArrays`
+
+    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
+*   ` glDrawElements`
+
+    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void\* indices);
+*   ` glEnable`
+
+    void (\*glEnable)(SbGlEnum cap);
+*   ` glEnableVertexAttribArray`
+
+    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
+*   ` glFinish`
+
+    void (\*glFinish)(void);
+*   ` glFlush`
+
+    void (\*glFlush)(void);
+*   ` glFramebufferRenderbuffer`
+
+    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
+*   ` glFramebufferTexture2D`
+
+    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
+*   ` glFrontFace`
+
+    void (\*glFrontFace)(SbGlEnum mode);
+*   ` glGenBuffers`
+
+    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
+*   ` glGenerateMipmap`
+
+    void (\*glGenerateMipmap)(SbGlEnum target);
+*   ` glGenFramebuffers`
+
+    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
+*   ` glGenRenderbuffers`
+
+    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
+*   ` glGenTextures`
+
+    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
+*   ` glGetActiveAttrib`
+
+    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetActiveUniform`
+
+    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetAttachedShaders`
+
+    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei\* count, SbGlUInt32\* shaders);
+*   ` glGetAttribLocation`
+
+    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetBooleanv`
+
+    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
+*   ` glGetBufferParameteriv`
+
+    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetError`
+
+    SbGlEnum (\*glGetError)(void);
+*   ` glGetFloatv`
+
+    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
+*   ` glGetFramebufferAttachmentParameteriv`
+
+    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetIntegerv`
+
+    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
+*   ` glGetProgramiv`
+
+    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetProgramInfoLog`
+
+    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetRenderbufferParameteriv`
+
+    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetShaderiv`
+
+    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetShaderInfoLog`
+
+    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetShaderPrecisionFormat`
+
+    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
+*   ` glGetShaderSource`
+
+    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
+    length, SbGlChar\* source);
+*   ` glGetString`
+
+    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
+*   ` glGetTexParameterfv`
+
+    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetTexParameteriv`
+
+    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetUniformfv`
+
+    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
+    params);
+*   ` glGetUniformiv`
+
+    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
+    params);
+*   ` glGetUniformLocation`
+
+    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetVertexAttribfv`
+
+    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetVertexAttribiv`
+
+    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribPointerv`
+
+    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
+    void\*\* pointer);
+*   ` glHint`
+
+    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
+*   ` glIsBuffer`
+
+    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
+*   ` glIsEnabled`
+
+    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
+*   ` glIsFramebuffer`
+
+    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
+*   ` glIsProgram`
+
+    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
+*   ` glIsRenderbuffer`
+
+    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
+*   ` glIsShader`
+
+    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
+*   ` glIsTexture`
+
+    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
+*   ` glLineWidth`
+
+    void (\*glLineWidth)(SbGlFloat width);
+*   ` glLinkProgram`
+
+    void (\*glLinkProgram)(SbGlUInt32 program);
+*   ` glPixelStorei`
+
+    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
+*   ` glPolygonOffset`
+
+    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
+*   ` glReadPixels`
+
+    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void\* pixels);
+*   ` glReleaseShaderCompiler`
+
+    void (\*glReleaseShaderCompiler)(void);
+*   ` glRenderbufferStorage`
+
+    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height);
+*   ` glSampleCoverage`
+
+    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
+*   ` glScissor`
+
+    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glShaderBinary`
+
+    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
+    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
+*   ` glShaderSource`
+
+    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
+    const\* string, const SbGlInt32\* length);
+*   ` glStencilFunc`
+
+    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
+*   ` glStencilFuncSeparate`
+
+    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask);
+*   ` glStencilMask`
+
+    void (\*glStencilMask)(SbGlUInt32 mask);
+*   ` glStencilMaskSeparate`
+
+    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
+*   ` glStencilOp`
+
+    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
+*   ` glStencilOpSeparate`
+
+    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass);
+*   ` glTexImage2D`
+
+    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexParameterf`
+
+    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
+*   ` glTexParameterfv`
+
+    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
+    params);
+*   ` glTexParameteri`
+
+    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
+*   ` glTexParameteriv`
+
+    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
+    params);
+*   ` glTexSubImage2D`
+
+    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
+    format, SbGlEnum type, const void\* pixels);
+*   ` glUniform1f`
+
+    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
+*   ` glUniform1fv`
+
+    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform1i`
+
+    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
+*   ` glUniform1iv`
+
+    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform2f`
+
+    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
+*   ` glUniform2fv`
+
+    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform2i`
+
+    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
+*   ` glUniform2iv`
+
+    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform3f`
+
+    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2);
+*   ` glUniform3fv`
+
+    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform3i`
+
+    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2);
+*   ` glUniform3iv`
+
+    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform4f`
+
+    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3);
+*   ` glUniform4fv`
+
+    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform4i`
+
+    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3);
+*   ` glUniform4iv`
+
+    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniformMatrix2fv`
+
+    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3fv`
+
+    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4fv`
+
+    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUseProgram`
+
+    void (\*glUseProgram)(SbGlUInt32 program);
+*   ` glValidateProgram`
+
+    void (\*glValidateProgram)(SbGlUInt32 program);
+*   ` glVertexAttrib1f`
+
+    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
+*   ` glVertexAttrib1fv`
+
+    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib2f`
+
+    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
+*   ` glVertexAttrib2fv`
+
+    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib3f`
+
+    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z);
+*   ` glVertexAttrib3fv`
+
+    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib4f`
+
+    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w);
+*   ` glVertexAttrib4fv`
+
+    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttribPointer`
+
+    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
+*   ` glViewport`
+
+    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glReadBuffer`
+
+    void (\*glReadBuffer)(SbGlEnum src);
+*   ` glDrawRangeElements`
+
+    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
+    end, SbGlSizei count, SbGlEnum type, const void\* indices);
+*   ` glTexImage3D`
+
+    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexSubImage3D`
+
+    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
+    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
+    pixels);
+*   ` glCopyTexSubImage3D`
+
+    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glCompressedTexImage3D`
+
+    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage3D`
+
+    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
+    SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
+    const void\* data);
+*   ` glGenQueries`
+
+    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glDeleteQueries`
+
+    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glIsQuery`
+
+    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
+*   ` glBeginQuery`
+
+    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
+*   ` glEndQuery`
+
+    void (\*glEndQuery)(SbGlEnum target);
+*   ` glGetQueryiv`
+
+    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetQueryObjectuiv`
+
+    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
+    params);
+*   ` glUnmapBuffer`
+
+    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
+*   ` glGetBufferPointerv`
+
+    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
+    params);
+*   ` glDrawBuffers`
+
+    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
+*   ` glUniformMatrix2x3fv`
+
+    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x2fv`
+
+    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix2x4fv`
+
+    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x2fv`
+
+    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x4fv`
+
+    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x3fv`
+
+    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glBlitFramebuffer`
+
+    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
+    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
+*   ` glRenderbufferStorageMultisample`
+
+    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
+    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glFramebufferTextureLayer`
+
+    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
+*   ` glMapBufferRange`
+
+    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access);
+*   ` glFlushMappedBufferRange`
+
+    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length);
+*   ` glBindVertexArray`
+
+    void (\*glBindVertexArray)(SbGlUInt32 array);
+*   ` glDeleteVertexArrays`
+
+    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
+*   ` glGenVertexArrays`
+
+    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
+*   ` glIsVertexArray`
+
+    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
+*   ` glGetIntegeri_v`
+
+    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
+    data);
+*   ` glBeginTransformFeedback`
+
+    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
+*   ` glEndTransformFeedback`
+
+    void (\*glEndTransformFeedback)(void);
+*   ` glBindBufferRange`
+
+    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
+*   ` glBindBufferBase`
+
+    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer);
+*   ` glTransformFeedbackVaryings`
+
+    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
+*   ` glGetTransformFeedbackVarying`
+
+    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
+    SbGlChar\* name);
+*   ` glVertexAttribIPointer`
+
+    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void\* pointer);
+*   ` glGetVertexAttribIiv`
+
+    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribIuiv`
+
+    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
+    SbGlUInt32\* params);
+*   ` glVertexAttribI4i`
+
+    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w);
+*   ` glVertexAttribI4ui`
+
+    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w);
+*   ` glVertexAttribI4iv`
+
+    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
+*   ` glVertexAttribI4uiv`
+
+    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
+*   ` glGetUniformuiv`
+
+    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
+    SbGlUInt32\* params);
+*   ` glGetFragDataLocation`
+
+    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glUniform1ui`
+
+    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
+*   ` glUniform2ui`
+
+    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
+*   ` glUniform3ui`
+
+    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2);
+*   ` glUniform4ui`
+
+    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3);
+*   ` glUniform1uiv`
+
+    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform2uiv`
+
+    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform3uiv`
+
+    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform4uiv`
+
+    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glClearBufferiv`
+
+    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32\* value);
+*   ` glClearBufferuiv`
+
+    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32\* value);
+*   ` glClearBufferfv`
+
+    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat\* value);
+*   ` glClearBufferfi`
+
+    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil);
+*   ` glGetStringi`
+
+    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
+*   ` glCopyBufferSubData`
+
+    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
+*   ` glGetUniformIndices`
+
+    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
+*   ` glGetActiveUniformsiv`
+
+    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetUniformBlockIndex`
+
+    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
+    uniformBlockName);
+*   ` glGetActiveUniformBlockiv`
+
+    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetActiveUniformBlockName`
+
+    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
+    uniformBlockName);
+*   ` glUniformBlockBinding`
+
+    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
+*   ` glDrawArraysInstanced`
+
+    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount);
+*   ` glDrawElementsInstanced`
+
+    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void\* indices, SbGlSizei instancecount);
+*   ` glFenceSync`
+
+    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
+*   ` glIsSync`
+
+    SbGlBoolean (\*glIsSync)(SbGlSync sync);
+*   ` glDeleteSync`
+
+    void (\*glDeleteSync)(SbGlSync sync);
+*   ` glClientWaitSync`
+
+    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout);
+*   ` glWaitSync`
+
+    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
+*   ` glGetInteger64v`
+
+    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
+*   ` glGetSynciv`
+
+    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlInt32\* values);
+*   ` glGetInteger64i_v`
+
+    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
+    data);
+*   ` glGetBufferParameteri64v`
+
+    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt64\* params);
+*   ` glGenSamplers`
+
+    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
+*   ` glDeleteSamplers`
+
+    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
+*   ` glIsSampler`
+
+    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
+*   ` glBindSampler`
+
+    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
+*   ` glSamplerParameteri`
+
+    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param);
+*   ` glSamplerParameteriv`
+
+    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32\* param);
+*   ` glSamplerParameterf`
+
+    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param);
+*   ` glSamplerParameterfv`
+
+    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat\* param);
+*   ` glGetSamplerParameteriv`
+
+    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetSamplerParameterfv`
+
+    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat\* params);
+*   ` glVertexAttribDivisor`
+
+    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
+*   ` glBindTransformFeedback`
+
+    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
+*   ` glDeleteTransformFeedbacks`
+
+    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glGenTransformFeedbacks`
+
+    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glIsTransformFeedback`
+
+    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
+*   ` glPauseTransformFeedback`
+
+    void (\*glPauseTransformFeedback)(void);
+*   ` glResumeTransformFeedback`
+
+    void (\*glResumeTransformFeedback)(void);
+*   ` glGetProgramBinary`
+
+    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
+*   ` glProgramBinary`
+
+    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void\* binary, SbGlSizei length);
+*   ` glProgramParameteri`
+
+    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value);
+*   ` glInvalidateFramebuffer`
+
+    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum\* attachments);
+*   ` glInvalidateSubFramebuffer`
+
+    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage2D`
+
+    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage3D`
+
+    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
+*   ` glGetInternalformativ`
+
+    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
index 14ccc3e..362c24e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/configuration.md
@@ -78,14 +78,6 @@
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
-
-Deprecated feature macros These feature macros are deprecated in Starboard
-version 6 and later, and are no longer referenced by application code. They will
-be removed in a future version. Any Starboard implementation that supports
-Starboard version 6 or later should be modified to no longer depend on these
-macros, with the assumption that their values are always 1.
-
 ### SB_HAS_GLES2 ###
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
@@ -93,10 +85,6 @@
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_GRAPHICS ###
-
-Specifies whether this platform has any kind of supported graphics system.
-
 ### SB_HAS_QUIRK(SB_FEATURE) ###
 
 Determines at compile-time whether this platform has a quirk.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/egl.md b/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
index 1938b5b..6990f44 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/egl.md
@@ -72,48 +72,163 @@
 
 #### Members ####
 
-*   `SbEglBoolean(* eglChooseConfig`
-*   `SbEglBoolean(* eglCopyBuffers`
-*   `SbEglContext(* eglCreateContext`
-*   `SbEglSurface(* eglCreatePbufferSurface`
-*   `SbEglSurface(* eglCreatePixmapSurface`
-*   `SbEglSurface(* eglCreateWindowSurface`
-*   `SbEglBoolean(* eglDestroyContext`
-*   `SbEglBoolean(* eglDestroySurface`
-*   `SbEglBoolean(* eglGetConfigAttrib`
-*   `SbEglBoolean(* eglGetConfigs`
-*   `SbEglDisplay(* eglGetCurrentDisplay`
-*   `SbEglSurface(* eglGetCurrentSurface`
-*   `SbEglDisplay(* eglGetDisplay`
-*   `SbEglInt32(* eglGetError`
-*   `SbEglCastsToProperFunctionPointerType(* eglGetProcAddress`
-*   `SbEglBoolean(* eglInitialize`
-*   `SbEglBoolean(* eglMakeCurrent`
-*   `SbEglBoolean(* eglQueryContext`
-*   `const char *(* eglQueryString`
-*   `SbEglBoolean(* eglQuerySurface`
-*   `SbEglBoolean(* eglSwapBuffers`
-*   `SbEglBoolean(* eglTerminate`
-*   `SbEglBoolean(* eglWaitGL`
-*   `SbEglBoolean(* eglWaitNative`
-*   `SbEglBoolean(* eglBindTexImage`
-*   `SbEglBoolean(* eglReleaseTexImage`
-*   `SbEglBoolean(* eglSurfaceAttrib`
-*   `SbEglBoolean(* eglSwapInterval`
-*   `SbEglBoolean(* eglBindAPI`
-*   `SbEglEnum(* eglQueryAPI`
-*   `SbEglSurface(* eglCreatePbufferFromClientBuffer`
-*   `SbEglBoolean(* eglReleaseThread`
-*   `SbEglBoolean(* eglWaitClient`
-*   `SbEglContext(* eglGetCurrentContext`
-*   `SbEglSync(* eglCreateSync`
-*   `SbEglBoolean(* eglDestroySync`
-*   `SbEglInt32(* eglClientWaitSync`
-*   `SbEglBoolean(* eglGetSyncAttrib`
-*   `SbEglImage(* eglCreateImage`
-*   `SbEglBoolean(* eglDestroyImage`
-*   `SbEglDisplay(* eglGetPlatformDisplay`
-*   `SbEglSurface(* eglCreatePlatformWindowSurface`
-*   `SbEglSurface(* eglCreatePlatformPixmapSurface`
-*   `SbEglBoolean(* eglWaitSync`
+*   ` eglChooseConfig`
+
+    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
+    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
+    num_config);
+*   ` eglCopyBuffers`
+
+    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target);
+*   ` eglCreateContext`
+
+    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32\* attrib_list);
+*   ` eglCreatePbufferSurface`
+
+    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32\* attrib_list);
+*   ` eglCreatePixmapSurface`
+
+    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
+*   ` eglCreateWindowSurface`
+
+    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
+*   ` eglDestroyContext`
+
+    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
+*   ` eglDestroySurface`
+
+    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglGetConfigAttrib`
+
+    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglGetConfigs`
+
+    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
+    SbEglInt32 config_size, SbEglInt32\* num_config);
+*   ` eglGetCurrentDisplay`
+
+    SbEglDisplay (\*eglGetCurrentDisplay)(void);
+*   ` eglGetCurrentSurface`
+
+    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
+*   ` eglGetDisplay`
+
+    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
+*   ` eglGetError`
+
+    SbEglInt32 (\*eglGetError)(void);
+*   ` eglGetProcAddress`
+
+    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
+    procname);
+*   ` eglInitialize`
+
+    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
+    SbEglInt32\* minor);
+*   ` eglMakeCurrent`
+
+    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx);
+*   ` eglQueryContext`
+
+    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglQueryString`
+
+    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
+*   ` eglQuerySurface`
+
+    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglSwapBuffers`
+
+    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglTerminate`
+
+    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
+*   ` eglWaitGL`
+
+    SbEglBoolean (\*eglWaitGL)(void);
+*   ` eglWaitNative`
+
+    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
+*   ` eglBindTexImage`
+
+    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglReleaseTexImage`
+
+    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglSurfaceAttrib`
+
+    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value);
+*   ` eglSwapInterval`
+
+    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
+*   ` eglBindAPI`
+
+    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
+*   ` eglQueryAPI`
+
+    SbEglEnum (\*eglQueryAPI)(void);
+*   ` eglCreatePbufferFromClientBuffer`
+
+    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
+    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
+    SbEglInt32\* attrib_list);
+*   ` eglReleaseThread`
+
+    SbEglBoolean (\*eglReleaseThread)(void);
+*   ` eglWaitClient`
+
+    SbEglBoolean (\*eglWaitClient)(void);
+*   ` eglGetCurrentContext`
+
+    SbEglContext (\*eglGetCurrentContext)(void);
+*   ` eglCreateSync`
+
+    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib\* attrib_list);
+*   ` eglDestroySync`
+
+    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
+*   ` eglClientWaitSync`
+
+    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 flags, SbEglTime timeout);
+*   ` eglGetSyncAttrib`
+
+    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib\* value);
+*   ` eglCreateImage`
+
+    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
+*   ` eglDestroyImage`
+
+    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
+*   ` eglGetPlatformDisplay`
+
+    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
+    native_display, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformWindowSurface`
+
+    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformPixmapSurface`
+
+    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
+*   ` eglWaitSync`
+
+    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/gles.md b/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
index e3a5508..20c5924 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/gles.md
@@ -60,256 +60,895 @@
 
 #### Members ####
 
-*   `void(* glActiveTexture`
+*   ` glActiveTexture`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
-    .
-*   `void(* glAttachShader`
-*   `void(* glBindAttribLocation`
-*   `void(* glBindBuffer`
-*   `void(* glBindFramebuffer`
-*   `void(* glBindRenderbuffer`
-*   `void(* glBindTexture`
-*   `void(* glBlendColor`
-*   `void(* glBlendEquation`
-*   `void(* glBlendEquationSeparate`
-*   `void(* glBlendFunc`
-*   `void(* glBlendFuncSeparate`
-*   `void(* glBufferData`
-*   `void(* glBufferSubData`
-*   `SbGlEnum(* glCheckFramebufferStatus`
-*   `void(* glClear`
-*   `void(* glClearColor`
-*   `void(* glClearDepthf`
-*   `void(* glClearStencil`
-*   `void(* glColorMask`
-*   `void(* glCompileShader`
-*   `void(* glCompressedTexImage2D`
-*   `void(* glCompressedTexSubImage2D`
-*   `void(* glCopyTexImage2D`
-*   `void(* glCopyTexSubImage2D`
-*   `SbGlUInt32(* glCreateProgram`
-*   `SbGlUInt32(* glCreateShader`
-*   `void(* glCullFace`
-*   `void(* glDeleteBuffers`
-*   `void(* glDeleteFramebuffers`
-*   `void(* glDeleteProgram`
-*   `void(* glDeleteRenderbuffers`
-*   `void(* glDeleteShader`
-*   `void(* glDeleteTextures`
-*   `void(* glDepthFunc`
-*   `void(* glDepthMask`
-*   `void(* glDepthRangef`
-*   `void(* glDetachShader`
-*   `void(* glDisable`
-*   `void(* glDisableVertexAttribArray`
-*   `void(* glDrawArrays`
-*   `void(* glDrawElements`
-*   `void(* glEnable`
-*   `void(* glEnableVertexAttribArray`
-*   `void(* glFinish`
-*   `void(* glFlush`
-*   `void(* glFramebufferRenderbuffer`
-*   `void(* glFramebufferTexture2D`
-*   `void(* glFrontFace`
-*   `void(* glGenBuffers`
-*   `void(* glGenerateMipmap`
-*   `void(* glGenFramebuffers`
-*   `void(* glGenRenderbuffers`
-*   `void(* glGenTextures`
-*   `void(* glGetActiveAttrib`
-*   `void(* glGetActiveUniform`
-*   `void(* glGetAttachedShaders`
-*   `SbGlInt32(* glGetAttribLocation`
-*   `void(* glGetBooleanv`
-*   `void(* glGetBufferParameteriv`
-*   `SbGlEnum(* glGetError`
-*   `void(* glGetFloatv`
-*   `void(* glGetFramebufferAttachmentParameteriv`
-*   `void(* glGetIntegerv`
-*   `void(* glGetProgramiv`
-*   `void(* glGetProgramInfoLog`
-*   `void(* glGetRenderbufferParameteriv`
-*   `void(* glGetShaderiv`
-*   `void(* glGetShaderInfoLog`
-*   `void(* glGetShaderPrecisionFormat`
-*   `void(* glGetShaderSource`
-*   `const SbGlUInt8 *(* glGetString`
-*   `void(* glGetTexParameterfv`
-*   `void(* glGetTexParameteriv`
-*   `void(* glGetUniformfv`
-*   `void(* glGetUniformiv`
-*   `SbGlInt32(* glGetUniformLocation`
-*   `void(* glGetVertexAttribfv`
-*   `void(* glGetVertexAttribiv`
-*   `void(* glGetVertexAttribPointerv`
-*   `void(* glHint`
-*   `SbGlBoolean(* glIsBuffer`
-*   `SbGlBoolean(* glIsEnabled`
-*   `SbGlBoolean(* glIsFramebuffer`
-*   `SbGlBoolean(* glIsProgram`
-*   `SbGlBoolean(* glIsRenderbuffer`
-*   `SbGlBoolean(* glIsShader`
-*   `SbGlBoolean(* glIsTexture`
-*   `void(* glLineWidth`
-*   `void(* glLinkProgram`
-*   `void(* glPixelStorei`
-*   `void(* glPolygonOffset`
-*   `void(* glReadPixels`
-*   `void(* glReleaseShaderCompiler`
-*   `void(* glRenderbufferStorage`
-*   `void(* glSampleCoverage`
-*   `void(* glScissor`
-*   `void(* glShaderBinary`
-*   `void(* glShaderSource`
-*   `void(* glStencilFunc`
-*   `void(* glStencilFuncSeparate`
-*   `void(* glStencilMask`
-*   `void(* glStencilMaskSeparate`
-*   `void(* glStencilOp`
-*   `void(* glStencilOpSeparate`
-*   `void(* glTexImage2D`
-*   `void(* glTexParameterf`
-*   `void(* glTexParameterfv`
-*   `void(* glTexParameteri`
-*   `void(* glTexParameteriv`
-*   `void(* glTexSubImage2D`
-*   `void(* glUniform1f`
-*   `void(* glUniform1fv`
-*   `void(* glUniform1i`
-*   `void(* glUniform1iv`
-*   `void(* glUniform2f`
-*   `void(* glUniform2fv`
-*   `void(* glUniform2i`
-*   `void(* glUniform2iv`
-*   `void(* glUniform3f`
-*   `void(* glUniform3fv`
-*   `void(* glUniform3i`
-*   `void(* glUniform3iv`
-*   `void(* glUniform4f`
-*   `void(* glUniform4fv`
-*   `void(* glUniform4i`
-*   `void(* glUniform4iv`
-*   `void(* glUniformMatrix2fv`
-*   `void(* glUniformMatrix3fv`
-*   `void(* glUniformMatrix4fv`
-*   `void(* glUseProgram`
-*   `void(* glValidateProgram`
-*   `void(* glVertexAttrib1f`
-*   `void(* glVertexAttrib1fv`
-*   `void(* glVertexAttrib2f`
-*   `void(* glVertexAttrib2fv`
-*   `void(* glVertexAttrib3f`
-*   `void(* glVertexAttrib3fv`
-*   `void(* glVertexAttrib4f`
-*   `void(* glVertexAttrib4fv`
-*   `void(* glVertexAttribPointer`
-*   `void(* glViewport`
-*   `void(* glReadBuffer`
+    void (\*glActiveTexture)(SbGlEnum texture);
+*   ` glAttachShader`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
-    .
-*   `void(* glDrawRangeElements`
-*   `void(* glTexImage3D`
-*   `void(* glTexSubImage3D`
-*   `void(* glCopyTexSubImage3D`
-*   `void(* glCompressedTexImage3D`
-*   `void(* glCompressedTexSubImage3D`
-*   `void(* glGenQueries`
-*   `void(* glDeleteQueries`
-*   `SbGlBoolean(* glIsQuery`
-*   `void(* glBeginQuery`
-*   `void(* glEndQuery`
-*   `void(* glGetQueryiv`
-*   `void(* glGetQueryObjectuiv`
-*   `SbGlBoolean(* glUnmapBuffer`
-*   `void(* glGetBufferPointerv`
-*   `void(* glDrawBuffers`
-*   `void(* glUniformMatrix2x3fv`
-*   `void(* glUniformMatrix3x2fv`
-*   `void(* glUniformMatrix2x4fv`
-*   `void(* glUniformMatrix4x2fv`
-*   `void(* glUniformMatrix3x4fv`
-*   `void(* glUniformMatrix4x3fv`
-*   `void(* glBlitFramebuffer`
-*   `void(* glRenderbufferStorageMultisample`
-*   `void(* glFramebufferTextureLayer`
-*   `void *(* glMapBufferRange`
-*   `void(* glFlushMappedBufferRange`
-*   `void(* glBindVertexArray`
-*   `void(* glDeleteVertexArrays`
-*   `void(* glGenVertexArrays`
-*   `SbGlBoolean(* glIsVertexArray`
-*   `void(* glGetIntegeri_v`
-*   `void(* glBeginTransformFeedback`
-*   `void(* glEndTransformFeedback`
-*   `void(* glBindBufferRange`
-*   `void(* glBindBufferBase`
-*   `void(* glTransformFeedbackVaryings`
-*   `void(* glGetTransformFeedbackVarying`
-*   `void(* glVertexAttribIPointer`
-*   `void(* glGetVertexAttribIiv`
-*   `void(* glGetVertexAttribIuiv`
-*   `void(* glVertexAttribI4i`
-*   `void(* glVertexAttribI4ui`
-*   `void(* glVertexAttribI4iv`
-*   `void(* glVertexAttribI4uiv`
-*   `void(* glGetUniformuiv`
-*   `SbGlInt32(* glGetFragDataLocation`
-*   `void(* glUniform1ui`
-*   `void(* glUniform2ui`
-*   `void(* glUniform3ui`
-*   `void(* glUniform4ui`
-*   `void(* glUniform1uiv`
-*   `void(* glUniform2uiv`
-*   `void(* glUniform3uiv`
-*   `void(* glUniform4uiv`
-*   `void(* glClearBufferiv`
-*   `void(* glClearBufferuiv`
-*   `void(* glClearBufferfv`
-*   `void(* glClearBufferfi`
-*   `const SbGlUInt8 *(* glGetStringi`
-*   `void(* glCopyBufferSubData`
-*   `void(* glGetUniformIndices`
-*   `void(* glGetActiveUniformsiv`
-*   `SbGlUInt32(* glGetUniformBlockIndex`
-*   `void(* glGetActiveUniformBlockiv`
-*   `void(* glGetActiveUniformBlockName`
-*   `void(* glUniformBlockBinding`
-*   `void(* glDrawArraysInstanced`
-*   `void(* glDrawElementsInstanced`
-*   `SbGlSync(* glFenceSync`
-*   `SbGlBoolean(* glIsSync`
-*   `void(* glDeleteSync`
-*   `SbGlEnum(* glClientWaitSync`
-*   `void(* glWaitSync`
-*   `void(* glGetInteger64v`
-*   `void(* glGetSynciv`
-*   `void(* glGetInteger64i_v`
-*   `void(* glGetBufferParameteri64v`
-*   `void(* glGenSamplers`
-*   `void(* glDeleteSamplers`
-*   `SbGlBoolean(* glIsSampler`
-*   `void(* glBindSampler`
-*   `void(* glSamplerParameteri`
-*   `void(* glSamplerParameteriv`
-*   `void(* glSamplerParameterf`
-*   `void(* glSamplerParameterfv`
-*   `void(* glGetSamplerParameteriv`
-*   `void(* glGetSamplerParameterfv`
-*   `void(* glVertexAttribDivisor`
-*   `void(* glBindTransformFeedback`
-*   `void(* glDeleteTransformFeedbacks`
-*   `void(* glGenTransformFeedbacks`
-*   `SbGlBoolean(* glIsTransformFeedback`
-*   `void(* glPauseTransformFeedback`
-*   `void(* glResumeTransformFeedback`
-*   `void(* glGetProgramBinary`
-*   `void(* glProgramBinary`
-*   `void(* glProgramParameteri`
-*   `void(* glInvalidateFramebuffer`
-*   `void(* glInvalidateSubFramebuffer`
-*   `void(* glTexStorage2D`
-*   `void(* glTexStorage3D`
-*   `void(* glGetInternalformativ`
+    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glBindAttribLocation`
+
+    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar\* name);
+*   ` glBindBuffer`
+
+    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
+*   ` glBindFramebuffer`
+
+    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
+*   ` glBindRenderbuffer`
+
+    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
+*   ` glBindTexture`
+
+    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
+*   ` glBlendColor`
+
+    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glBlendEquation`
+
+    void (\*glBlendEquation)(SbGlEnum mode);
+*   ` glBlendEquationSeparate`
+
+    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
+*   ` glBlendFunc`
+
+    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
+*   ` glBlendFuncSeparate`
+
+    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
+*   ` glBufferData`
+
+    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
+    SbGlEnum usage);
+*   ` glBufferSubData`
+
+    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void\* data);
+*   ` glCheckFramebufferStatus`
+
+    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
+*   ` glClear`
+
+    void (\*glClear)(SbGlBitfield mask);
+*   ` glClearColor`
+
+    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glClearDepthf`
+
+    void (\*glClearDepthf)(SbGlFloat d);
+*   ` glClearStencil`
+
+    void (\*glClearStencil)(SbGlInt32 s);
+*   ` glColorMask`
+
+    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha);
+*   ` glCompileShader`
+
+    void (\*glCompileShader)(SbGlUInt32 shader);
+*   ` glCompressedTexImage2D`
+
+    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage2D`
+
+    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
+    SbGlEnum format, SbGlSizei imageSize, const void\* data);
+*   ` glCopyTexImage2D`
+
+    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
+    SbGlInt32 border);
+*   ` glCopyTexSubImage2D`
+
+    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
+    SbGlSizei height);
+*   ` glCreateProgram`
+
+    SbGlUInt32 (\*glCreateProgram)(void);
+*   ` glCreateShader`
+
+    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
+*   ` glCullFace`
+
+    void (\*glCullFace)(SbGlEnum mode);
+*   ` glDeleteBuffers`
+
+    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
+*   ` glDeleteFramebuffers`
+
+    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
+*   ` glDeleteProgram`
+
+    void (\*glDeleteProgram)(SbGlUInt32 program);
+*   ` glDeleteRenderbuffers`
+
+    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
+    renderbuffers);
+*   ` glDeleteShader`
+
+    void (\*glDeleteShader)(SbGlUInt32 shader);
+*   ` glDeleteTextures`
+
+    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
+*   ` glDepthFunc`
+
+    void (\*glDepthFunc)(SbGlEnum func);
+*   ` glDepthMask`
+
+    void (\*glDepthMask)(SbGlBoolean flag);
+*   ` glDepthRangef`
+
+    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
+*   ` glDetachShader`
+
+    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glDisable`
+
+    void (\*glDisable)(SbGlEnum cap);
+*   ` glDisableVertexAttribArray`
+
+    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
+*   ` glDrawArrays`
+
+    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
+*   ` glDrawElements`
+
+    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void\* indices);
+*   ` glEnable`
+
+    void (\*glEnable)(SbGlEnum cap);
+*   ` glEnableVertexAttribArray`
+
+    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
+*   ` glFinish`
+
+    void (\*glFinish)(void);
+*   ` glFlush`
+
+    void (\*glFlush)(void);
+*   ` glFramebufferRenderbuffer`
+
+    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
+*   ` glFramebufferTexture2D`
+
+    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
+*   ` glFrontFace`
+
+    void (\*glFrontFace)(SbGlEnum mode);
+*   ` glGenBuffers`
+
+    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
+*   ` glGenerateMipmap`
+
+    void (\*glGenerateMipmap)(SbGlEnum target);
+*   ` glGenFramebuffers`
+
+    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
+*   ` glGenRenderbuffers`
+
+    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
+*   ` glGenTextures`
+
+    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
+*   ` glGetActiveAttrib`
+
+    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetActiveUniform`
+
+    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetAttachedShaders`
+
+    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei\* count, SbGlUInt32\* shaders);
+*   ` glGetAttribLocation`
+
+    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetBooleanv`
+
+    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
+*   ` glGetBufferParameteriv`
+
+    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetError`
+
+    SbGlEnum (\*glGetError)(void);
+*   ` glGetFloatv`
+
+    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
+*   ` glGetFramebufferAttachmentParameteriv`
+
+    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetIntegerv`
+
+    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
+*   ` glGetProgramiv`
+
+    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetProgramInfoLog`
+
+    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetRenderbufferParameteriv`
+
+    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetShaderiv`
+
+    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetShaderInfoLog`
+
+    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetShaderPrecisionFormat`
+
+    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
+*   ` glGetShaderSource`
+
+    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
+    length, SbGlChar\* source);
+*   ` glGetString`
+
+    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
+*   ` glGetTexParameterfv`
+
+    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetTexParameteriv`
+
+    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetUniformfv`
+
+    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
+    params);
+*   ` glGetUniformiv`
+
+    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
+    params);
+*   ` glGetUniformLocation`
+
+    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetVertexAttribfv`
+
+    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetVertexAttribiv`
+
+    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribPointerv`
+
+    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
+    void\*\* pointer);
+*   ` glHint`
+
+    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
+*   ` glIsBuffer`
+
+    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
+*   ` glIsEnabled`
+
+    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
+*   ` glIsFramebuffer`
+
+    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
+*   ` glIsProgram`
+
+    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
+*   ` glIsRenderbuffer`
+
+    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
+*   ` glIsShader`
+
+    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
+*   ` glIsTexture`
+
+    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
+*   ` glLineWidth`
+
+    void (\*glLineWidth)(SbGlFloat width);
+*   ` glLinkProgram`
+
+    void (\*glLinkProgram)(SbGlUInt32 program);
+*   ` glPixelStorei`
+
+    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
+*   ` glPolygonOffset`
+
+    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
+*   ` glReadPixels`
+
+    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void\* pixels);
+*   ` glReleaseShaderCompiler`
+
+    void (\*glReleaseShaderCompiler)(void);
+*   ` glRenderbufferStorage`
+
+    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height);
+*   ` glSampleCoverage`
+
+    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
+*   ` glScissor`
+
+    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glShaderBinary`
+
+    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
+    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
+*   ` glShaderSource`
+
+    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
+    const\* string, const SbGlInt32\* length);
+*   ` glStencilFunc`
+
+    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
+*   ` glStencilFuncSeparate`
+
+    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask);
+*   ` glStencilMask`
+
+    void (\*glStencilMask)(SbGlUInt32 mask);
+*   ` glStencilMaskSeparate`
+
+    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
+*   ` glStencilOp`
+
+    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
+*   ` glStencilOpSeparate`
+
+    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass);
+*   ` glTexImage2D`
+
+    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexParameterf`
+
+    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
+*   ` glTexParameterfv`
+
+    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
+    params);
+*   ` glTexParameteri`
+
+    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
+*   ` glTexParameteriv`
+
+    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
+    params);
+*   ` glTexSubImage2D`
+
+    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
+    format, SbGlEnum type, const void\* pixels);
+*   ` glUniform1f`
+
+    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
+*   ` glUniform1fv`
+
+    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform1i`
+
+    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
+*   ` glUniform1iv`
+
+    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform2f`
+
+    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
+*   ` glUniform2fv`
+
+    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform2i`
+
+    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
+*   ` glUniform2iv`
+
+    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform3f`
+
+    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2);
+*   ` glUniform3fv`
+
+    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform3i`
+
+    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2);
+*   ` glUniform3iv`
+
+    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform4f`
+
+    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3);
+*   ` glUniform4fv`
+
+    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform4i`
+
+    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3);
+*   ` glUniform4iv`
+
+    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniformMatrix2fv`
+
+    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3fv`
+
+    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4fv`
+
+    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUseProgram`
+
+    void (\*glUseProgram)(SbGlUInt32 program);
+*   ` glValidateProgram`
+
+    void (\*glValidateProgram)(SbGlUInt32 program);
+*   ` glVertexAttrib1f`
+
+    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
+*   ` glVertexAttrib1fv`
+
+    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib2f`
+
+    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
+*   ` glVertexAttrib2fv`
+
+    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib3f`
+
+    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z);
+*   ` glVertexAttrib3fv`
+
+    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib4f`
+
+    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w);
+*   ` glVertexAttrib4fv`
+
+    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttribPointer`
+
+    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
+*   ` glViewport`
+
+    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glReadBuffer`
+
+    void (\*glReadBuffer)(SbGlEnum src);
+*   ` glDrawRangeElements`
+
+    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
+    end, SbGlSizei count, SbGlEnum type, const void\* indices);
+*   ` glTexImage3D`
+
+    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexSubImage3D`
+
+    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
+    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
+    pixels);
+*   ` glCopyTexSubImage3D`
+
+    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glCompressedTexImage3D`
+
+    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage3D`
+
+    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
+    SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
+    const void\* data);
+*   ` glGenQueries`
+
+    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glDeleteQueries`
+
+    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glIsQuery`
+
+    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
+*   ` glBeginQuery`
+
+    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
+*   ` glEndQuery`
+
+    void (\*glEndQuery)(SbGlEnum target);
+*   ` glGetQueryiv`
+
+    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetQueryObjectuiv`
+
+    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
+    params);
+*   ` glUnmapBuffer`
+
+    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
+*   ` glGetBufferPointerv`
+
+    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
+    params);
+*   ` glDrawBuffers`
+
+    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
+*   ` glUniformMatrix2x3fv`
+
+    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x2fv`
+
+    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix2x4fv`
+
+    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x2fv`
+
+    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x4fv`
+
+    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x3fv`
+
+    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glBlitFramebuffer`
+
+    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
+    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
+*   ` glRenderbufferStorageMultisample`
+
+    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
+    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glFramebufferTextureLayer`
+
+    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
+*   ` glMapBufferRange`
+
+    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access);
+*   ` glFlushMappedBufferRange`
+
+    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length);
+*   ` glBindVertexArray`
+
+    void (\*glBindVertexArray)(SbGlUInt32 array);
+*   ` glDeleteVertexArrays`
+
+    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
+*   ` glGenVertexArrays`
+
+    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
+*   ` glIsVertexArray`
+
+    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
+*   ` glGetIntegeri_v`
+
+    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
+    data);
+*   ` glBeginTransformFeedback`
+
+    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
+*   ` glEndTransformFeedback`
+
+    void (\*glEndTransformFeedback)(void);
+*   ` glBindBufferRange`
+
+    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
+*   ` glBindBufferBase`
+
+    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer);
+*   ` glTransformFeedbackVaryings`
+
+    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
+*   ` glGetTransformFeedbackVarying`
+
+    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
+    SbGlChar\* name);
+*   ` glVertexAttribIPointer`
+
+    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void\* pointer);
+*   ` glGetVertexAttribIiv`
+
+    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribIuiv`
+
+    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
+    SbGlUInt32\* params);
+*   ` glVertexAttribI4i`
+
+    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w);
+*   ` glVertexAttribI4ui`
+
+    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w);
+*   ` glVertexAttribI4iv`
+
+    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
+*   ` glVertexAttribI4uiv`
+
+    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
+*   ` glGetUniformuiv`
+
+    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
+    SbGlUInt32\* params);
+*   ` glGetFragDataLocation`
+
+    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glUniform1ui`
+
+    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
+*   ` glUniform2ui`
+
+    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
+*   ` glUniform3ui`
+
+    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2);
+*   ` glUniform4ui`
+
+    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3);
+*   ` glUniform1uiv`
+
+    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform2uiv`
+
+    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform3uiv`
+
+    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform4uiv`
+
+    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glClearBufferiv`
+
+    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32\* value);
+*   ` glClearBufferuiv`
+
+    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32\* value);
+*   ` glClearBufferfv`
+
+    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat\* value);
+*   ` glClearBufferfi`
+
+    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil);
+*   ` glGetStringi`
+
+    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
+*   ` glCopyBufferSubData`
+
+    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
+*   ` glGetUniformIndices`
+
+    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
+*   ` glGetActiveUniformsiv`
+
+    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetUniformBlockIndex`
+
+    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
+    uniformBlockName);
+*   ` glGetActiveUniformBlockiv`
+
+    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetActiveUniformBlockName`
+
+    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
+    uniformBlockName);
+*   ` glUniformBlockBinding`
+
+    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
+*   ` glDrawArraysInstanced`
+
+    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount);
+*   ` glDrawElementsInstanced`
+
+    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void\* indices, SbGlSizei instancecount);
+*   ` glFenceSync`
+
+    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
+*   ` glIsSync`
+
+    SbGlBoolean (\*glIsSync)(SbGlSync sync);
+*   ` glDeleteSync`
+
+    void (\*glDeleteSync)(SbGlSync sync);
+*   ` glClientWaitSync`
+
+    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout);
+*   ` glWaitSync`
+
+    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
+*   ` glGetInteger64v`
+
+    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
+*   ` glGetSynciv`
+
+    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlInt32\* values);
+*   ` glGetInteger64i_v`
+
+    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
+    data);
+*   ` glGetBufferParameteri64v`
+
+    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt64\* params);
+*   ` glGenSamplers`
+
+    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
+*   ` glDeleteSamplers`
+
+    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
+*   ` glIsSampler`
+
+    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
+*   ` glBindSampler`
+
+    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
+*   ` glSamplerParameteri`
+
+    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param);
+*   ` glSamplerParameteriv`
+
+    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32\* param);
+*   ` glSamplerParameterf`
+
+    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param);
+*   ` glSamplerParameterfv`
+
+    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat\* param);
+*   ` glGetSamplerParameteriv`
+
+    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetSamplerParameterfv`
+
+    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat\* params);
+*   ` glVertexAttribDivisor`
+
+    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
+*   ` glBindTransformFeedback`
+
+    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
+*   ` glDeleteTransformFeedbacks`
+
+    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glGenTransformFeedbacks`
+
+    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glIsTransformFeedback`
+
+    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
+*   ` glPauseTransformFeedback`
+
+    void (\*glPauseTransformFeedback)(void);
+*   ` glResumeTransformFeedback`
+
+    void (\*glResumeTransformFeedback)(void);
+*   ` glGetProgramBinary`
+
+    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
+*   ` glProgramBinary`
+
+    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void\* binary, SbGlSizei length);
+*   ` glProgramParameteri`
+
+    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value);
+*   ` glInvalidateFramebuffer`
+
+    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum\* attachments);
+*   ` glInvalidateSubFramebuffer`
+
+    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage2D`
+
+    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage3D`
+
+    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
+*   ` glGetInternalformativ`
+
+    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/system.md b/src/cobalt/site/docs/reference/starboard/modules/12/system.md
index 5ebc582..e2b07d4 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/system.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/system.md
@@ -187,11 +187,10 @@
 *   `kSbSystemPropertyModelYear`
 
     The year the device was launched, e.g. "2016".
-*   `kSbSystemPropertyOriginalDesignManufacturerName`
+*   `kSbSystemPropertySystemIntegratorName`
 
-    The corporate entity responsible for the manufacturing/assembly of the
-    device on behalf of the business entity owning the brand. This is often
-    abbreviated as ODM.
+    The corporate entity responsible for submitting the device to YouTube
+    certification and for the device maintenance/updates.
 *   `kSbSystemPropertyPlatformName`
 
     The name of the operating system and platform, suitable for inclusion in a
diff --git a/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md b/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
index 2239e79..a9fb339 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/12/ui_navigation.md
@@ -66,13 +66,19 @@
 
 #### Members ####
 
-*   `void(* onblur`
+*   ` onblur`
+
+    void (\*onblur)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item has lost focus. This is only used with focus items.
-*   `void(* onfocus`
+*   ` onfocus`
+
+    void (\*onfocus)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item has gained focus. This is only used with focus items.
-*   `void(* onscroll`
+*   ` onscroll`
+
+    void (\*onscroll)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item's content offset is changed. This is only used with
     container items.
@@ -84,24 +90,33 @@
 
 #### Members ####
 
-*   `SbUiNavItem(* create_item`
+*   ` create_item`
+
+    SbUiNavItem (\*create_item)(SbUiNavItemType type, const SbUiNavCallbacks \*
+    callbacks, void\* callback_context);
 
     Create a new navigation item. When the user interacts with this item the
     appropriate SbUiNavCallbacks function will be invoked with the provided
     `callback_context`. An item is not interactable until it is enabled.
-*   `void(* destroy_item`
+*   ` destroy_item`
+
+    void (\*destroy_item)(SbUiNavItem item);
 
     Destroy the given navigation item. If this is a content of another item,
     then it will first be unregistered. Additionally, if this item contains
     other items, then those will be unregistered as well, but they will not be
     automatically destroyed.
-*   `void(* set_focus`
+*   ` set_focus`
+
+    void (\*set_focus)(SbUiNavItem item);
 
     This is used to manually force focus on a navigation item of type
     kSbUiNavItemTypeFocus. Any previously focused navigation item should receive
     the blur event. If the item is not transitively a content of the root item,
     then this does nothing.
-*   `void(* set_item_enabled`
+*   ` set_item_enabled`
+
+    void (\*set_item_enabled)(SbUiNavItem item, bool enabled);
 
     This is used to enable or disable user interaction with the specified
     navigation item. All navigation items are disabled when created, and they
@@ -110,23 +125,33 @@
     remain enabled. If `enabled` is false, it must be guaranteed that once this
     function returns, no callbacks associated with this item will be invoked
     until the item is re-enabled.
-*   `void(* set_item_dir`
+*   ` set_item_dir`
+
+    void (\*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir);
 
     This specifies directionality for container items. Containers within
     containers do not inherit directionality. Directionality must be specified
     for each container explicitly.
-*   `void(* set_item_size`
+*   ` set_item_size`
+
+    void (\*set_item_size)(SbUiNavItem item, float width, float height);
 
     Set the interactable size of the specified navigation item. By default, an
     item's size is (0,0).
-*   `void(* set_item_transform`
+*   ` set_item_transform`
+
+    void (\*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3 \*
+    transform);
 
     Set the transform for the navigation item and its contents if the item is a
     container. This specifies the placement of the item's center within its
     container. The transform origin is the center of the item. Distance is
     measured in pixels with the origin being the top-left of the item's
     container. By default, an item's transform is identity.
-*   `bool(* get_item_focus_transform`
+*   ` get_item_focus_transform`
+
+    bool (\*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4 \*
+    out_transform);
 
     Retrieve the focus transform matrix for the navigation item. The UI engine
     may translate, rotate, and/or tilt focus items to reflect user interaction.
@@ -134,7 +159,10 @@
     position inside its container. The transform origin is the center of the
     item. Return false if the item position should not be changed (i.e. the
     transform should be treated as identity).
-*   `bool(* get_item_focus_vector`
+*   ` get_item_focus_vector`
+
+    bool (\*get_item_focus_vector)(SbUiNavItem item, float\* out_x, float\*
+    out_y);
 
     Retrieve a vector representing the focus location within a focused item.
     This is used to provide feedback about user input that is too small to
@@ -143,7 +171,9 @@
     return true and set the output values in the range of [-1, +1] with (out_x,
     out_y) of (-1, -1) being the top-left corner of the navigation item and (0,
     0) being the center.
-*   `void(* set_item_container_window`
+*   ` set_item_container_window`
+
+    void (\*set_item_container_window)(SbUiNavItem item, SbWindow window);
 
     This attaches the given navigation item (which must be a container) to the
     specified window. Navigation items are only interactable if they are
@@ -161,7 +191,9 @@
     `window` is kSbWindowInvalid, then this will unregister the `item` from its
     current window if any. Upon destruction of `item` or `window`, the `item` is
     automatically unregistered from the `window`.
-*   `void(* set_item_container_item`
+*   ` set_item_container_item`
+
+    void (\*set_item_container_item)(SbUiNavItem item, SbUiNavItem container);
 
     A container navigation item may contain other navigation items. However, it
     is an error to have circular containment or for `container` to not be of
@@ -178,14 +210,17 @@
     For example, consider item A with position (5,5) and content offset (0,0).
     Given item B with position (10,10) is registered as a content of item A.
 
-    1.  Item B should be drawn at position (15,15).
+    1) Item B should be drawn at position (15,15).
 
-    1.  If item A's content offset is changed to (10,0), then item B should be
-        drawn at position (5,15).
+    2) If item A's content offset is changed to (10,0), then item B should be
+    drawn at position (5,15).
 
     Essentially, content items should be drawn at: [container position] +
     [content position] - [container content offset]
-*   `void(* set_item_content_offset`
+*   ` set_item_content_offset`
+
+    void (\*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
+    float content_offset_y);
 
     Set the current content offset for the given container. This may be used to
     force scrolling to make certain content items visible. A container item's
@@ -193,7 +228,10 @@
     Essentially, a content item should be drawn at: [container position] +
     [content position] - [container content offset] If `item` is not a
     container, then this does nothing. By default, the content offset is (0,0).
-*   `void(* get_item_content_offset`
+*   ` get_item_content_offset`
+
+    void (\*get_item_content_offset)(SbUiNavItem item, float\*
+    out_content_offset_x, float\* out_content_offset_y);
 
     Retrieve the current content offset for the navigation item. If `item` is
     not a container, then the content offset is (0,0).
diff --git a/src/cobalt/site/docs/reference/starboard/modules/configuration.md b/src/cobalt/site/docs/reference/starboard/modules/configuration.md
index 14ccc3e..362c24e 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/configuration.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/configuration.md
@@ -78,14 +78,6 @@
 
 Whether the current platform has 64-bit atomic operations.
 
-### SB_HAS_AUDIO_SPECIFIC_CONFIG_AS_POINTER ###
-
-Deprecated feature macros These feature macros are deprecated in Starboard
-version 6 and later, and are no longer referenced by application code. They will
-be removed in a future version. Any Starboard implementation that supports
-Starboard version 6 or later should be modified to no longer depend on these
-macros, with the assumption that their values are always 1.
-
 ### SB_HAS_GLES2 ###
 
 Specifies whether this platform has a performant OpenGL ES 2 implementation,
@@ -93,10 +85,6 @@
 variable `gl_type` gl_type which indicates what kind of GL implementation is
 available.
 
-### SB_HAS_GRAPHICS ###
-
-Specifies whether this platform has any kind of supported graphics system.
-
 ### SB_HAS_QUIRK(SB_FEATURE) ###
 
 Determines at compile-time whether this platform has a quirk.
diff --git a/src/cobalt/site/docs/reference/starboard/modules/egl.md b/src/cobalt/site/docs/reference/starboard/modules/egl.md
index 1938b5b..6990f44 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/egl.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/egl.md
@@ -72,48 +72,163 @@
 
 #### Members ####
 
-*   `SbEglBoolean(* eglChooseConfig`
-*   `SbEglBoolean(* eglCopyBuffers`
-*   `SbEglContext(* eglCreateContext`
-*   `SbEglSurface(* eglCreatePbufferSurface`
-*   `SbEglSurface(* eglCreatePixmapSurface`
-*   `SbEglSurface(* eglCreateWindowSurface`
-*   `SbEglBoolean(* eglDestroyContext`
-*   `SbEglBoolean(* eglDestroySurface`
-*   `SbEglBoolean(* eglGetConfigAttrib`
-*   `SbEglBoolean(* eglGetConfigs`
-*   `SbEglDisplay(* eglGetCurrentDisplay`
-*   `SbEglSurface(* eglGetCurrentSurface`
-*   `SbEglDisplay(* eglGetDisplay`
-*   `SbEglInt32(* eglGetError`
-*   `SbEglCastsToProperFunctionPointerType(* eglGetProcAddress`
-*   `SbEglBoolean(* eglInitialize`
-*   `SbEglBoolean(* eglMakeCurrent`
-*   `SbEglBoolean(* eglQueryContext`
-*   `const char *(* eglQueryString`
-*   `SbEglBoolean(* eglQuerySurface`
-*   `SbEglBoolean(* eglSwapBuffers`
-*   `SbEglBoolean(* eglTerminate`
-*   `SbEglBoolean(* eglWaitGL`
-*   `SbEglBoolean(* eglWaitNative`
-*   `SbEglBoolean(* eglBindTexImage`
-*   `SbEglBoolean(* eglReleaseTexImage`
-*   `SbEglBoolean(* eglSurfaceAttrib`
-*   `SbEglBoolean(* eglSwapInterval`
-*   `SbEglBoolean(* eglBindAPI`
-*   `SbEglEnum(* eglQueryAPI`
-*   `SbEglSurface(* eglCreatePbufferFromClientBuffer`
-*   `SbEglBoolean(* eglReleaseThread`
-*   `SbEglBoolean(* eglWaitClient`
-*   `SbEglContext(* eglGetCurrentContext`
-*   `SbEglSync(* eglCreateSync`
-*   `SbEglBoolean(* eglDestroySync`
-*   `SbEglInt32(* eglClientWaitSync`
-*   `SbEglBoolean(* eglGetSyncAttrib`
-*   `SbEglImage(* eglCreateImage`
-*   `SbEglBoolean(* eglDestroyImage`
-*   `SbEglDisplay(* eglGetPlatformDisplay`
-*   `SbEglSurface(* eglCreatePlatformWindowSurface`
-*   `SbEglSurface(* eglCreatePlatformPixmapSurface`
-*   `SbEglBoolean(* eglWaitSync`
+*   ` eglChooseConfig`
+
+    SbEglBoolean (\*eglChooseConfig)(SbEglDisplay dpy, const SbEglInt32\*
+    attrib_list, SbEglConfig\* configs, SbEglInt32 config_size, SbEglInt32\*
+    num_config);
+*   ` eglCopyBuffers`
+
+    SbEglBoolean (\*eglCopyBuffers)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglNativePixmapType target);
+*   ` eglCreateContext`
+
+    SbEglContext (\*eglCreateContext)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglContext share_context, const SbEglInt32\* attrib_list);
+*   ` eglCreatePbufferSurface`
+
+    SbEglSurface (\*eglCreatePbufferSurface)(SbEglDisplay dpy, SbEglConfig
+    config, const SbEglInt32\* attrib_list);
+*   ` eglCreatePixmapSurface`
+
+    SbEglSurface (\*eglCreatePixmapSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativePixmapType pixmap, const SbEglInt32\* attrib_list);
+*   ` eglCreateWindowSurface`
+
+    SbEglSurface (\*eglCreateWindowSurface)(SbEglDisplay dpy, SbEglConfig
+    config, SbEglNativeWindowType win, const SbEglInt32\* attrib_list);
+*   ` eglDestroyContext`
+
+    SbEglBoolean (\*eglDestroyContext)(SbEglDisplay dpy, SbEglContext ctx);
+*   ` eglDestroySurface`
+
+    SbEglBoolean (\*eglDestroySurface)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglGetConfigAttrib`
+
+    SbEglBoolean (\*eglGetConfigAttrib)(SbEglDisplay dpy, SbEglConfig config,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglGetConfigs`
+
+    SbEglBoolean (\*eglGetConfigs)(SbEglDisplay dpy, SbEglConfig\* configs,
+    SbEglInt32 config_size, SbEglInt32\* num_config);
+*   ` eglGetCurrentDisplay`
+
+    SbEglDisplay (\*eglGetCurrentDisplay)(void);
+*   ` eglGetCurrentSurface`
+
+    SbEglSurface (\*eglGetCurrentSurface)(SbEglInt32 readdraw);
+*   ` eglGetDisplay`
+
+    SbEglDisplay (\*eglGetDisplay)(SbEglNativeDisplayType display_id);
+*   ` eglGetError`
+
+    SbEglInt32 (\*eglGetError)(void);
+*   ` eglGetProcAddress`
+
+    SbEglCastsToProperFunctionPointerType (\*eglGetProcAddress)(const char\*
+    procname);
+*   ` eglInitialize`
+
+    SbEglBoolean (\*eglInitialize)(SbEglDisplay dpy, SbEglInt32\* major,
+    SbEglInt32\* minor);
+*   ` eglMakeCurrent`
+
+    SbEglBoolean (\*eglMakeCurrent)(SbEglDisplay dpy, SbEglSurface draw,
+    SbEglSurface read, SbEglContext ctx);
+*   ` eglQueryContext`
+
+    SbEglBoolean (\*eglQueryContext)(SbEglDisplay dpy, SbEglContext ctx,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglQueryString`
+
+    const char\* (\*eglQueryString)(SbEglDisplay dpy, SbEglInt32 name);
+*   ` eglQuerySurface`
+
+    SbEglBoolean (\*eglQuerySurface)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32\* value);
+*   ` eglSwapBuffers`
+
+    SbEglBoolean (\*eglSwapBuffers)(SbEglDisplay dpy, SbEglSurface surface);
+*   ` eglTerminate`
+
+    SbEglBoolean (\*eglTerminate)(SbEglDisplay dpy);
+*   ` eglWaitGL`
+
+    SbEglBoolean (\*eglWaitGL)(void);
+*   ` eglWaitNative`
+
+    SbEglBoolean (\*eglWaitNative)(SbEglInt32 engine);
+*   ` eglBindTexImage`
+
+    SbEglBoolean (\*eglBindTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglReleaseTexImage`
+
+    SbEglBoolean (\*eglReleaseTexImage)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 buffer);
+*   ` eglSurfaceAttrib`
+
+    SbEglBoolean (\*eglSurfaceAttrib)(SbEglDisplay dpy, SbEglSurface surface,
+    SbEglInt32 attribute, SbEglInt32 value);
+*   ` eglSwapInterval`
+
+    SbEglBoolean (\*eglSwapInterval)(SbEglDisplay dpy, SbEglInt32 interval);
+*   ` eglBindAPI`
+
+    SbEglBoolean (\*eglBindAPI)(SbEglEnum api);
+*   ` eglQueryAPI`
+
+    SbEglEnum (\*eglQueryAPI)(void);
+*   ` eglCreatePbufferFromClientBuffer`
+
+    SbEglSurface (\*eglCreatePbufferFromClientBuffer)(SbEglDisplay dpy,
+    SbEglEnum buftype, SbEglClientBuffer buffer, SbEglConfig config, const
+    SbEglInt32\* attrib_list);
+*   ` eglReleaseThread`
+
+    SbEglBoolean (\*eglReleaseThread)(void);
+*   ` eglWaitClient`
+
+    SbEglBoolean (\*eglWaitClient)(void);
+*   ` eglGetCurrentContext`
+
+    SbEglContext (\*eglGetCurrentContext)(void);
+*   ` eglCreateSync`
+
+    SbEglSync (\*eglCreateSync)(SbEglDisplay dpy, SbEglEnum type, const
+    SbEglAttrib\* attrib_list);
+*   ` eglDestroySync`
+
+    SbEglBoolean (\*eglDestroySync)(SbEglDisplay dpy, SbEglSync sync);
+*   ` eglClientWaitSync`
+
+    SbEglInt32 (\*eglClientWaitSync)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 flags, SbEglTime timeout);
+*   ` eglGetSyncAttrib`
+
+    SbEglBoolean (\*eglGetSyncAttrib)(SbEglDisplay dpy, SbEglSync sync,
+    SbEglInt32 attribute, SbEglAttrib\* value);
+*   ` eglCreateImage`
+
+    SbEglImage (\*eglCreateImage)(SbEglDisplay dpy, SbEglContext ctx, SbEglEnum
+    target, SbEglClientBuffer buffer, const SbEglAttrib\* attrib_list);
+*   ` eglDestroyImage`
+
+    SbEglBoolean (\*eglDestroyImage)(SbEglDisplay dpy, SbEglImage image);
+*   ` eglGetPlatformDisplay`
+
+    SbEglDisplay (\*eglGetPlatformDisplay)(SbEglEnum platform, void\*
+    native_display, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformWindowSurface`
+
+    SbEglSurface (\*eglCreatePlatformWindowSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_window, const SbEglAttrib\* attrib_list);
+*   ` eglCreatePlatformPixmapSurface`
+
+    SbEglSurface (\*eglCreatePlatformPixmapSurface)(SbEglDisplay dpy,
+    SbEglConfig config, void\* native_pixmap, const SbEglAttrib\* attrib_list);
+*   ` eglWaitSync`
+
+    SbEglBoolean (\*eglWaitSync)(SbEglDisplay dpy, SbEglSync sync, SbEglInt32
+    flags);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/gles.md b/src/cobalt/site/docs/reference/starboard/modules/gles.md
index e3a5508..20c5924 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/gles.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/gles.md
@@ -60,256 +60,895 @@
 
 #### Members ####
 
-*   `void(* glActiveTexture`
+*   ` glActiveTexture`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h](https://www.khronos.org/registry/OpenGL/api/GLES2/gl2.h)
-    .
-*   `void(* glAttachShader`
-*   `void(* glBindAttribLocation`
-*   `void(* glBindBuffer`
-*   `void(* glBindFramebuffer`
-*   `void(* glBindRenderbuffer`
-*   `void(* glBindTexture`
-*   `void(* glBlendColor`
-*   `void(* glBlendEquation`
-*   `void(* glBlendEquationSeparate`
-*   `void(* glBlendFunc`
-*   `void(* glBlendFuncSeparate`
-*   `void(* glBufferData`
-*   `void(* glBufferSubData`
-*   `SbGlEnum(* glCheckFramebufferStatus`
-*   `void(* glClear`
-*   `void(* glClearColor`
-*   `void(* glClearDepthf`
-*   `void(* glClearStencil`
-*   `void(* glColorMask`
-*   `void(* glCompileShader`
-*   `void(* glCompressedTexImage2D`
-*   `void(* glCompressedTexSubImage2D`
-*   `void(* glCopyTexImage2D`
-*   `void(* glCopyTexSubImage2D`
-*   `SbGlUInt32(* glCreateProgram`
-*   `SbGlUInt32(* glCreateShader`
-*   `void(* glCullFace`
-*   `void(* glDeleteBuffers`
-*   `void(* glDeleteFramebuffers`
-*   `void(* glDeleteProgram`
-*   `void(* glDeleteRenderbuffers`
-*   `void(* glDeleteShader`
-*   `void(* glDeleteTextures`
-*   `void(* glDepthFunc`
-*   `void(* glDepthMask`
-*   `void(* glDepthRangef`
-*   `void(* glDetachShader`
-*   `void(* glDisable`
-*   `void(* glDisableVertexAttribArray`
-*   `void(* glDrawArrays`
-*   `void(* glDrawElements`
-*   `void(* glEnable`
-*   `void(* glEnableVertexAttribArray`
-*   `void(* glFinish`
-*   `void(* glFlush`
-*   `void(* glFramebufferRenderbuffer`
-*   `void(* glFramebufferTexture2D`
-*   `void(* glFrontFace`
-*   `void(* glGenBuffers`
-*   `void(* glGenerateMipmap`
-*   `void(* glGenFramebuffers`
-*   `void(* glGenRenderbuffers`
-*   `void(* glGenTextures`
-*   `void(* glGetActiveAttrib`
-*   `void(* glGetActiveUniform`
-*   `void(* glGetAttachedShaders`
-*   `SbGlInt32(* glGetAttribLocation`
-*   `void(* glGetBooleanv`
-*   `void(* glGetBufferParameteriv`
-*   `SbGlEnum(* glGetError`
-*   `void(* glGetFloatv`
-*   `void(* glGetFramebufferAttachmentParameteriv`
-*   `void(* glGetIntegerv`
-*   `void(* glGetProgramiv`
-*   `void(* glGetProgramInfoLog`
-*   `void(* glGetRenderbufferParameteriv`
-*   `void(* glGetShaderiv`
-*   `void(* glGetShaderInfoLog`
-*   `void(* glGetShaderPrecisionFormat`
-*   `void(* glGetShaderSource`
-*   `const SbGlUInt8 *(* glGetString`
-*   `void(* glGetTexParameterfv`
-*   `void(* glGetTexParameteriv`
-*   `void(* glGetUniformfv`
-*   `void(* glGetUniformiv`
-*   `SbGlInt32(* glGetUniformLocation`
-*   `void(* glGetVertexAttribfv`
-*   `void(* glGetVertexAttribiv`
-*   `void(* glGetVertexAttribPointerv`
-*   `void(* glHint`
-*   `SbGlBoolean(* glIsBuffer`
-*   `SbGlBoolean(* glIsEnabled`
-*   `SbGlBoolean(* glIsFramebuffer`
-*   `SbGlBoolean(* glIsProgram`
-*   `SbGlBoolean(* glIsRenderbuffer`
-*   `SbGlBoolean(* glIsShader`
-*   `SbGlBoolean(* glIsTexture`
-*   `void(* glLineWidth`
-*   `void(* glLinkProgram`
-*   `void(* glPixelStorei`
-*   `void(* glPolygonOffset`
-*   `void(* glReadPixels`
-*   `void(* glReleaseShaderCompiler`
-*   `void(* glRenderbufferStorage`
-*   `void(* glSampleCoverage`
-*   `void(* glScissor`
-*   `void(* glShaderBinary`
-*   `void(* glShaderSource`
-*   `void(* glStencilFunc`
-*   `void(* glStencilFuncSeparate`
-*   `void(* glStencilMask`
-*   `void(* glStencilMaskSeparate`
-*   `void(* glStencilOp`
-*   `void(* glStencilOpSeparate`
-*   `void(* glTexImage2D`
-*   `void(* glTexParameterf`
-*   `void(* glTexParameterfv`
-*   `void(* glTexParameteri`
-*   `void(* glTexParameteriv`
-*   `void(* glTexSubImage2D`
-*   `void(* glUniform1f`
-*   `void(* glUniform1fv`
-*   `void(* glUniform1i`
-*   `void(* glUniform1iv`
-*   `void(* glUniform2f`
-*   `void(* glUniform2fv`
-*   `void(* glUniform2i`
-*   `void(* glUniform2iv`
-*   `void(* glUniform3f`
-*   `void(* glUniform3fv`
-*   `void(* glUniform3i`
-*   `void(* glUniform3iv`
-*   `void(* glUniform4f`
-*   `void(* glUniform4fv`
-*   `void(* glUniform4i`
-*   `void(* glUniform4iv`
-*   `void(* glUniformMatrix2fv`
-*   `void(* glUniformMatrix3fv`
-*   `void(* glUniformMatrix4fv`
-*   `void(* glUseProgram`
-*   `void(* glValidateProgram`
-*   `void(* glVertexAttrib1f`
-*   `void(* glVertexAttrib1fv`
-*   `void(* glVertexAttrib2f`
-*   `void(* glVertexAttrib2fv`
-*   `void(* glVertexAttrib3f`
-*   `void(* glVertexAttrib3fv`
-*   `void(* glVertexAttrib4f`
-*   `void(* glVertexAttrib4fv`
-*   `void(* glVertexAttribPointer`
-*   `void(* glViewport`
-*   `void(* glReadBuffer`
+    void (\*glActiveTexture)(SbGlEnum texture);
+*   ` glAttachShader`
 
-    The following prototypes were adapted from the prototypes declared in [https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h](https://www.khronos.org/registry/OpenGL/api/GLES3/gl3.h)
-    .
-*   `void(* glDrawRangeElements`
-*   `void(* glTexImage3D`
-*   `void(* glTexSubImage3D`
-*   `void(* glCopyTexSubImage3D`
-*   `void(* glCompressedTexImage3D`
-*   `void(* glCompressedTexSubImage3D`
-*   `void(* glGenQueries`
-*   `void(* glDeleteQueries`
-*   `SbGlBoolean(* glIsQuery`
-*   `void(* glBeginQuery`
-*   `void(* glEndQuery`
-*   `void(* glGetQueryiv`
-*   `void(* glGetQueryObjectuiv`
-*   `SbGlBoolean(* glUnmapBuffer`
-*   `void(* glGetBufferPointerv`
-*   `void(* glDrawBuffers`
-*   `void(* glUniformMatrix2x3fv`
-*   `void(* glUniformMatrix3x2fv`
-*   `void(* glUniformMatrix2x4fv`
-*   `void(* glUniformMatrix4x2fv`
-*   `void(* glUniformMatrix3x4fv`
-*   `void(* glUniformMatrix4x3fv`
-*   `void(* glBlitFramebuffer`
-*   `void(* glRenderbufferStorageMultisample`
-*   `void(* glFramebufferTextureLayer`
-*   `void *(* glMapBufferRange`
-*   `void(* glFlushMappedBufferRange`
-*   `void(* glBindVertexArray`
-*   `void(* glDeleteVertexArrays`
-*   `void(* glGenVertexArrays`
-*   `SbGlBoolean(* glIsVertexArray`
-*   `void(* glGetIntegeri_v`
-*   `void(* glBeginTransformFeedback`
-*   `void(* glEndTransformFeedback`
-*   `void(* glBindBufferRange`
-*   `void(* glBindBufferBase`
-*   `void(* glTransformFeedbackVaryings`
-*   `void(* glGetTransformFeedbackVarying`
-*   `void(* glVertexAttribIPointer`
-*   `void(* glGetVertexAttribIiv`
-*   `void(* glGetVertexAttribIuiv`
-*   `void(* glVertexAttribI4i`
-*   `void(* glVertexAttribI4ui`
-*   `void(* glVertexAttribI4iv`
-*   `void(* glVertexAttribI4uiv`
-*   `void(* glGetUniformuiv`
-*   `SbGlInt32(* glGetFragDataLocation`
-*   `void(* glUniform1ui`
-*   `void(* glUniform2ui`
-*   `void(* glUniform3ui`
-*   `void(* glUniform4ui`
-*   `void(* glUniform1uiv`
-*   `void(* glUniform2uiv`
-*   `void(* glUniform3uiv`
-*   `void(* glUniform4uiv`
-*   `void(* glClearBufferiv`
-*   `void(* glClearBufferuiv`
-*   `void(* glClearBufferfv`
-*   `void(* glClearBufferfi`
-*   `const SbGlUInt8 *(* glGetStringi`
-*   `void(* glCopyBufferSubData`
-*   `void(* glGetUniformIndices`
-*   `void(* glGetActiveUniformsiv`
-*   `SbGlUInt32(* glGetUniformBlockIndex`
-*   `void(* glGetActiveUniformBlockiv`
-*   `void(* glGetActiveUniformBlockName`
-*   `void(* glUniformBlockBinding`
-*   `void(* glDrawArraysInstanced`
-*   `void(* glDrawElementsInstanced`
-*   `SbGlSync(* glFenceSync`
-*   `SbGlBoolean(* glIsSync`
-*   `void(* glDeleteSync`
-*   `SbGlEnum(* glClientWaitSync`
-*   `void(* glWaitSync`
-*   `void(* glGetInteger64v`
-*   `void(* glGetSynciv`
-*   `void(* glGetInteger64i_v`
-*   `void(* glGetBufferParameteri64v`
-*   `void(* glGenSamplers`
-*   `void(* glDeleteSamplers`
-*   `SbGlBoolean(* glIsSampler`
-*   `void(* glBindSampler`
-*   `void(* glSamplerParameteri`
-*   `void(* glSamplerParameteriv`
-*   `void(* glSamplerParameterf`
-*   `void(* glSamplerParameterfv`
-*   `void(* glGetSamplerParameteriv`
-*   `void(* glGetSamplerParameterfv`
-*   `void(* glVertexAttribDivisor`
-*   `void(* glBindTransformFeedback`
-*   `void(* glDeleteTransformFeedbacks`
-*   `void(* glGenTransformFeedbacks`
-*   `SbGlBoolean(* glIsTransformFeedback`
-*   `void(* glPauseTransformFeedback`
-*   `void(* glResumeTransformFeedback`
-*   `void(* glGetProgramBinary`
-*   `void(* glProgramBinary`
-*   `void(* glProgramParameteri`
-*   `void(* glInvalidateFramebuffer`
-*   `void(* glInvalidateSubFramebuffer`
-*   `void(* glTexStorage2D`
-*   `void(* glTexStorage3D`
-*   `void(* glGetInternalformativ`
+    void (\*glAttachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glBindAttribLocation`
+
+    void (\*glBindAttribLocation)(SbGlUInt32 program, SbGlUInt32 index, const
+    SbGlChar\* name);
+*   ` glBindBuffer`
+
+    void (\*glBindBuffer)(SbGlEnum target, SbGlUInt32 buffer);
+*   ` glBindFramebuffer`
+
+    void (\*glBindFramebuffer)(SbGlEnum target, SbGlUInt32 framebuffer);
+*   ` glBindRenderbuffer`
+
+    void (\*glBindRenderbuffer)(SbGlEnum target, SbGlUInt32 renderbuffer);
+*   ` glBindTexture`
+
+    void (\*glBindTexture)(SbGlEnum target, SbGlUInt32 texture);
+*   ` glBlendColor`
+
+    void (\*glBlendColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glBlendEquation`
+
+    void (\*glBlendEquation)(SbGlEnum mode);
+*   ` glBlendEquationSeparate`
+
+    void (\*glBlendEquationSeparate)(SbGlEnum modeRGB, SbGlEnum modeAlpha);
+*   ` glBlendFunc`
+
+    void (\*glBlendFunc)(SbGlEnum sfactor, SbGlEnum dfactor);
+*   ` glBlendFuncSeparate`
+
+    void (\*glBlendFuncSeparate)(SbGlEnum sfactorRGB, SbGlEnum dfactorRGB,
+    SbGlEnum sfactorAlpha, SbGlEnum dfactorAlpha);
+*   ` glBufferData`
+
+    void (\*glBufferData)(SbGlEnum target, SbGlSizeiPtr size, const void\* data,
+    SbGlEnum usage);
+*   ` glBufferSubData`
+
+    void (\*glBufferSubData)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    size, const void\* data);
+*   ` glCheckFramebufferStatus`
+
+    SbGlEnum (\*glCheckFramebufferStatus)(SbGlEnum target);
+*   ` glClear`
+
+    void (\*glClear)(SbGlBitfield mask);
+*   ` glClearColor`
+
+    void (\*glClearColor)(SbGlFloat red, SbGlFloat green, SbGlFloat blue,
+    SbGlFloat alpha);
+*   ` glClearDepthf`
+
+    void (\*glClearDepthf)(SbGlFloat d);
+*   ` glClearStencil`
+
+    void (\*glClearStencil)(SbGlInt32 s);
+*   ` glColorMask`
+
+    void (\*glColorMask)(SbGlBoolean red, SbGlBoolean green, SbGlBoolean blue,
+    SbGlBoolean alpha);
+*   ` glCompileShader`
+
+    void (\*glCompileShader)(SbGlUInt32 shader);
+*   ` glCompressedTexImage2D`
+
+    void (\*glCompressedTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage2D`
+
+    void (\*glCompressedTexSubImage2D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height,
+    SbGlEnum format, SbGlSizei imageSize, const void\* data);
+*   ` glCopyTexImage2D`
+
+    void (\*glCopyTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei height,
+    SbGlInt32 border);
+*   ` glCopyTexSubImage2D`
+
+    void (\*glCopyTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 x, SbGlInt32 y, SbGlSizei width,
+    SbGlSizei height);
+*   ` glCreateProgram`
+
+    SbGlUInt32 (\*glCreateProgram)(void);
+*   ` glCreateShader`
+
+    SbGlUInt32 (\*glCreateShader)(SbGlEnum type);
+*   ` glCullFace`
+
+    void (\*glCullFace)(SbGlEnum mode);
+*   ` glDeleteBuffers`
+
+    void (\*glDeleteBuffers)(SbGlSizei n, const SbGlUInt32\* buffers);
+*   ` glDeleteFramebuffers`
+
+    void (\*glDeleteFramebuffers)(SbGlSizei n, const SbGlUInt32\* framebuffers);
+*   ` glDeleteProgram`
+
+    void (\*glDeleteProgram)(SbGlUInt32 program);
+*   ` glDeleteRenderbuffers`
+
+    void (\*glDeleteRenderbuffers)(SbGlSizei n, const SbGlUInt32\*
+    renderbuffers);
+*   ` glDeleteShader`
+
+    void (\*glDeleteShader)(SbGlUInt32 shader);
+*   ` glDeleteTextures`
+
+    void (\*glDeleteTextures)(SbGlSizei n, const SbGlUInt32\* textures);
+*   ` glDepthFunc`
+
+    void (\*glDepthFunc)(SbGlEnum func);
+*   ` glDepthMask`
+
+    void (\*glDepthMask)(SbGlBoolean flag);
+*   ` glDepthRangef`
+
+    void (\*glDepthRangef)(SbGlFloat n, SbGlFloat f);
+*   ` glDetachShader`
+
+    void (\*glDetachShader)(SbGlUInt32 program, SbGlUInt32 shader);
+*   ` glDisable`
+
+    void (\*glDisable)(SbGlEnum cap);
+*   ` glDisableVertexAttribArray`
+
+    void (\*glDisableVertexAttribArray)(SbGlUInt32 index);
+*   ` glDrawArrays`
+
+    void (\*glDrawArrays)(SbGlEnum mode, SbGlInt32 first, SbGlSizei count);
+*   ` glDrawElements`
+
+    void (\*glDrawElements)(SbGlEnum mode, SbGlSizei count, SbGlEnum type, const
+    void\* indices);
+*   ` glEnable`
+
+    void (\*glEnable)(SbGlEnum cap);
+*   ` glEnableVertexAttribArray`
+
+    void (\*glEnableVertexAttribArray)(SbGlUInt32 index);
+*   ` glFinish`
+
+    void (\*glFinish)(void);
+*   ` glFlush`
+
+    void (\*glFlush)(void);
+*   ` glFramebufferRenderbuffer`
+
+    void (\*glFramebufferRenderbuffer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum renderbuffertarget, SbGlUInt32 renderbuffer);
+*   ` glFramebufferTexture2D`
+
+    void (\*glFramebufferTexture2D)(SbGlEnum target, SbGlEnum attachment,
+    SbGlEnum textarget, SbGlUInt32 texture, SbGlInt32 level);
+*   ` glFrontFace`
+
+    void (\*glFrontFace)(SbGlEnum mode);
+*   ` glGenBuffers`
+
+    void (\*glGenBuffers)(SbGlSizei n, SbGlUInt32\* buffers);
+*   ` glGenerateMipmap`
+
+    void (\*glGenerateMipmap)(SbGlEnum target);
+*   ` glGenFramebuffers`
+
+    void (\*glGenFramebuffers)(SbGlSizei n, SbGlUInt32\* framebuffers);
+*   ` glGenRenderbuffers`
+
+    void (\*glGenRenderbuffers)(SbGlSizei n, SbGlUInt32\* renderbuffers);
+*   ` glGenTextures`
+
+    void (\*glGenTextures)(SbGlSizei n, SbGlUInt32\* textures);
+*   ` glGetActiveAttrib`
+
+    void (\*glGetActiveAttrib)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetActiveUniform`
+
+    void (\*glGetActiveUniform)(SbGlUInt32 program, SbGlUInt32 index, SbGlSizei
+    bufSize, SbGlSizei\* length, SbGlInt32\* size, SbGlEnum\* type, SbGlChar\*
+    name);
+*   ` glGetAttachedShaders`
+
+    void (\*glGetAttachedShaders)(SbGlUInt32 program, SbGlSizei maxCount,
+    SbGlSizei\* count, SbGlUInt32\* shaders);
+*   ` glGetAttribLocation`
+
+    SbGlInt32 (\*glGetAttribLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetBooleanv`
+
+    void (\*glGetBooleanv)(SbGlEnum pname, SbGlBoolean\* data);
+*   ` glGetBufferParameteriv`
+
+    void (\*glGetBufferParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetError`
+
+    SbGlEnum (\*glGetError)(void);
+*   ` glGetFloatv`
+
+    void (\*glGetFloatv)(SbGlEnum pname, SbGlFloat\* data);
+*   ` glGetFramebufferAttachmentParameteriv`
+
+    void (\*glGetFramebufferAttachmentParameteriv)(SbGlEnum target, SbGlEnum
+    attachment, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetIntegerv`
+
+    void (\*glGetIntegerv)(SbGlEnum pname, SbGlInt32\* data);
+*   ` glGetProgramiv`
+
+    void (\*glGetProgramiv)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetProgramInfoLog`
+
+    void (\*glGetProgramInfoLog)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetRenderbufferParameteriv`
+
+    void (\*glGetRenderbufferParameteriv)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetShaderiv`
+
+    void (\*glGetShaderiv)(SbGlUInt32 shader, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetShaderInfoLog`
+
+    void (\*glGetShaderInfoLog)(SbGlUInt32 shader, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlChar\* infoLog);
+*   ` glGetShaderPrecisionFormat`
+
+    void (\*glGetShaderPrecisionFormat)(SbGlEnum shadertype, SbGlEnum
+    precisiontype, SbGlInt32\* range, SbGlInt32\* precision);
+*   ` glGetShaderSource`
+
+    void (\*glGetShaderSource)(SbGlUInt32 shader, SbGlSizei bufSize, SbGlSizei\*
+    length, SbGlChar\* source);
+*   ` glGetString`
+
+    const SbGlUInt8\* (\*glGetString)(SbGlEnum name);
+*   ` glGetTexParameterfv`
+
+    void (\*glGetTexParameterfv)(SbGlEnum target, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetTexParameteriv`
+
+    void (\*glGetTexParameteriv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetUniformfv`
+
+    void (\*glGetUniformfv)(SbGlUInt32 program, SbGlInt32 location, SbGlFloat\*
+    params);
+*   ` glGetUniformiv`
+
+    void (\*glGetUniformiv)(SbGlUInt32 program, SbGlInt32 location, SbGlInt32\*
+    params);
+*   ` glGetUniformLocation`
+
+    SbGlInt32 (\*glGetUniformLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glGetVertexAttribfv`
+
+    void (\*glGetVertexAttribfv)(SbGlUInt32 index, SbGlEnum pname, SbGlFloat\*
+    params);
+*   ` glGetVertexAttribiv`
+
+    void (\*glGetVertexAttribiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribPointerv`
+
+    void (\*glGetVertexAttribPointerv)(SbGlUInt32 index, SbGlEnum pname,
+    void\*\* pointer);
+*   ` glHint`
+
+    void (\*glHint)(SbGlEnum target, SbGlEnum mode);
+*   ` glIsBuffer`
+
+    SbGlBoolean (\*glIsBuffer)(SbGlUInt32 buffer);
+*   ` glIsEnabled`
+
+    SbGlBoolean (\*glIsEnabled)(SbGlEnum cap);
+*   ` glIsFramebuffer`
+
+    SbGlBoolean (\*glIsFramebuffer)(SbGlUInt32 framebuffer);
+*   ` glIsProgram`
+
+    SbGlBoolean (\*glIsProgram)(SbGlUInt32 program);
+*   ` glIsRenderbuffer`
+
+    SbGlBoolean (\*glIsRenderbuffer)(SbGlUInt32 renderbuffer);
+*   ` glIsShader`
+
+    SbGlBoolean (\*glIsShader)(SbGlUInt32 shader);
+*   ` glIsTexture`
+
+    SbGlBoolean (\*glIsTexture)(SbGlUInt32 texture);
+*   ` glLineWidth`
+
+    void (\*glLineWidth)(SbGlFloat width);
+*   ` glLinkProgram`
+
+    void (\*glLinkProgram)(SbGlUInt32 program);
+*   ` glPixelStorei`
+
+    void (\*glPixelStorei)(SbGlEnum pname, SbGlInt32 param);
+*   ` glPolygonOffset`
+
+    void (\*glPolygonOffset)(SbGlFloat factor, SbGlFloat units);
+*   ` glReadPixels`
+
+    void (\*glReadPixels)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height, SbGlEnum format, SbGlEnum type, void\* pixels);
+*   ` glReleaseShaderCompiler`
+
+    void (\*glReleaseShaderCompiler)(void);
+*   ` glRenderbufferStorage`
+
+    void (\*glRenderbufferStorage)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlSizei width, SbGlSizei height);
+*   ` glSampleCoverage`
+
+    void (\*glSampleCoverage)(SbGlFloat value, SbGlBoolean invert);
+*   ` glScissor`
+
+    void (\*glScissor)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glShaderBinary`
+
+    void (\*glShaderBinary)(SbGlSizei count, const SbGlUInt32\* shaders,
+    SbGlEnum binaryformat, const void\* binary, SbGlSizei length);
+*   ` glShaderSource`
+
+    void (\*glShaderSource)(SbGlUInt32 shader, SbGlSizei count, const SbGlChar\*
+    const\* string, const SbGlInt32\* length);
+*   ` glStencilFunc`
+
+    void (\*glStencilFunc)(SbGlEnum func, SbGlInt32 ref, SbGlUInt32 mask);
+*   ` glStencilFuncSeparate`
+
+    void (\*glStencilFuncSeparate)(SbGlEnum face, SbGlEnum func, SbGlInt32 ref,
+    SbGlUInt32 mask);
+*   ` glStencilMask`
+
+    void (\*glStencilMask)(SbGlUInt32 mask);
+*   ` glStencilMaskSeparate`
+
+    void (\*glStencilMaskSeparate)(SbGlEnum face, SbGlUInt32 mask);
+*   ` glStencilOp`
+
+    void (\*glStencilOp)(SbGlEnum fail, SbGlEnum zfail, SbGlEnum zpass);
+*   ` glStencilOpSeparate`
+
+    void (\*glStencilOpSeparate)(SbGlEnum face, SbGlEnum sfail, SbGlEnum dpfail,
+    SbGlEnum dppass);
+*   ` glTexImage2D`
+
+    void (\*glTexImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlInt32 border,
+    SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexParameterf`
+
+    void (\*glTexParameterf)(SbGlEnum target, SbGlEnum pname, SbGlFloat param);
+*   ` glTexParameterfv`
+
+    void (\*glTexParameterfv)(SbGlEnum target, SbGlEnum pname, const SbGlFloat\*
+    params);
+*   ` glTexParameteri`
+
+    void (\*glTexParameteri)(SbGlEnum target, SbGlEnum pname, SbGlInt32 param);
+*   ` glTexParameteriv`
+
+    void (\*glTexParameteriv)(SbGlEnum target, SbGlEnum pname, const SbGlInt32\*
+    params);
+*   ` glTexSubImage2D`
+
+    void (\*glTexSubImage2D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlSizei width, SbGlSizei height, SbGlEnum
+    format, SbGlEnum type, const void\* pixels);
+*   ` glUniform1f`
+
+    void (\*glUniform1f)(SbGlInt32 location, SbGlFloat v0);
+*   ` glUniform1fv`
+
+    void (\*glUniform1fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform1i`
+
+    void (\*glUniform1i)(SbGlInt32 location, SbGlInt32 v0);
+*   ` glUniform1iv`
+
+    void (\*glUniform1iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform2f`
+
+    void (\*glUniform2f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1);
+*   ` glUniform2fv`
+
+    void (\*glUniform2fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform2i`
+
+    void (\*glUniform2i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1);
+*   ` glUniform2iv`
+
+    void (\*glUniform2iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform3f`
+
+    void (\*glUniform3f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2);
+*   ` glUniform3fv`
+
+    void (\*glUniform3fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform3i`
+
+    void (\*glUniform3i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2);
+*   ` glUniform3iv`
+
+    void (\*glUniform3iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniform4f`
+
+    void (\*glUniform4f)(SbGlInt32 location, SbGlFloat v0, SbGlFloat v1,
+    SbGlFloat v2, SbGlFloat v3);
+*   ` glUniform4fv`
+
+    void (\*glUniform4fv)(SbGlInt32 location, SbGlSizei count, const SbGlFloat\*
+    value);
+*   ` glUniform4i`
+
+    void (\*glUniform4i)(SbGlInt32 location, SbGlInt32 v0, SbGlInt32 v1,
+    SbGlInt32 v2, SbGlInt32 v3);
+*   ` glUniform4iv`
+
+    void (\*glUniform4iv)(SbGlInt32 location, SbGlSizei count, const SbGlInt32\*
+    value);
+*   ` glUniformMatrix2fv`
+
+    void (\*glUniformMatrix2fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3fv`
+
+    void (\*glUniformMatrix3fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4fv`
+
+    void (\*glUniformMatrix4fv)(SbGlInt32 location, SbGlSizei count, SbGlBoolean
+    transpose, const SbGlFloat\* value);
+*   ` glUseProgram`
+
+    void (\*glUseProgram)(SbGlUInt32 program);
+*   ` glValidateProgram`
+
+    void (\*glValidateProgram)(SbGlUInt32 program);
+*   ` glVertexAttrib1f`
+
+    void (\*glVertexAttrib1f)(SbGlUInt32 index, SbGlFloat x);
+*   ` glVertexAttrib1fv`
+
+    void (\*glVertexAttrib1fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib2f`
+
+    void (\*glVertexAttrib2f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y);
+*   ` glVertexAttrib2fv`
+
+    void (\*glVertexAttrib2fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib3f`
+
+    void (\*glVertexAttrib3f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z);
+*   ` glVertexAttrib3fv`
+
+    void (\*glVertexAttrib3fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttrib4f`
+
+    void (\*glVertexAttrib4f)(SbGlUInt32 index, SbGlFloat x, SbGlFloat y,
+    SbGlFloat z, SbGlFloat w);
+*   ` glVertexAttrib4fv`
+
+    void (\*glVertexAttrib4fv)(SbGlUInt32 index, const SbGlFloat\* v);
+*   ` glVertexAttribPointer`
+
+    void (\*glVertexAttribPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlBoolean normalized, SbGlSizei stride, const void\* pointer);
+*   ` glViewport`
+
+    void (\*glViewport)(SbGlInt32 x, SbGlInt32 y, SbGlSizei width, SbGlSizei
+    height);
+*   ` glReadBuffer`
+
+    void (\*glReadBuffer)(SbGlEnum src);
+*   ` glDrawRangeElements`
+
+    void (\*glDrawRangeElements)(SbGlEnum mode, SbGlUInt32 start, SbGlUInt32
+    end, SbGlSizei count, SbGlEnum type, const void\* indices);
+*   ` glTexImage3D`
+
+    void (\*glTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlEnum format, SbGlEnum type, const void\* pixels);
+*   ` glTexSubImage3D`
+
+    void (\*glTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width, SbGlSizei
+    height, SbGlSizei depth, SbGlEnum format, SbGlEnum type, const void\*
+    pixels);
+*   ` glCopyTexSubImage3D`
+
+    void (\*glCopyTexSubImage3D)(SbGlEnum target, SbGlInt32 level, SbGlInt32
+    xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glCompressedTexImage3D`
+
+    void (\*glCompressedTexImage3D)(SbGlEnum target, SbGlInt32 level, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth,
+    SbGlInt32 border, SbGlSizei imageSize, const void\* data);
+*   ` glCompressedTexSubImage3D`
+
+    void (\*glCompressedTexSubImage3D)(SbGlEnum target, SbGlInt32 level,
+    SbGlInt32 xoffset, SbGlInt32 yoffset, SbGlInt32 zoffset, SbGlSizei width,
+    SbGlSizei height, SbGlSizei depth, SbGlEnum format, SbGlSizei imageSize,
+    const void\* data);
+*   ` glGenQueries`
+
+    void (\*glGenQueries)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glDeleteQueries`
+
+    void (\*glDeleteQueries)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glIsQuery`
+
+    SbGlBoolean (\*glIsQuery)(SbGlUInt32 id);
+*   ` glBeginQuery`
+
+    void (\*glBeginQuery)(SbGlEnum target, SbGlUInt32 id);
+*   ` glEndQuery`
+
+    void (\*glEndQuery)(SbGlEnum target);
+*   ` glGetQueryiv`
+
+    void (\*glGetQueryiv)(SbGlEnum target, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetQueryObjectuiv`
+
+    void (\*glGetQueryObjectuiv)(SbGlUInt32 id, SbGlEnum pname, SbGlUInt32\*
+    params);
+*   ` glUnmapBuffer`
+
+    SbGlBoolean (\*glUnmapBuffer)(SbGlEnum target);
+*   ` glGetBufferPointerv`
+
+    void (\*glGetBufferPointerv)(SbGlEnum target, SbGlEnum pname, void\*\*
+    params);
+*   ` glDrawBuffers`
+
+    void (\*glDrawBuffers)(SbGlSizei n, const SbGlEnum\* bufs);
+*   ` glUniformMatrix2x3fv`
+
+    void (\*glUniformMatrix2x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x2fv`
+
+    void (\*glUniformMatrix3x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix2x4fv`
+
+    void (\*glUniformMatrix2x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x2fv`
+
+    void (\*glUniformMatrix4x2fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix3x4fv`
+
+    void (\*glUniformMatrix3x4fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glUniformMatrix4x3fv`
+
+    void (\*glUniformMatrix4x3fv)(SbGlInt32 location, SbGlSizei count,
+    SbGlBoolean transpose, const SbGlFloat\* value);
+*   ` glBlitFramebuffer`
+
+    void (\*glBlitFramebuffer)(SbGlInt32 srcX0, SbGlInt32 srcY0, SbGlInt32
+    srcX1, SbGlInt32 srcY1, SbGlInt32 dstX0, SbGlInt32 dstY0, SbGlInt32 dstX1,
+    SbGlInt32 dstY1, SbGlBitfield mask, SbGlEnum filter);
+*   ` glRenderbufferStorageMultisample`
+
+    void (\*glRenderbufferStorageMultisample)(SbGlEnum target, SbGlSizei
+    samples, SbGlEnum internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glFramebufferTextureLayer`
+
+    void (\*glFramebufferTextureLayer)(SbGlEnum target, SbGlEnum attachment,
+    SbGlUInt32 texture, SbGlInt32 level, SbGlInt32 layer);
+*   ` glMapBufferRange`
+
+    void\* (\*glMapBufferRange)(SbGlEnum target, SbGlIntPtr offset, SbGlSizeiPtr
+    length, SbGlBitfield access);
+*   ` glFlushMappedBufferRange`
+
+    void (\*glFlushMappedBufferRange)(SbGlEnum target, SbGlIntPtr offset,
+    SbGlSizeiPtr length);
+*   ` glBindVertexArray`
+
+    void (\*glBindVertexArray)(SbGlUInt32 array);
+*   ` glDeleteVertexArrays`
+
+    void (\*glDeleteVertexArrays)(SbGlSizei n, const SbGlUInt32\* arrays);
+*   ` glGenVertexArrays`
+
+    void (\*glGenVertexArrays)(SbGlSizei n, SbGlUInt32\* arrays);
+*   ` glIsVertexArray`
+
+    SbGlBoolean (\*glIsVertexArray)(SbGlUInt32 array);
+*   ` glGetIntegeri_v`
+
+    void (\*glGetIntegeri_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt32\*
+    data);
+*   ` glBeginTransformFeedback`
+
+    void (\*glBeginTransformFeedback)(SbGlEnum primitiveMode);
+*   ` glEndTransformFeedback`
+
+    void (\*glEndTransformFeedback)(void);
+*   ` glBindBufferRange`
+
+    void (\*glBindBufferRange)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer, SbGlIntPtr offset, SbGlSizeiPtr size);
+*   ` glBindBufferBase`
+
+    void (\*glBindBufferBase)(SbGlEnum target, SbGlUInt32 index, SbGlUInt32
+    buffer);
+*   ` glTransformFeedbackVaryings`
+
+    void (\*glTransformFeedbackVaryings)(SbGlUInt32 program, SbGlSizei count,
+    const SbGlChar\* const\* varyings, SbGlEnum bufferMode);
+*   ` glGetTransformFeedbackVarying`
+
+    void (\*glGetTransformFeedbackVarying)(SbGlUInt32 program, SbGlUInt32 index,
+    SbGlSizei bufSize, SbGlSizei\* length, SbGlSizei\* size, SbGlEnum\* type,
+    SbGlChar\* name);
+*   ` glVertexAttribIPointer`
+
+    void (\*glVertexAttribIPointer)(SbGlUInt32 index, SbGlInt32 size, SbGlEnum
+    type, SbGlSizei stride, const void\* pointer);
+*   ` glGetVertexAttribIiv`
+
+    void (\*glGetVertexAttribIiv)(SbGlUInt32 index, SbGlEnum pname, SbGlInt32\*
+    params);
+*   ` glGetVertexAttribIuiv`
+
+    void (\*glGetVertexAttribIuiv)(SbGlUInt32 index, SbGlEnum pname,
+    SbGlUInt32\* params);
+*   ` glVertexAttribI4i`
+
+    void (\*glVertexAttribI4i)(SbGlUInt32 index, SbGlInt32 x, SbGlInt32 y,
+    SbGlInt32 z, SbGlInt32 w);
+*   ` glVertexAttribI4ui`
+
+    void (\*glVertexAttribI4ui)(SbGlUInt32 index, SbGlUInt32 x, SbGlUInt32 y,
+    SbGlUInt32 z, SbGlUInt32 w);
+*   ` glVertexAttribI4iv`
+
+    void (\*glVertexAttribI4iv)(SbGlUInt32 index, const SbGlInt32\* v);
+*   ` glVertexAttribI4uiv`
+
+    void (\*glVertexAttribI4uiv)(SbGlUInt32 index, const SbGlUInt32\* v);
+*   ` glGetUniformuiv`
+
+    void (\*glGetUniformuiv)(SbGlUInt32 program, SbGlInt32 location,
+    SbGlUInt32\* params);
+*   ` glGetFragDataLocation`
+
+    SbGlInt32 (\*glGetFragDataLocation)(SbGlUInt32 program, const SbGlChar\*
+    name);
+*   ` glUniform1ui`
+
+    void (\*glUniform1ui)(SbGlInt32 location, SbGlUInt32 v0);
+*   ` glUniform2ui`
+
+    void (\*glUniform2ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1);
+*   ` glUniform3ui`
+
+    void (\*glUniform3ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2);
+*   ` glUniform4ui`
+
+    void (\*glUniform4ui)(SbGlInt32 location, SbGlUInt32 v0, SbGlUInt32 v1,
+    SbGlUInt32 v2, SbGlUInt32 v3);
+*   ` glUniform1uiv`
+
+    void (\*glUniform1uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform2uiv`
+
+    void (\*glUniform2uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform3uiv`
+
+    void (\*glUniform3uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glUniform4uiv`
+
+    void (\*glUniform4uiv)(SbGlInt32 location, SbGlSizei count, const
+    SbGlUInt32\* value);
+*   ` glClearBufferiv`
+
+    void (\*glClearBufferiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlInt32\* value);
+*   ` glClearBufferuiv`
+
+    void (\*glClearBufferuiv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlUInt32\* value);
+*   ` glClearBufferfv`
+
+    void (\*glClearBufferfv)(SbGlEnum buffer, SbGlInt32 drawbuffer, const
+    SbGlFloat\* value);
+*   ` glClearBufferfi`
+
+    void (\*glClearBufferfi)(SbGlEnum buffer, SbGlInt32 drawbuffer, SbGlFloat
+    depth, SbGlInt32 stencil);
+*   ` glGetStringi`
+
+    const SbGlUInt8\* (\*glGetStringi)(SbGlEnum name, SbGlUInt32 index);
+*   ` glCopyBufferSubData`
+
+    void (\*glCopyBufferSubData)(SbGlEnum readTarget, SbGlEnum writeTarget,
+    SbGlIntPtr readOffset, SbGlIntPtr writeOffset, SbGlSizeiPtr size);
+*   ` glGetUniformIndices`
+
+    void (\*glGetUniformIndices)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlChar\* const\* uniformNames, SbGlUInt32\* uniformIndices);
+*   ` glGetActiveUniformsiv`
+
+    void (\*glGetActiveUniformsiv)(SbGlUInt32 program, SbGlSizei uniformCount,
+    const SbGlUInt32\* uniformIndices, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetUniformBlockIndex`
+
+    SbGlUInt32 (\*glGetUniformBlockIndex)(SbGlUInt32 program, const SbGlChar\*
+    uniformBlockName);
+*   ` glGetActiveUniformBlockiv`
+
+    void (\*glGetActiveUniformBlockiv)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlEnum pname, SbGlInt32\* params);
+*   ` glGetActiveUniformBlockName`
+
+    void (\*glGetActiveUniformBlockName)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlSizei bufSize, SbGlSizei\* length, SbGlChar\*
+    uniformBlockName);
+*   ` glUniformBlockBinding`
+
+    void (\*glUniformBlockBinding)(SbGlUInt32 program, SbGlUInt32
+    uniformBlockIndex, SbGlUInt32 uniformBlockBinding);
+*   ` glDrawArraysInstanced`
+
+    void (\*glDrawArraysInstanced)(SbGlEnum mode, SbGlInt32 first, SbGlSizei
+    count, SbGlSizei instancecount);
+*   ` glDrawElementsInstanced`
+
+    void (\*glDrawElementsInstanced)(SbGlEnum mode, SbGlSizei count, SbGlEnum
+    type, const void\* indices, SbGlSizei instancecount);
+*   ` glFenceSync`
+
+    SbGlSync (\*glFenceSync)(SbGlEnum condition, SbGlBitfield flags);
+*   ` glIsSync`
+
+    SbGlBoolean (\*glIsSync)(SbGlSync sync);
+*   ` glDeleteSync`
+
+    void (\*glDeleteSync)(SbGlSync sync);
+*   ` glClientWaitSync`
+
+    SbGlEnum (\*glClientWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64
+    timeout);
+*   ` glWaitSync`
+
+    void (\*glWaitSync)(SbGlSync sync, SbGlBitfield flags, SbGlUInt64 timeout);
+*   ` glGetInteger64v`
+
+    void (\*glGetInteger64v)(SbGlEnum pname, SbGlInt64\* data);
+*   ` glGetSynciv`
+
+    void (\*glGetSynciv)(SbGlSync sync, SbGlEnum pname, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlInt32\* values);
+*   ` glGetInteger64i_v`
+
+    void (\*glGetInteger64i_v)(SbGlEnum target, SbGlUInt32 index, SbGlInt64\*
+    data);
+*   ` glGetBufferParameteri64v`
+
+    void (\*glGetBufferParameteri64v)(SbGlEnum target, SbGlEnum pname,
+    SbGlInt64\* params);
+*   ` glGenSamplers`
+
+    void (\*glGenSamplers)(SbGlSizei count, SbGlUInt32\* samplers);
+*   ` glDeleteSamplers`
+
+    void (\*glDeleteSamplers)(SbGlSizei count, const SbGlUInt32\* samplers);
+*   ` glIsSampler`
+
+    SbGlBoolean (\*glIsSampler)(SbGlUInt32 sampler);
+*   ` glBindSampler`
+
+    void (\*glBindSampler)(SbGlUInt32 unit, SbGlUInt32 sampler);
+*   ` glSamplerParameteri`
+
+    void (\*glSamplerParameteri)(SbGlUInt32 sampler, SbGlEnum pname, SbGlInt32
+    param);
+*   ` glSamplerParameteriv`
+
+    void (\*glSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlInt32\* param);
+*   ` glSamplerParameterf`
+
+    void (\*glSamplerParameterf)(SbGlUInt32 sampler, SbGlEnum pname, SbGlFloat
+    param);
+*   ` glSamplerParameterfv`
+
+    void (\*glSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname, const
+    SbGlFloat\* param);
+*   ` glGetSamplerParameteriv`
+
+    void (\*glGetSamplerParameteriv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlInt32\* params);
+*   ` glGetSamplerParameterfv`
+
+    void (\*glGetSamplerParameterfv)(SbGlUInt32 sampler, SbGlEnum pname,
+    SbGlFloat\* params);
+*   ` glVertexAttribDivisor`
+
+    void (\*glVertexAttribDivisor)(SbGlUInt32 index, SbGlUInt32 divisor);
+*   ` glBindTransformFeedback`
+
+    void (\*glBindTransformFeedback)(SbGlEnum target, SbGlUInt32 id);
+*   ` glDeleteTransformFeedbacks`
+
+    void (\*glDeleteTransformFeedbacks)(SbGlSizei n, const SbGlUInt32\* ids);
+*   ` glGenTransformFeedbacks`
+
+    void (\*glGenTransformFeedbacks)(SbGlSizei n, SbGlUInt32\* ids);
+*   ` glIsTransformFeedback`
+
+    SbGlBoolean (\*glIsTransformFeedback)(SbGlUInt32 id);
+*   ` glPauseTransformFeedback`
+
+    void (\*glPauseTransformFeedback)(void);
+*   ` glResumeTransformFeedback`
+
+    void (\*glResumeTransformFeedback)(void);
+*   ` glGetProgramBinary`
+
+    void (\*glGetProgramBinary)(SbGlUInt32 program, SbGlSizei bufSize,
+    SbGlSizei\* length, SbGlEnum\* binaryFormat, void\* binary);
+*   ` glProgramBinary`
+
+    void (\*glProgramBinary)(SbGlUInt32 program, SbGlEnum binaryFormat, const
+    void\* binary, SbGlSizei length);
+*   ` glProgramParameteri`
+
+    void (\*glProgramParameteri)(SbGlUInt32 program, SbGlEnum pname, SbGlInt32
+    value);
+*   ` glInvalidateFramebuffer`
+
+    void (\*glInvalidateFramebuffer)(SbGlEnum target, SbGlSizei numAttachments,
+    const SbGlEnum\* attachments);
+*   ` glInvalidateSubFramebuffer`
+
+    void (\*glInvalidateSubFramebuffer)(SbGlEnum target, SbGlSizei
+    numAttachments, const SbGlEnum\* attachments, SbGlInt32 x, SbGlInt32 y,
+    SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage2D`
+
+    void (\*glTexStorage2D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height);
+*   ` glTexStorage3D`
+
+    void (\*glTexStorage3D)(SbGlEnum target, SbGlSizei levels, SbGlEnum
+    internalformat, SbGlSizei width, SbGlSizei height, SbGlSizei depth);
+*   ` glGetInternalformativ`
+
+    void (\*glGetInternalformativ)(SbGlEnum target, SbGlEnum internalformat,
+    SbGlEnum pname, SbGlSizei bufSize, SbGlInt32\* params);
 
diff --git a/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md b/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
index 2239e79..a9fb339 100644
--- a/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
+++ b/src/cobalt/site/docs/reference/starboard/modules/ui_navigation.md
@@ -66,13 +66,19 @@
 
 #### Members ####
 
-*   `void(* onblur`
+*   ` onblur`
+
+    void (\*onblur)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item has lost focus. This is only used with focus items.
-*   `void(* onfocus`
+*   ` onfocus`
+
+    void (\*onfocus)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item has gained focus. This is only used with focus items.
-*   `void(* onscroll`
+*   ` onscroll`
+
+    void (\*onscroll)(SbUiNavItem item, void\* callback_context);
 
     Invoke when an item's content offset is changed. This is only used with
     container items.
@@ -84,24 +90,33 @@
 
 #### Members ####
 
-*   `SbUiNavItem(* create_item`
+*   ` create_item`
+
+    SbUiNavItem (\*create_item)(SbUiNavItemType type, const SbUiNavCallbacks \*
+    callbacks, void\* callback_context);
 
     Create a new navigation item. When the user interacts with this item the
     appropriate SbUiNavCallbacks function will be invoked with the provided
     `callback_context`. An item is not interactable until it is enabled.
-*   `void(* destroy_item`
+*   ` destroy_item`
+
+    void (\*destroy_item)(SbUiNavItem item);
 
     Destroy the given navigation item. If this is a content of another item,
     then it will first be unregistered. Additionally, if this item contains
     other items, then those will be unregistered as well, but they will not be
     automatically destroyed.
-*   `void(* set_focus`
+*   ` set_focus`
+
+    void (\*set_focus)(SbUiNavItem item);
 
     This is used to manually force focus on a navigation item of type
     kSbUiNavItemTypeFocus. Any previously focused navigation item should receive
     the blur event. If the item is not transitively a content of the root item,
     then this does nothing.
-*   `void(* set_item_enabled`
+*   ` set_item_enabled`
+
+    void (\*set_item_enabled)(SbUiNavItem item, bool enabled);
 
     This is used to enable or disable user interaction with the specified
     navigation item. All navigation items are disabled when created, and they
@@ -110,23 +125,33 @@
     remain enabled. If `enabled` is false, it must be guaranteed that once this
     function returns, no callbacks associated with this item will be invoked
     until the item is re-enabled.
-*   `void(* set_item_dir`
+*   ` set_item_dir`
+
+    void (\*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir);
 
     This specifies directionality for container items. Containers within
     containers do not inherit directionality. Directionality must be specified
     for each container explicitly.
-*   `void(* set_item_size`
+*   ` set_item_size`
+
+    void (\*set_item_size)(SbUiNavItem item, float width, float height);
 
     Set the interactable size of the specified navigation item. By default, an
     item's size is (0,0).
-*   `void(* set_item_transform`
+*   ` set_item_transform`
+
+    void (\*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3 \*
+    transform);
 
     Set the transform for the navigation item and its contents if the item is a
     container. This specifies the placement of the item's center within its
     container. The transform origin is the center of the item. Distance is
     measured in pixels with the origin being the top-left of the item's
     container. By default, an item's transform is identity.
-*   `bool(* get_item_focus_transform`
+*   ` get_item_focus_transform`
+
+    bool (\*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4 \*
+    out_transform);
 
     Retrieve the focus transform matrix for the navigation item. The UI engine
     may translate, rotate, and/or tilt focus items to reflect user interaction.
@@ -134,7 +159,10 @@
     position inside its container. The transform origin is the center of the
     item. Return false if the item position should not be changed (i.e. the
     transform should be treated as identity).
-*   `bool(* get_item_focus_vector`
+*   ` get_item_focus_vector`
+
+    bool (\*get_item_focus_vector)(SbUiNavItem item, float\* out_x, float\*
+    out_y);
 
     Retrieve a vector representing the focus location within a focused item.
     This is used to provide feedback about user input that is too small to
@@ -143,7 +171,9 @@
     return true and set the output values in the range of [-1, +1] with (out_x,
     out_y) of (-1, -1) being the top-left corner of the navigation item and (0,
     0) being the center.
-*   `void(* set_item_container_window`
+*   ` set_item_container_window`
+
+    void (\*set_item_container_window)(SbUiNavItem item, SbWindow window);
 
     This attaches the given navigation item (which must be a container) to the
     specified window. Navigation items are only interactable if they are
@@ -161,7 +191,9 @@
     `window` is kSbWindowInvalid, then this will unregister the `item` from its
     current window if any. Upon destruction of `item` or `window`, the `item` is
     automatically unregistered from the `window`.
-*   `void(* set_item_container_item`
+*   ` set_item_container_item`
+
+    void (\*set_item_container_item)(SbUiNavItem item, SbUiNavItem container);
 
     A container navigation item may contain other navigation items. However, it
     is an error to have circular containment or for `container` to not be of
@@ -178,14 +210,17 @@
     For example, consider item A with position (5,5) and content offset (0,0).
     Given item B with position (10,10) is registered as a content of item A.
 
-    1.  Item B should be drawn at position (15,15).
+    1) Item B should be drawn at position (15,15).
 
-    1.  If item A's content offset is changed to (10,0), then item B should be
-        drawn at position (5,15).
+    2) If item A's content offset is changed to (10,0), then item B should be
+    drawn at position (5,15).
 
     Essentially, content items should be drawn at: [container position] +
     [content position] - [container content offset]
-*   `void(* set_item_content_offset`
+*   ` set_item_content_offset`
+
+    void (\*set_item_content_offset)(SbUiNavItem item, float content_offset_x,
+    float content_offset_y);
 
     Set the current content offset for the given container. This may be used to
     force scrolling to make certain content items visible. A container item's
@@ -193,7 +228,10 @@
     Essentially, a content item should be drawn at: [container position] +
     [content position] - [container content offset] If `item` is not a
     container, then this does nothing. By default, the content offset is (0,0).
-*   `void(* get_item_content_offset`
+*   ` get_item_content_offset`
+
+    void (\*get_item_content_offset)(SbUiNavItem item, float\*
+    out_content_offset_x, float\* out_content_offset_y);
 
     Retrieve the current content offset for the navigation item. If `item` is
     not a container, then the content offset is (0,0).
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc
index e8403e9..c906141 100644
--- a/src/cobalt/updater/updater_module.cc
+++ b/src/cobalt/updater/updater_module.cc
@@ -38,7 +38,6 @@
 #include "components/crx_file/crx_verifier.h"
 #include "components/update_client/utils.h"
 #include "starboard/configuration_constants.h"
-#include "starboard/loader_app/installation_manager.h"
 
 namespace {
 
diff --git a/src/cobalt/updater/util.cc b/src/cobalt/updater/util.cc
index eb7fc9a..6dc16d4 100644
--- a/src/cobalt/updater/util.cc
+++ b/src/cobalt/updater/util.cc
@@ -16,7 +16,6 @@
 #include "cobalt/extension/installation_manager.h"
 #include "components/update_client/utils.h"
 #include "starboard/configuration_constants.h"
-#include "starboard/loader_app/installation_manager.h"
 #include "starboard/system.h"
 
 #define PRODUCT_FULLNAME_STRING "cobalt_updater"
@@ -83,8 +82,8 @@
     return "";
   }
   std::vector<char> installation_path(kSbFileMaxPath);
-  if (installation_manager->GetInstallationPath(index, installation_path.data(),
-                                                kSbFileMaxPath) == IM_ERROR) {
+  if (installation_manager->GetInstallationPath(
+          index, installation_path.data(), kSbFileMaxPath) == IM_EXT_ERROR) {
     SB_LOG(ERROR) << "Failed to get installation path.";
     return "";
   }
diff --git a/src/glimp/entry_points/gles_2_0.cc b/src/glimp/entry_points/gles_2_0.cc
index a8b8dcc..57c37bd 100644
--- a/src/glimp/entry_points/gles_2_0.cc
+++ b/src/glimp/entry_points/gles_2_0.cc
@@ -478,6 +478,15 @@
   return context->FrontFace(face);
 }
 
+void GL_APIENTRY glGenBuffersForVideoFrame(GLsizei n, GLuint* buffers) {
+  gles::Context* context = GetCurrentContext();
+  if (!context) {
+    return;
+  }
+
+  return context->GenBuffersForVideoFrame(n, buffers);
+}
+
 void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers) {
   gles::Context* context = GetCurrentContext();
   if (!context) {
diff --git a/src/glimp/gles/context.cc b/src/glimp/gles/context.cc
index 3ba24e1..616072c 100644
--- a/src/glimp/gles/context.cc
+++ b/src/glimp/gles/context.cc
@@ -698,6 +698,22 @@
   }
 }
 
+void Context::GenBuffersForVideoFrame(GLsizei n, GLuint* buffers) {
+  GLIMP_TRACE_EVENT0(__FUNCTION__);
+  if (n < 0) {
+    SetError(GL_INVALID_VALUE);
+    return;
+  }
+
+  for (GLsizei i = 0; i < n; ++i) {
+    nb::scoped_ptr<BufferImpl> buffer_impl = impl_->CreateBufferForVideoFrame();
+    SB_DCHECK(buffer_impl);
+
+    buffers[i] = resource_manager_->RegisterBuffer(
+        nb::make_scoped_refptr(new Buffer(buffer_impl.Pass())));
+  }
+}
+
 void Context::FrontFace(GLenum mode) {
   GLIMP_TRACE_EVENT0(__FUNCTION__);
   if ((mode != GL_CW) && (mode != GL_CCW)) {
diff --git a/src/glimp/gles/context.h b/src/glimp/gles/context.h
index 6ff3a7a..8af4425 100644
--- a/src/glimp/gles/context.h
+++ b/src/glimp/gles/context.h
@@ -115,6 +115,7 @@
   void CompileShader(GLuint shader);
 
   void GenBuffers(GLsizei n, GLuint* buffers);
+  void GenBuffersForVideoFrame(GLsizei n, GLuint* buffers);
   void DeleteBuffers(GLsizei n, const GLuint* buffers);
   void BindBuffer(GLenum target, GLuint buffer);
   void BufferData(GLenum target,
diff --git a/src/glimp/gles/context_impl.h b/src/glimp/gles/context_impl.h
index 7d461ce..2eab9e5 100644
--- a/src/glimp/gles/context_impl.h
+++ b/src/glimp/gles/context_impl.h
@@ -115,6 +115,10 @@
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffers.xml
   virtual nb::scoped_ptr<BufferImpl> CreateBuffer() = 0;
 
+  // Called via glGenBuffersForVideoFrame(). Must create a platform-specific
+  // BufferImpl object representing a buffer for compressed textures.
+  virtual nb::scoped_ptr<BufferImpl> CreateBufferForVideoFrame() = 0;
+
   // Called via glGenTextures().  Must create a platform-specific TextureImpl
   // object representing a texture.
   //   https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenTextures.xml
diff --git a/src/glimp/include/GLES2/gl2.h b/src/glimp/include/GLES2/gl2.h
index 474c848..a644428 100644
--- a/src/glimp/include/GLES2/gl2.h
+++ b/src/glimp/include/GLES2/gl2.h
@@ -887,6 +887,8 @@
                                                    GLint level);
 GL_APICALL void GL_APIENTRY glFrontFace(GLenum mode);
 GL_APICALL void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers);
+GL_APICALL void GL_APIENTRY glGenBuffersForVideoFrame(GLsizei n,
+                                                      GLuint* buffers);
 GL_APICALL void GL_APIENTRY glGenerateMipmap(GLenum target);
 GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers);
 GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n,
diff --git a/src/net/net.gyp b/src/net/net.gyp
index c73aa2b..d140fd9 100644
--- a/src/net/net.gyp
+++ b/src/net/net.gyp
@@ -2178,6 +2178,7 @@
         'test/embedded_test_server/embedded_test_server_unittest.cc',
         'test/embedded_test_server/http_request_unittest.cc',
         'test/embedded_test_server/http_response_unittest.cc',
+        'test/run_all_unittests.cc',
         'test/tcp_socket_proxy_unittest.cc',
 
         'third_party/nist-pkits/pkits_testcases-inl.h',
@@ -2722,7 +2723,6 @@
         'test/net_test_suite.h',
         'test/quic_simple_test_server.cc',
         'test/quic_simple_test_server.h',
-        'test/run_all_unittests.cc',
         'test/scoped_disable_exit_on_dfatal.cc',
         'test/scoped_disable_exit_on_dfatal.h',
         'test/tcp_socket_proxy.cc',
diff --git a/src/net/socket/udp_socket_starboard.cc b/src/net/socket/udp_socket_starboard.cc
index 369cf68..bc319af 100644
--- a/src/net/socket/udp_socket_starboard.cc
+++ b/src/net/socket/udp_socket_starboard.cc
@@ -45,8 +45,6 @@
       socket_(kSbSocketInvalid),
       socket_options_(0),
       bind_type_(bind_type),
-      read_watcher_(this),
-      write_watcher_(this),
       read_buf_len_(0),
       recv_from_address_(NULL),
       write_buf_len_(0),
@@ -93,9 +91,7 @@
   write_callback_.Reset();
   send_to_address_.reset();
 
-  bool ok = read_socket_watcher_.StopWatchingSocket();
-  DCHECK(ok);
-  ok = write_socket_watcher_.StopWatchingSocket();
+  bool ok = socket_watcher_.StopWatchingSocket();
   DCHECK(ok);
 
   is_connected_ = false;
@@ -160,7 +156,7 @@
 
   if (!base::MessageLoopForIO::current()->Watch(
           socket_, true, base::MessageLoopCurrentForIO::WATCH_READ,
-          &read_socket_watcher_, &read_watcher_)) {
+          &socket_watcher_, this)) {
     PLOG(ERROR) << "WatchSocket failed on read";
     Error result = MapLastSocketError(socket_);
     if (result == ERR_IO_PENDING) {
@@ -212,7 +208,7 @@
 
   if (!base::MessageLoopForIO::current()->Watch(
           socket_, true, base::MessageLoopCurrentForIO::WATCH_WRITE,
-          &write_socket_watcher_, &write_watcher_)) {
+          &socket_watcher_, this)) {
     DVLOG(1) << "Watch failed on write, error "
              << SbSocketGetLastError(socket_);
     Error result = MapLastSocketError(socket_);
@@ -324,15 +320,19 @@
   return SbSocketSetBroadcast(socket_, broadcast) ? OK : ERR_FAILED;
 }
 
-void UDPSocketStarboard::ReadWatcher::OnSocketReadyToRead(SbSocket /*socket*/) {
-  if (!socket_->read_callback_.is_null())
-    socket_->DidCompleteRead();
+void UDPSocketStarboard::OnSocketReadyToRead(SbSocket /*socket*/) {
+  if (!read_callback_.is_null())
+    DidCompleteRead();
 }
 
-void UDPSocketStarboard::WriteWatcher::OnSocketReadyToWrite(
-    SbSocket /*socket*/) {
-  if (!socket_->write_callback_.is_null())
-    socket_->DidCompleteWrite();
+void UDPSocketStarboard::OnSocketReadyToWrite(SbSocket socket) {
+  if (write_async_watcher_->watching()) {
+    write_async_watcher_->OnSocketReadyToWrite(socket);
+    return;
+  }
+
+  if (!write_callback_.is_null())
+    DidCompleteWrite();
 }
 
 void UDPSocketStarboard::WriteAsyncWatcher::OnSocketReadyToWrite(
@@ -367,8 +367,7 @@
     read_buf_ = NULL;
     read_buf_len_ = 0;
     recv_from_address_ = NULL;
-    bool ok = read_socket_watcher_.StopWatchingSocket();
-    DCHECK(ok);
+    InternalStopWatchingSocket();
     DoReadCallback(result);
   }
 }
@@ -399,7 +398,7 @@
     write_buf_ = NULL;
     write_buf_len_ = 0;
     send_to_address_.reset();
-    write_socket_watcher_.StopWatchingSocket();
+    InternalStopWatchingSocket();
     DoWriteCallback(result);
   }
 }
@@ -828,7 +827,7 @@
 }
 
 void UDPSocketStarboard::StopWatchingSocket() {
-  if (!write_async_watcher_->watching())
+  if (!read_buf_ && !write_buf_ && !write_async_watcher_->watching())
     return;
   InternalStopWatchingSocket();
   write_async_watcher_->set_watching(false);
@@ -837,11 +836,11 @@
 bool UDPSocketStarboard::InternalWatchSocket() {
   return base::MessageLoopForIO::current()->Watch(
       socket_, true, base::MessageLoopCurrentForIO::WATCH_WRITE,
-      &write_socket_watcher_, write_async_watcher_.get());
+      &socket_watcher_, this);
 }
 
 void UDPSocketStarboard::InternalStopWatchingSocket() {
-  bool ok = write_socket_watcher_.StopWatchingSocket();
+  bool ok = socket_watcher_.StopWatchingSocket();
   DCHECK(ok);
 }
 
diff --git a/src/net/socket/udp_socket_starboard.h b/src/net/socket/udp_socket_starboard.h
index 856a422..87dd456 100644
--- a/src/net/socket/udp_socket_starboard.h
+++ b/src/net/socket/udp_socket_starboard.h
@@ -98,7 +98,8 @@
   UDPSocketStarboardSender& operator=(const UDPSocketStarboardSender&) = delete;
 };
 
-class NET_EXPORT UDPSocketStarboard {
+class NET_EXPORT UDPSocketStarboard
+    : public base::MessageLoopCurrentForIO::Watcher {
  public:
   UDPSocketStarboard(DatagramSocket::BindType bind_type,
                      net::NetLog* net_log,
@@ -349,35 +350,9 @@
   DatagramBuffers pending_writes_;
 
  private:
-  class ReadWatcher : public base::MessageLoopCurrentForIO::Watcher {
-   public:
-    explicit ReadWatcher(UDPSocketStarboard* socket) : socket_(socket) {}
-
-    // MessageLoopCurrentForIO::Watcher methods
-
-    void OnSocketReadyToRead(SbSocket socket) override;
-    void OnSocketReadyToWrite(SbSocket socket) override{};
-
-   private:
-    UDPSocketStarboard* const socket_;
-
-    DISALLOW_COPY_AND_ASSIGN(ReadWatcher);
-  };
-
-  class WriteWatcher : public base::MessageLoopCurrentForIO::Watcher {
-   public:
-    explicit WriteWatcher(UDPSocketStarboard* socket) : socket_(socket) {}
-
-    // MessageLoopCurrentForIO::Watcher methods
-
-    void OnSocketReadyToRead(SbSocket socket) override{};
-    void OnSocketReadyToWrite(SbSocket socket) override;
-
-   private:
-    UDPSocketStarboard* const socket_;
-
-    DISALLOW_COPY_AND_ASSIGN(WriteWatcher);
-  };
+  // MessageLoopCurrentForIO::Watcher implementation.
+  void OnSocketReadyToRead(SbSocket socket) override;
+  void OnSocketReadyToWrite(SbSocket socket) override;
 
   int InternalWriteAsync(CompletionOnceCallback callback,
                          const NetworkTrafficAnnotationTag& traffic_annotation);
@@ -442,12 +417,7 @@
   mutable std::unique_ptr<IPEndPoint> remote_address_;
 
   // The socket's SbSocketWaiter wrappers
-  base::MessageLoopCurrentForIO::SocketWatcher read_socket_watcher_;
-  base::MessageLoopCurrentForIO::SocketWatcher write_socket_watcher_;
-
-  // The corresponding watchers for reads and writes.
-  ReadWatcher read_watcher_;
-  WriteWatcher write_watcher_;
+  base::MessageLoopCurrentForIO::SocketWatcher socket_watcher_;
 
   // Various bits to support |WriteAsync()|.
   bool write_async_enabled_ = false;
diff --git a/src/net/test/run_all_unittests.cc b/src/net/test/run_all_unittests.cc
index 2014fbf..51296a1 100644
--- a/src/net/test/run_all_unittests.cc
+++ b/src/net/test/run_all_unittests.cc
@@ -20,12 +20,26 @@
 
 using net::internal::ClientSocketPoolBaseHelper;
 
+#if defined(STARBOARD)
+
+int TestSuiteRun(int argc, char** argv) {
+  // set_connect_backup_jobs_enabled(false) below disables backup transport
+  // layer connection which is turned on by default. The backup transport layer
+  // connection sends new connection if certain amount of time has passed
+  // without ACK being received. Some net_unittests have assumption for the
+  // lack of this feature.
+  ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
+  base::AtExitManager exit_manager;
+  return NetTestSuite(argc, argv).Run();
+}
+
+STARBOARD_WRAP_SIMPLE_MAIN(TestSuiteRun);
+
+#else
+
 namespace {
 
 bool VerifyBuildIsTimely() {
-#ifdef STARBOARD
-  return true;
-#else
   // This lines up with various //net security features, like Certificate
   // Transparency or HPKP, in that they require the build time be less than 70
   // days old. Moreover, operating on the assumption that tests are run against
@@ -51,25 +65,10 @@
       << build_time.ToInternalValue() << ")\n";
 
   return false;
-#endif
 }
 
 }  // namespace
 
-#if defined(STARBOARD)
-int TestSuiteRun(int argc, char** argv) {
-  // set_connect_backup_jobs_enabled(false) below disables backup transport
-  // layer connection which is turned on by default. The backup transport layer
-  // connection sends new connection if certain amount of time has passed
-  // without ACK being received. Some net_unittests have assumption for the
-  // lack of this feature.
-  ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
-  base::AtExitManager exit_manager;
-  return NetTestSuite(argc, argv).Run();
-}
-
-STARBOARD_WRAP_SIMPLE_MAIN(TestSuiteRun);
-#else
 int main(int argc, char** argv) {
   if (!VerifyBuildIsTimely())
     return 1;
@@ -81,4 +80,5 @@
       argc, argv, base::Bind(&NetTestSuite::Run,
                              base::Unretained(&test_suite)));
 }
+
 #endif
diff --git a/src/starboard/configuration.h b/src/starboard/configuration.h
index a4b834b..98a80c9 100644
--- a/src/starboard/configuration.h
+++ b/src/starboard/configuration.h
@@ -958,6 +958,12 @@
 "'starboard/blitter.h' are deprecated."
 #endif  // Deprecate Blitter API
 
+#if SB_API_VERSION >= 12 && SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
+#error \
+    "SB_HAS_QUIRK_SEEK_TO_KEYFRAME is deprecated in Starboard 12 or later." \
+         " Please see configuration-public.md for more details."
+#endif  // SB_API_VERSION >= 12 && SB_HAS_QUIRK(SEEK_TO_KEYFRAME)
+
 // --- Derived Configuration -------------------------------------------------
 
 #if SB_API_VERSION < 12
diff --git a/src/starboard/evergreen/arm/shared/cobalt/configuration.py b/src/starboard/evergreen/arm/shared/cobalt/configuration.py
index 0d71086..9f4af82 100644
--- a/src/starboard/evergreen/arm/shared/cobalt/configuration.py
+++ b/src/starboard/evergreen/arm/shared/cobalt/configuration.py
@@ -74,9 +74,7 @@
     }
 
   __FILTERED_TESTS = {
-      'base_unittests': [test_filter.FILTER_ALL],
       'bindings_test': ['DateBindingsTest.PosixEpoch'],
-      'net_unittests': [test_filter.FILTER_ALL],
       'renderer_test': [
           'PixelTest.CircularSubPixelBorder', 'PixelTest.FilterBlurred100PxText'
       ],
diff --git a/src/starboard/evergreen/x64/cobalt/configuration.py b/src/starboard/evergreen/x64/cobalt/configuration.py
index 9d0947d..e24e3cf 100644
--- a/src/starboard/evergreen/x64/cobalt/configuration.py
+++ b/src/starboard/evergreen/x64/cobalt/configuration.py
@@ -64,7 +64,4 @@
         }
     }
 
-  __FILTERED_TESTS = {
-      'base_unittests': [test_filter.FILTER_ALL],
-      'net_unittests': [test_filter.FILTER_ALL],
-  }
+  __FILTERED_TESTS = {}
diff --git a/src/starboard/nplb/drm_update_server_certificate_test.cc b/src/starboard/nplb/drm_update_server_certificate_test.cc
index 9d9e9c7..25dc341 100644
--- a/src/starboard/nplb/drm_update_server_certificate_test.cc
+++ b/src/starboard/nplb/drm_update_server_certificate_test.cc
@@ -22,7 +22,7 @@
 namespace nplb {
 namespace {
 
-TEST(SbDrmUpdateServerCertificateTest, SunnyDay) {
+TEST(SbDrmUpdateServerCertificateTest, RainyDay) {
   // Ensure that |SbDrmUpdateServerCertificate| can be called over all key
   // systems.
   for (auto key_system : kKeySystems) {
diff --git a/src/starboard/shared/starboard/player/filter/player_components.cc b/src/starboard/shared/starboard/player/filter/player_components.cc
index 488c2dd..65f3c15 100644
--- a/src/starboard/shared/starboard/player/filter/player_components.cc
+++ b/src/starboard/shared/starboard/player/filter/player_components.cc
@@ -35,6 +35,7 @@
 
 namespace {
 
+const int kAudioSinkFramesAlignment = 256;
 const int kDefaultAudioSinkMinFramesPerAppend = 1024;
 const int kDefaultAudioSinkMaxCachedFrames =
     8 * kDefaultAudioSinkMinFramesPerAppend;
@@ -75,6 +76,10 @@
   scoped_ptr<VideoRendererImpl> video_renderer_;
 };
 
+int AlignUp(int value, int alignment) {
+  return (value + alignment - 1) / alignment * alignment;
+}
+
 }  // namespace
 
 PlayerComponents::Factory::CreationParameters::CreationParameters(
@@ -309,6 +314,8 @@
     int* min_frames_per_append) const {
   SB_DCHECK(max_cached_frames);
   SB_DCHECK(min_frames_per_append);
+  SB_DCHECK(kDefaultAudioSinkMinFramesPerAppend % kAudioSinkFramesAlignment ==
+            0);
   *min_frames_per_append = kDefaultAudioSinkMinFramesPerAppend;
 #if SB_API_VERSION >= 11
   // AudioRenderer prefers to use kSbMediaAudioSampleTypeFloat32 and only uses
@@ -325,6 +332,7 @@
   // need to be larger than |min_frames_required| * 4/3.
   *max_cached_frames = static_cast<int>(min_frames_required * 1.4) +
                        kDefaultAudioSinkMinFramesPerAppend;
+  *max_cached_frames = AlignUp(*max_cached_frames, kAudioSinkFramesAlignment);
 #else   // SB_API_VERSION >= 11
   *max_cached_frames = kDefaultAudioSinkMaxCachedFrames;
 #endif  // SB_API_VERSION >= 11
diff --git a/src/starboard/stub/configuration_public.h b/src/starboard/stub/configuration_public.h
index 17fc98c..f27313c 100644
--- a/src/starboard/stub/configuration_public.h
+++ b/src/starboard/stub/configuration_public.h
@@ -183,7 +183,12 @@
 // being played without audio for several seconds after seeking.  When the
 // following macro is defined, the app will append audio frames start from the
 // timestamp that is before the timestamp of the video key frame being appended.
+//
+// This quirk has been deprecated in Starboard version 12 or later.  Please see
+// `configuration_public.md` for more details.
+#if SB_API_VERSION < 12
 #undef SB_HAS_QUIRK_SEEK_TO_KEYFRAME
+#endif  // SB_API_VERSION < 12
 
 // The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only
 // when this macro is defined.
diff --git a/src/third_party/crashpad/build/crashpad.gypi b/src/third_party/crashpad/build/crashpad.gypi
index b8a5e31..5acc87a 100644
--- a/src/third_party/crashpad/build/crashpad.gypi
+++ b/src/third_party/crashpad/build/crashpad.gypi
@@ -18,7 +18,7 @@
     # treat Crashpad as Chromium code. This enables warnings at an appropriate
     # level and applies Chromium’s build/filename_rules.gypi. In a standalone
     # build, this variable has no effect.
-    'chromium_code': 1,
+    'crashpad_code': 1,
   },
   'target_defaults': {
     'msvs_disabled_warnings': [
@@ -26,7 +26,7 @@
       4324,  # structure was padded due to __declspec(align()).
     ],
     'conditions': [
-      ['host_os=="linux" or host_os=="android"', {
+      ['target_os=="linux" or target_os=="android"', {
         'conditions': [
           ['clang==0', {
             'cflags': [
diff --git a/src/third_party/crashpad/client/client.gyp b/src/third_party/crashpad/client/client.gyp
index e055ded..3755f98 100644
--- a/src/third_party/crashpad/client/client.gyp
+++ b/src/third_party/crashpad/client/client.gyp
@@ -64,7 +64,7 @@
             ],
           },
         }],
-        ['host_os=="linux" or host_os=="android"', {
+        ['target_os=="linux" or target_os=="android"', {
           'sources': [
             'client_argv_handling.cc',
             'client_argv_handling.h',
diff --git a/src/third_party/crashpad/compat/compat.gyp b/src/third_party/crashpad/compat/compat.gyp
index 080af84..646e9bc 100644
--- a/src/third_party/crashpad/compat/compat.gyp
+++ b/src/third_party/crashpad/compat/compat.gyp
@@ -125,7 +125,7 @@
             ],
           },
         }],
-        ['host_os=="linux"', {
+        ['target_os=="linux"', {
           'type': 'none',
           'include_dirs': [
             'linux',
diff --git a/src/third_party/crashpad/snapshot/snapshot.gyp b/src/third_party/crashpad/snapshot/snapshot.gyp
index fe4a0d3..79017d5 100644
--- a/src/third_party/crashpad/snapshot/snapshot.gyp
+++ b/src/third_party/crashpad/snapshot/snapshot.gyp
@@ -186,7 +186,7 @@
             ],
           },
         }],
-        ['host_os=="linux" or host_os=="android"', {
+        ['target_os=="linux" or target_os=="android"', {
           'sources!': [
             'capture_memory.cc',
             'capture_memory.h',
diff --git a/src/third_party/crashpad/util/util.gyp b/src/third_party/crashpad/util/util.gyp
index ebaac80..8a33e83 100644
--- a/src/third_party/crashpad/util/util.gyp
+++ b/src/third_party/crashpad/util/util.gyp
@@ -414,7 +414,7 @@
             ],
           },
         }],
-        ['host_os=="linux" or host_os=="android"', {
+        ['target_os=="linux" or target_os=="android"', {
           'sources': [
             'net/http_transport_socket.cc',
             'process/process_memory_sanitized.cc',
@@ -425,7 +425,7 @@
             'misc/capture_context_linux.S',
           ],
         }],
-        ['host_os!="linux" and host_os!="android"', {
+        ['target_os!="linux" and target_os!="android"', {
           'sources/': [
             ['exclude', '^process/'],
           ],
diff --git a/src/third_party/libdav1d/include/config.asm b/src/third_party/libdav1d/include/config.asm
new file mode 100644
index 0000000..862e441
--- /dev/null
+++ b/src/third_party/libdav1d/include/config.asm
@@ -0,0 +1,21 @@
+# Copyright 2020 The Cobalt Authors. All Rights Reserved.
+#
+# 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
+# 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.
+
+# NOTE:
+# libdav1d's build process will generate this file and populate it with defines
+# that configure the project appropriately and set compilation flags. These
+# flags are migrated into Cobalt's gyp and ninja build process which makes this
+# file superfluous. However, we keep |config.asm| since the file is referenced
+# in the includes for several source files and to keep the overall code changes
+# low for ease of rebasing upstream changes from libdav1d.
diff --git a/src/third_party/libdav1d/include/config.h b/src/third_party/libdav1d/include/config.h
index e69de29..f0bbc12 100644
--- a/src/third_party/libdav1d/include/config.h
+++ b/src/third_party/libdav1d/include/config.h
@@ -0,0 +1,21 @@
+// Copyright 2020 The Cobalt Authors. All Rights Reserved.
+//
+// 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
+// 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.
+
+// NOTE:
+// libdav1d's build process will generate this file and populate it with defines
+// that configure the project appropriately and set compilation flags. These
+// flags are migrated into Cobalt's gyp and ninja build process which makes this
+// file superfluous. However, we keep |config.h| since the file is referenced
+// in the includes for several source files and to keep the overall code changes
+// low for ease of rebasing upstream changes from libdav1d.
diff --git a/src/third_party/libdav1d/libdav1d.gyp b/src/third_party/libdav1d/libdav1d.gyp
index 862555d..db10ba0 100644
--- a/src/third_party/libdav1d/libdav1d.gyp
+++ b/src/third_party/libdav1d/libdav1d.gyp
@@ -1,13 +1,55 @@
+# Copyright 2020 The Cobalt Authors. All Rights Reserved.
+#
+# 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
+# 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.
+
 {
+  'conditions': [
+    ['sb_api_version >= 12', {
+      'variables': {
+        'DAV1D_ARCH_AARCH64':   'SB_IS(ARCH_ARM64)',
+        'DAV1D_ARCH_ARM':       'SB_IS(ARCH_ARM)',
+        'DAV1D_ARCH_PPC64LE':   'SB_IS(ARCH_PPC)',
+        'DAV1D_ARCH_X86':       '(SB_IS(ARCH_X86) || SB_IS(ARCH_X64))',
+        'DAV1D_ARCH_X86_32':    'SB_IS(ARCH_X86)',
+        'DAV1D_ARCH_X86_64':    'SB_IS(ARCH_X64)',
+        'DAV1D_ENDIANNESS_BIG': 'SB_IS(BIG_ENDIAN)',
+      },
+    }, {
+      'variables': {
+        'DAV1D_ARCH_AARCH64':   '(SB_IS_ARCH_ARM & SB_IS_64_BIT)',
+        'DAV1D_ARCH_ARM':       '(SB_IS_ARCH_ARM & SB_IS_32_BIT)',
+        'DAV1D_ARCH_PPC64LE':   'SB_IS_ARCH_PPC',
+        'DAV1D_ARCH_X86':       'SB_IS_ARCH_X86',
+        'DAV1D_ARCH_X86_32':    '(SB_IS_ARCH_X86 & SB_IS_32_BIT)',
+        'DAV1D_ARCH_X86_64':    '(SB_IS_ARCH_X86 & SB_IS_64_BIT)',
+        'DAV1D_ENDIANNESS_BIG': 'SB_IS_BIG_ENDIAN',
+      },
+    }],
+  ],
+
   'variables': {
+    'enable_asm': 0,
+
     'libdav1d_dir': '<(DEPTH)/third_party/libdav1d',
 
     'libdav1d_include_dirs': [
-        '<(libdav1d_dir)/',
-        '<(libdav1d_dir)/include',
-        '<(libdav1d_dir)/include/dav1d',
+      '<(libdav1d_dir)/',
+      '<(libdav1d_dir)/include',
+      '<(libdav1d_dir)/include/dav1d',
     ],
 
+    # BITDEPTH-specific sources
+    #  Note: these files must be compiled with -DBITDEPTH=8 or 16
     'libdav1d_bitdepth_sources': [
       'src/cdef.h',
       'src/cdef_apply.h',
@@ -36,6 +78,53 @@
       'src/recon.h',
       'src/recon_tmpl.c',
     ],
+
+    # ARCH-specific sources
+    'libdav1d_arch_sources': [],
+    'libdav1d_arch_bitdepth_sources': [],
+
+    # ASM-specific sources
+    'libdav1d_base_asm_sources': [],
+    'libdav1d_bitdepth8_asm_sources': [],
+    'libdav1d_bitdepth16_asm_sources': [],
+
+    'conditions': [
+      ['enable_asm == 1 and (target_arch == "x86" or target_arch == "x64")', {
+        'libdav1d_arch_sources': [
+          'src/x86/cpu.c',
+          'src/x86/cpu.h',
+          'src/x86/msac.h',
+        ],
+        'libdav1d_arch_bitdepth_sources': [
+          'src/x86/cdef_init_tmpl.c',
+          'src/x86/film_grain_init_tmpl.c',
+          'src/x86/ipred_init_tmpl.c',
+          'src/x86/itx_init_tmpl.c',
+          'src/x86/loopfilter_init_tmpl.c',
+          'src/x86/looprestoration_init_tmpl.c',
+          'src/x86/mc_init_tmpl.c',
+        ],
+        'libdav1d_base_asm_sources': [
+          'src/x86/cpuid.asm',
+          'src/x86/msac.asm',
+        ],
+        'libdav1d_bitdepth8_asm_sources': [
+          'src/x86/cdef.asm',
+          'src/x86/cdef_sse.asm',
+          'src/x86/film_grain.asm',
+          'src/x86/ipred.asm',
+          'src/x86/ipred_ssse3.asm',
+          'src/x86/itx.asm',
+          'src/x86/itx_ssse3.asm',
+          'src/x86/loopfilter.asm',
+          'src/x86/loopfilter_ssse3.asm',
+          'src/x86/looprestoration.asm',
+          'src/x86/looprestoration_ssse3.asm',
+          'src/x86/mc.asm',
+          'src/x86/mc_ssse3.asm',
+        ],
+      }],
+    ],
   },
 
   'target_defaults': {
@@ -43,25 +132,64 @@
       '<(DEPTH)/third_party/libdav1d/',
       '<(DEPTH)/third_party/libdav1d/include',
       '<(DEPTH)/third_party/libdav1d/include/dav1d',
+      '<(DEPTH)/third_party/libdav1d/src',
     ],
-    # These values are determined by the configure script in the project,
-    # and included via the |build/config.h| file however in this case we
-    # determine these using gyp and inject them into the compilation.
     'defines': [
-      'ARCH_AARCH64=SB_IS(ARCH_ARM64)',
-      'ARCH_ARM=SB_IS(ARCH_ARM)',
-      'ARCH_X86=(SB_IS(ARCH_X86) || SB_IS(ARCH_X64))',
-      'ARCH_X86_32=SB_IS(ARCH_X86)',
-      'ARCH_X86_64=SB_IS(ARCH_X64)',
+      'ARCH_AARCH64=<(DAV1D_ARCH_AARCH64)',
+      'ARCH_ARM=<(DAV1D_ARCH_ARM)',
+      'ARCH_PPC64LE=<(DAV1D_ARCH_PPC64LE)',
+      'ARCH_X86=<(DAV1D_ARCH_X86)',
+      'ARCH_X86_32=<(DAV1D_ARCH_X86_32)',
+      'ARCH_X86_64=<(DAV1D_ARCH_X86_64)',
       'CONFIG_16BPC=1',
       'CONFIG_8BPC=1',
       'CONFIG_LOG=1',
-      'ENDIANNESS_BIG=SB_IS(BIG_ENDIAN)',
-      'HAVE_ASM=0',
-      'HAVE_CLOCK_GETTIME=1',
-      'HAVE_POSIX_MEMALIGN=1',
-      'HAVE_UNISTD_H=1',
-      'STACK_ALIGNMENT=32'
+      'ENDIANNESS_BIG=<(DAV1D_ENDIANNESS_BIG)',
+      'HAVE_ASM=<(enable_asm)',
+    ],
+
+    'conditions': [
+      ['target_os == "linux"', {
+        'defines':[
+          'HAVE_CLOCK_GETTIME=1',
+          'HAVE_POSIX_MEMALIGN=1',
+          'HAVE_UNISTD_H=1',
+          'STACK_ALIGNMENT=32',
+        ]
+      }],
+
+      ['target_os == "win"', {
+        'include_dirs': [
+          # for stdatomic.h
+          '<(DEPTH)/third_party/libdav1d/include/compat/msvc',
+        ],
+        'defines':[
+          'HAVE_ALIGNED_MALLOC=1',
+          'HAVE_IO_H=1',
+          'UNICODE=1',
+          '_CRT_DECLARE_NONSTDC_NAMES=1',
+          '_UNICODE=1',
+          '_WIN32_WINNT=0x0601',
+          '__USE_MINGW_ANSI_STDIO=1',
+          'fseeko=_fseeki64',
+          'ftello=_ftelli64',
+        ],
+        'cflags_cc': [
+          '-wd4028',
+          '-wd4996',
+        ],
+        'conditions': [
+          ['target_arch == "x64"', {
+            'defines': [
+              'STACK_ALIGNMENT=16',
+            ],
+          }, {
+            'defines': [
+              'STACK_ALIGNMENT=4',
+            ],
+          }],
+        ],
+      }],
     ],
   },
 
@@ -82,8 +210,22 @@
         'BITDEPTH=16',
       ],
       'sources': [
+        '<@(libdav1d_arch_bitdepth_sources)',
         '<@(libdav1d_bitdepth_sources)',
-      ]
+      ],
+    },
+    {
+      'target_name': 'libdav1d_bitdepth16_asm',
+      'type': 'static_library',
+      'defines': [
+        'BITDEPTH=16',
+      ],
+      'includes': [
+        'libdav1d_asm.gypi'
+      ],
+      'sources': [
+        '<@(libdav1d_bitdepth16_asm_sources)',
+      ],
     },
     {
       'target_name': 'libdav1d_bitdepth8',
@@ -92,18 +234,43 @@
         'BITDEPTH=8',
       ],
       'sources': [
+        '<@(libdav1d_arch_bitdepth_sources)',
         '<@(libdav1d_bitdepth_sources)',
-      ]
+      ],
     },
     {
-      'target_name': 'libdav1d_no_asm',
+      'target_name': 'libdav1d_bitdepth8_asm',
+      'type': 'static_library',
+      'defines': [
+        'BITDEPTH=8',
+      ],
+      'includes': [
+        'libdav1d_asm.gypi'
+      ],
+      'sources': [
+        '<@(libdav1d_bitdepth8_asm_sources)',
+      ],
+    },
+    {
+      'target_name': 'libdav1d_base',
       'type': 'static_library',
       'sources': [
         'src/cpu.c',
         'src/cpu.h',
         'src/msac.c',
         'src/msac.h',
-      ]
+      ],
+    },
+    {
+      'target_name': 'libdav1d_base_asm',
+      'type': 'static_library',
+      'includes': [
+        'libdav1d_asm.gypi'
+      ],
+      'sources': [
+        '<@(libdav1d_arch_sources)',
+        '<@(libdav1d_base_asm_sources)'
+      ],
     },
     {
       'target_name': 'libdav1d',
@@ -151,18 +318,20 @@
         'src/wedge.h',
       ],
       'dependencies': [
+        '<(DEPTH)/starboard/common/common.gyp:common',
+        'libdav1d_base',
+        'libdav1d_base_asm',
         'libdav1d_bitdepth16',
+        'libdav1d_bitdepth16_asm',
         'libdav1d_bitdepth8',
+        'libdav1d_bitdepth8_asm',
         'libdav1d_entrypoint',
-        'libdav1d_no_asm',
       ],
       'direct_dependent_settings': {
         'include_dirs': [
-          '<(DEPTH)/third_party/libdav1d/',
-          '<(DEPTH)/third_party/libdav1d/include',
-          '<(DEPTH)/third_party/libdav1d/include/dav1d',
+          '<@(libdav1d_include_dirs)',
         ],
       },
     },
-  ]
+  ],
 }
diff --git a/src/third_party/libdav1d/libdav1d_asm.gypi b/src/third_party/libdav1d/libdav1d_asm.gypi
new file mode 100644
index 0000000..a52b895
--- /dev/null
+++ b/src/third_party/libdav1d/libdav1d_asm.gypi
@@ -0,0 +1,103 @@
+# Copyright 2020 The Cobalt Authors. All Rights Reserved.
+#
+# 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
+# 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.
+
+{
+  'conditions': [
+    ['target_arch == "x64" or target_arch == "x86"', {
+      'variables': {
+        'DAV1D_IS_PIC': '1',
+      },
+      'conditions': [
+        ['target_arch == "x64"', {
+          'variables': {
+            'DAV1D_ARCH_X86_32': '0',
+            'DAV1D_ARCH_X86_64': '1',
+          }
+        }, {
+          'variables': {
+            'DAV1D_ARCH_X86_32': '1',
+            'DAV1D_ARCH_X86_64': '0',
+          }
+        }]
+      ],
+    }],
+    ['target_os == "linux"', {
+      'variables': {
+        'DAV1D_STACK_ALIGNMENT': '32',
+      },
+    }],
+    ['target_os == "win"', {
+      'conditions': [
+        ['target_arch == "x64"', {
+          'variables': {
+            'DAV1D_STACK_ALIGNMENT': '16',
+          }
+        }, {
+          'variables': {
+            'DAV1D_STACK_ALIGNMENT': '4',
+          }
+        }]
+      ],
+    }],
+  ],
+  'rules': [{
+    'rule_name': 'assemble',
+    'extension': 'asm',
+    'inputs': [],
+    'outputs': [
+      '<(PRODUCT_DIR)/obj/third_party/libdav1d/<(RULE_INPUT_ROOT).asm.o',
+    ],
+
+    'conditions': [
+      ['target_os == "win"', {
+        'variables': {
+          'NASM_EXECUTABLE': 'nasm.exe',
+          'NASM_OUTPUT_FORMAT' : 'win',
+        },
+      }],
+      ['target_os == "linux"', {
+        'variables': {
+          'NASM_EXECUTABLE': '/usr/bin/nasm',
+          'NASM_OUTPUT_FORMAT': 'elf',
+        },
+      }],
+      ['target_arch == "x86"', {
+        'variables': {
+          'NASM_OUTPUT_SIZE': '32'
+        },
+      }, {
+        'variables': {
+          'NASM_OUTPUT_SIZE': '64'
+        },
+      }],
+    ],
+
+    'action': [
+      '<(NASM_EXECUTABLE)',
+      '-f<(NASM_OUTPUT_FORMAT)<(NASM_OUTPUT_SIZE)',
+      '-DSTACK_ALIGNMENT=<(DAV1D_STACK_ALIGNMENT)',
+      '-DARCH_X86_32=<(DAV1D_ARCH_X86_32)',
+      '-DARCH_X86_64=<(DAV1D_ARCH_X86_64)',
+      '-DPIC=<(DAV1D_IS_PIC)',
+      '-I<(DEPTH)/third_party/libdav1d/include',
+      '-I<(DEPTH)/third_party/libdav1d/src',
+      '-MQ<(PRODUCT_DIR)/$out',
+      '-MF<(PRODUCT_DIR)/$out.ndep',
+      '-o<(PRODUCT_DIR)/$out',
+      '<(RULE_INPUT_PATH)',
+    ],
+    'process_outputs_as_sources': 1,
+    'message': 'Building <(RULE_INPUT_ROOT).asm.o',
+  }],
+}
diff --git a/src/third_party/mini_chromium/build/filename_rules.gypi b/src/third_party/mini_chromium/build/filename_rules.gypi
index 1393c47..a9e3366 100644
--- a/src/third_party/mini_chromium/build/filename_rules.gypi
+++ b/src/third_party/mini_chromium/build/filename_rules.gypi
@@ -4,25 +4,25 @@
 
 {
   'target_conditions': [
-    ['OS!="mac"', {
+    ['host_os!="mac"', {
       'sources/': [
         ['exclude', '_(cocoa|mac)(_test)?\\.(h|cc|mm?)$'],
         ['exclude', '(^|/)(cocoa|mac|mach)/'],
       ],
     }],
-    ['OS!="linux"', {
+    ['host_os!="linux"', {
       'sources/': [
         ['exclude', '_linux(_test)?\\.(h|cc)$'],
         ['exclude', '(^|/)linux/'],
       ],
     }],
-    ['OS!="android"', {
+    ['host_os!="android"', {
       'sources/': [
         ['exclude', '_android(_test)?\\.(h|cc)$'],
         ['exclude', '(^|/)android/'],
       ],
     }],
-    ['OS=="win"', {
+    ['host_os=="win"', {
       'sources/': [
         ['exclude', '_posix(_test)?\\.(h|cc)$'],
         ['exclude', '(^|/)posix/'],
diff --git a/src/third_party/musl/musl.gyp b/src/third_party/musl/musl.gyp
index 2647e2b..101bed0 100644
--- a/src/third_party/musl/musl.gyp
+++ b/src/third_party/musl/musl.gyp
@@ -190,8 +190,11 @@
             'src/stdio/sscanf.c',
             'src/stdio/swprintf.c',
             'src/stdio/vasprintf.c',
+            'src/stdio/vprintf.c',
             'src/stdio/vsprintf.c',
             'src/stdlib/abs.c',
+            'src/stdlib/atof.c',
+            'src/stdlib/atoi.c',
             'src/stdlib/labs.c',
             'src/stdlib/llabs.c',
             'src/stdlib/wcstod.c',
diff --git a/src/third_party/web_platform_tests/resources/testharnessreport.js b/src/third_party/web_platform_tests/resources/testharnessreport.js
index 7086fe3..d946b35 100644
--- a/src/third_party/web_platform_tests/resources/testharnessreport.js
+++ b/src/third_party/web_platform_tests/resources/testharnessreport.js
@@ -404,6 +404,7 @@
     document.documentElement.lastChild.appendChild(results_element);
     if (window.testRunner) {
         window.testRunner.notifyDone();
+        window.close();
     }
 }
 
diff --git a/src/tools/gyp/pylib/gyp/generator/ninja.py b/src/tools/gyp/pylib/gyp/generator/ninja.py
index 81dc81a..556dc46 100755
--- a/src/tools/gyp/pylib/gyp/generator/ninja.py
+++ b/src/tools/gyp/pylib/gyp/generator/ninja.py
@@ -26,7 +26,6 @@
 import gyp.MSVSUtil as MSVSUtil
 import gyp.xcode_emulation
 
-from gyp.common import GetEnvironFallback
 import gyp.ninja_syntax as ninja_syntax
 
 if sys.platform == 'cygwin':
@@ -237,28 +236,9 @@
     """Return true if this is a target that can be linked against."""
     return self.type in ('static_library', 'shared_library')
 
-  def UsesToc(self, flavor):
-    """Return true if the target should produce a restat rule based on a TOC
-    file."""
-    try:
-      # Do not use TOC files for abstract toolchain.
-      toolchain = GetTargetToolchain(flavor)
-      return False
-    except NotImplementedError:
-      # Follow the logic for the legacy toolchain.
-      pass
-    # For bundles, the .TOC should be produced for the binary, not for
-    # FinalOutput(). But the naive approach would put the TOC file into the
-    # bundle, so don't do this for bundles for now.
-    if flavor in windows_host_flavors or self.bundle:
-      return False
-    return self.type in ('shared_library', 'loadable_module')
-
   def PreActionInput(self, flavor):
     """Return the path, if any, that should be used as a dependency of
     any dependent action step."""
-    if self.UsesToc(flavor):
-      return self.FinalOutput() + '.TOC'
     return self.FinalOutput() or self.preaction_stamp
 
   def PreCompileInput(self):
@@ -466,12 +446,8 @@
     if len(targets) == 1:
       return targets[0]
 
-    try:
-      assert FindFirstInstanceOf(abstract.Stamp, GetHostToolchain(
-          self.flavor)), 'Host toolchain must provide stamp tool.'
-    except NotImplementedError:
-      # Fall back to the legacy toolchain.
-      pass
+    assert FindFirstInstanceOf(abstract.Stamp, GetHostToolchain(
+        self.flavor)), 'Host toolchain must provide stamp tool.'
 
     stamp_output = self.GypPathToUniqueOutput(name + '.stamp')
     self.ninja.build(stamp_output, 'stamp', targets)
@@ -815,12 +791,8 @@
     return all_outputs
 
   def WriteCopy(self, src, dst, prebuild, env, mac_bundle_depends):
-    try:
-      assert FindFirstInstanceOf(abstract.Copy, GetHostToolchain(
-          self.flavor)), 'Host toolchain must provide copy tool.'
-    except NotImplementedError:
-      # Fall back to the legacy toolchain.
-      pass
+    assert FindFirstInstanceOf(abstract.Copy, GetHostToolchain(
+        self.flavor)), 'Host toolchain must provide copy tool.'
 
     dst = self.GypPathToNinja(dst, env)
     # Renormalize with the separator character of the os on which ninja will run
@@ -918,572 +890,245 @@
   def WriteSources(self, config_name, config, sources, predepends,
                    precompiled_header, spec):
     """Write build rules to compile all of |sources|."""
+    shell = GetShell(self.flavor)
 
-    try:
-      shell = GetShell(self.flavor)
-
-      if self.toolset == 'target':
-        toolchain = GetTargetToolchain(self.flavor, spec=spec,
-                                       config_name=config_name)
-      else:
-        toolchain = GetHostToolchain(self.flavor, spec=spec,
+    if self.toolset == 'target':
+      toolchain = GetTargetToolchain(self.flavor, spec=spec,
                                      config_name=config_name)
+    else:
+      toolchain = GetHostToolchain(self.flavor, spec=spec,
+                                   config_name=config_name)
 
-      defines = config.get('defines', [])
-      include_dirs = [
-          self.GypPathToNinja(include_dir)
-          for include_dir in config.get('include_dirs', [])
-      ]
+    defines = config.get('defines', [])
+    include_dirs = [
+        self.GypPathToNinja(include_dir)
+        for include_dir in config.get('include_dirs', [])
+    ]
 
-      # TODO: This code emulates legacy toolchain behavior. We need to migrate
-      #       to single-responsibility, toolchain-independent GYP keywords as
-      #       per abstract toolchain design doc.
-      cflags = GetConfigFlags(config, self.toolset, 'cflags')
-      cflags_c = GetConfigFlags(config, self.toolset, 'cflags_c')
-      cflags_cc = GetConfigFlags(config, self.toolset, 'cflags_cc')
-      cflags_mm = GetConfigFlags(config, self.toolset, 'cflags_mm')
-      obj = 'obj'
-      if self.toolset != 'target':
-        obj += '.' + self.toolset
-      pdbpath = os.path.normpath(
-          os.path.join(obj, self.base_dir, self.name + '.pdb'))
-      self.WriteVariableList('pdbname', [pdbpath])
+    # TODO: This code emulates legacy toolchain behavior. We need to migrate
+    #       to single-responsibility, toolchain-independent GYP keywords as
+    #       per abstract toolchain design doc.
+    cflags = GetConfigFlags(config, self.toolset, 'cflags')
+    cflags_c = GetConfigFlags(config, self.toolset, 'cflags_c')
+    cflags_cc = GetConfigFlags(config, self.toolset, 'cflags_cc')
+    cflags_mm = GetConfigFlags(config, self.toolset, 'cflags_mm')
+    obj = 'obj'
+    if self.toolset != 'target':
+      obj += '.' + self.toolset
+    pdbpath = os.path.normpath(
+        os.path.join(obj, self.base_dir, self.name + '.pdb'))
+    self.WriteVariableList('pdbname', [pdbpath])
 
-      c_compiler = FindFirstInstanceOf(abstract.CCompiler, toolchain)
-      if c_compiler:
-        c_compiler_flags = c_compiler.GetFlags(defines, include_dirs,
-                                               cflags + cflags_c)
-        self.ninja.variable(
-            '{0}_flags'.format(GetNinjaRuleName(c_compiler, self.toolset)),
-            shell.Join(c_compiler_flags))
-
-      cxx_compiler = FindFirstInstanceOf(abstract.CxxCompiler, toolchain)
-      if cxx_compiler:
-        cxx_compiler_flags = cxx_compiler.GetFlags(defines, include_dirs,
-                                                   cflags + cflags_cc)
-        self.ninja.variable(
-            '{0}_flags'.format(GetNinjaRuleName(cxx_compiler, self.toolset)),
-            shell.Join(cxx_compiler_flags))
-
-      objcxx_compiler = FindFirstInstanceOf(abstract.ObjectiveCxxCompiler,
-                                            toolchain)
-      if objcxx_compiler:
-        objcxx_compiler_flags = objcxx_compiler.GetFlags(
-            defines, include_dirs, cflags + cflags_cc + cflags_mm)
-        self.ninja.variable(
-            '{0}_flags'.format(GetNinjaRuleName(objcxx_compiler, self.toolset)),
-            shell.Join(objcxx_compiler_flags))
-
-      assembler = FindFirstInstanceOf(abstract.AssemblerWithCPreprocessor,
-                                      toolchain)
-      if assembler:
-        assembler_flags = assembler.GetFlags(defines, include_dirs,
+    c_compiler = FindFirstInstanceOf(abstract.CCompiler, toolchain)
+    if c_compiler:
+      c_compiler_flags = c_compiler.GetFlags(defines, include_dirs,
                                              cflags + cflags_c)
-        self.ninja.variable(
-            '{0}_flags'.format(GetNinjaRuleName(assembler, self.toolset)),
-            shell.Join(assembler_flags))
+      self.ninja.variable(
+          '{0}_flags'.format(GetNinjaRuleName(c_compiler, self.toolset)),
+          shell.Join(c_compiler_flags))
 
-      self.ninja.newline()
+    cxx_compiler = FindFirstInstanceOf(abstract.CxxCompiler, toolchain)
+    if cxx_compiler:
+      cxx_compiler_flags = cxx_compiler.GetFlags(defines, include_dirs,
+                                                 cflags + cflags_cc)
+      self.ninja.variable(
+          '{0}_flags'.format(GetNinjaRuleName(cxx_compiler, self.toolset)),
+          shell.Join(cxx_compiler_flags))
 
-      outputs = []
-      for source in sources:
-        _, extension = os.path.splitext(source)
-        if extension in ['.c']:
-          assert c_compiler, ('Toolchain must provide C compiler in order to '
-                              'build {0} for {1} platform.').format(
+    objcxx_compiler = FindFirstInstanceOf(abstract.ObjectiveCxxCompiler,
+                                          toolchain)
+    if objcxx_compiler:
+      objcxx_compiler_flags = objcxx_compiler.GetFlags(
+          defines, include_dirs, cflags + cflags_cc + cflags_mm)
+      self.ninja.variable(
+          '{0}_flags'.format(GetNinjaRuleName(objcxx_compiler, self.toolset)),
+          shell.Join(objcxx_compiler_flags))
+
+    assembler = FindFirstInstanceOf(abstract.AssemblerWithCPreprocessor,
+                                    toolchain)
+    if assembler:
+      assembler_flags = assembler.GetFlags(defines, include_dirs,
+                                           cflags + cflags_c)
+      self.ninja.variable(
+          '{0}_flags'.format(GetNinjaRuleName(assembler, self.toolset)),
+          shell.Join(assembler_flags))
+
+    self.ninja.newline()
+
+    outputs = []
+    for source in sources:
+      _, extension = os.path.splitext(source)
+      if extension in ['.c']:
+        assert c_compiler, ('Toolchain must provide C compiler in order to '
+                            'build {0} for {1} platform.').format(
+                                source, self.toolset)
+        rule_name = GetNinjaRuleName(c_compiler, self.toolset)
+      elif extension in ['.cc', '.cpp', '.cxx']:
+        assert cxx_compiler, ('Toolchain must provide C++ compiler in order '
+                              'to build {0} for {1} platform.').format(
                                   source, self.toolset)
-          rule_name = GetNinjaRuleName(c_compiler, self.toolset)
-        elif extension in ['.cc', '.cpp', '.cxx']:
-          assert cxx_compiler, ('Toolchain must provide C++ compiler in order '
-                                'to build {0} for {1} platform.').format(
-                                    source, self.toolset)
-          rule_name = GetNinjaRuleName(cxx_compiler, self.toolset)
-        elif extension in ['.mm']:
-          assert objcxx_compiler, ('Toolchain must provide Objective-C++ '
-                                   'compiler in order to build {0} for {1} '
-                                   'platform.').format(source, self.toolset)
-          rule_name = GetNinjaRuleName(objcxx_compiler, self.toolset)
-        elif extension in ['.S', '.s']:
-          assert assembler, ('Toolchain must provide assembler in order to '
-                             'build {0} for {1} platform.').format(
-                                 source, self.toolset)
-          rule_name = GetNinjaRuleName(assembler, self.toolset)
-        else:
-          rule_name = None
-
-        if rule_name:
-          input = self.GypPathToNinja(source)
-          output = '{0}.o'.format(self.GypPathToUniqueOutput(source))
-          self.ninja.build(
-              output,
-              rule_name,
-              input,
-              implicit=None,  # TODO: Implemenet precompiled headers.
-              order_only=predepends)
-          outputs.append(output)
-
-    except NotImplementedError:
-      # Fall back to the legacy toolchain.
-
-      if self.toolset == 'host':
-        self.ninja.variable('ar', '$ar_host')
-        self.ninja.variable('cc', '$cc_host')
-        self.ninja.variable('cxx', '$cxx_host')
-        self.ninja.variable('ld', '$ld_host')
-
-      extra_defines = []
-      if self.flavor == 'mac':
-        cflags = self.xcode_settings.GetCflags(config_name)
-        cflags_c = self.xcode_settings.GetCflagsC(config_name)
-        cflags_cc = self.xcode_settings.GetCflagsCC(config_name)
-        cflags_objc = ['$cflags_c'] + \
-                      self.xcode_settings.GetCflagsObjC(config_name)
-        cflags_objcc = ['$cflags_cc'] + \
-                       self.xcode_settings.GetCflagsObjCC(config_name)
-      elif GetToolchainOrNone(self.flavor):
-        cflags = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetCflags(config_name)
-        cflags_c = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetCflagsC(config_name)
-        cflags_cc = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetCflagsCC(config_name)
-        extra_defines = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetDefines(config_name)
-        obj = 'obj'
-        if self.toolset != 'target':
-          obj += '.' + self.toolset
-        pdbpath = os.path.normpath(
-            os.path.join(obj, self.base_dir, self.name + '.pdb'))
-        self.WriteVariableList('pdbname', [pdbpath])
-        self.WriteVariableList('pchprefix', [self.name])
+        rule_name = GetNinjaRuleName(cxx_compiler, self.toolset)
+      elif extension in ['.mm']:
+        assert objcxx_compiler, ('Toolchain must provide Objective-C++ '
+                                 'compiler in order to build {0} for {1} '
+                                 'platform.').format(source, self.toolset)
+        rule_name = GetNinjaRuleName(objcxx_compiler, self.toolset)
+      elif extension in ['.S', '.s']:
+        assert assembler, ('Toolchain must provide assembler in order to '
+                           'build {0} for {1} platform.').format(
+                               source, self.toolset)
+        rule_name = GetNinjaRuleName(assembler, self.toolset)
       else:
-        cflags = config.get('cflags', [])
-        cflags_c = config.get('cflags_c', [])
-        cflags_cc = config.get('cflags_cc', [])
+        rule_name = None
 
-      cflags_host = config.get('cflags_host', cflags)
-      cflags_c_host = config.get('cflags_c_host', cflags_c)
-      cflags_cc_host = config.get('cflags_cc_host', cflags_cc)
-
-      defines = config.get('defines', []) + extra_defines
-      if GetToolchainOrNone(self.flavor):
-        self.WriteVariableList(
-            'defines',
-            [GetToolchainOrNone(self.flavor).Define(d) for d in defines])
-      else:
-        self.WriteVariableList('defines',
-                               [Define(d, self.flavor) for d in defines])
-      if GetToolchainOrNone(self.flavor):
-        self.WriteVariableList('rcflags', [
-            QuoteShellArgument(self.ExpandSpecial(f), self.flavor)
-            for f in GetToolchainOrNone(self.flavor).GetCompilerSettings()
-            .GetRcFlags(config_name, self.GypPathToNinja)
-        ])
-
-      include_dirs = config.get('include_dirs', [])
-      include_dirs += config.get('include_dirs_' + self.toolset, [])
-
-      if GetToolchainOrNone(self.flavor):
-        include_dirs = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().ProcessIncludeDirs(
-                include_dirs, config_name)
-        self.WriteVariableList('includes', [
-            '/I' + GetToolchainOrNone(self.flavor).QuoteForRspFile(
-                self.GypPathToNinja(i)) for i in include_dirs
-        ])
-      else:
-        self.WriteVariableList('includes', [
-            QuoteShellArgument('-I' + self.GypPathToNinja(i), self.flavor)
-            for i in include_dirs
-        ])
-
-      pch_commands = precompiled_header.GetPchBuildCommands()
-      if self.flavor == 'mac':
-        self.WriteVariableList('cflags_pch_c',
-                               [precompiled_header.GetInclude('c')])
-        self.WriteVariableList('cflags_pch_cc',
-                               [precompiled_header.GetInclude('cc')])
-        self.WriteVariableList('cflags_pch_objc',
-                               [precompiled_header.GetInclude('m')])
-        self.WriteVariableList('cflags_pch_objcc',
-                               [precompiled_header.GetInclude('mm')])
-
-      self.WriteVariableList('cflags', map(self.ExpandSpecial, cflags))
-      self.WriteVariableList('cflags_c', map(self.ExpandSpecial, cflags_c))
-      self.WriteVariableList('cflags_cc', map(self.ExpandSpecial, cflags_cc))
-
-      self.WriteVariableList('cflags_host', map(self.ExpandSpecial,
-                                                cflags_host))
-      self.WriteVariableList('cflags_c_host',
-                             map(self.ExpandSpecial, cflags_c_host))
-      self.WriteVariableList('cflags_cc_host',
-                             map(self.ExpandSpecial, cflags_cc_host))
-
-      if self.flavor == 'mac':
-        self.WriteVariableList('cflags_objc',
-                               map(self.ExpandSpecial, cflags_objc))
-        self.WriteVariableList('cflags_objcc',
-                               map(self.ExpandSpecial, cflags_objcc))
-      self.ninja.newline()
-
-      outputs = []
-      for source in sources:
-        filename, ext = os.path.splitext(source)
-        ext = ext[1:]
-        obj_ext = self.obj_ext
-        if ext in ('cc', 'cpp', 'cxx'):
-          command = 'cxx'
-        elif ext == 'c' or (ext == 'S' and self.flavor != 'win'):
-          command = 'cc'
-        elif ext == 's' and self.flavor != 'win':  # Doesn't generate .o.d files.
-          command = 'cc_s'
-        elif (self.flavor == 'win' and ext == 'asm' and GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetArch(config_name) == 'x86' and
-              not GetToolchainOrNone(
-                  self.flavor).GetCompilerSettings().HasExplicitAsmRules(spec)):
-          # Asm files only get auto assembled for x86 (not x64).
-          command = 'asm'
-          # Add the _asm suffix as msvs is capable of handling .cc and
-          # .asm files of the same name without collision.
-          obj_ext = '_asm.obj'
-        elif self.flavor == 'mac' and ext == 'm':
-          command = 'objc'
-        elif self.flavor == 'mac' and ext == 'mm':
-          command = 'objcxx'
-        elif self.flavor in microsoft_flavors and ext == 'rc':
-          # TODO: Starboardize this.
-          command = 'rc'
-          obj_ext = '.res'
-        else:
-          # Ignore unhandled extensions.
-          continue
-        if self.toolset != 'target':
-          command += '_' + self.toolset
-
+      if rule_name:
         input = self.GypPathToNinja(source)
-        output = self.GypPathToUniqueOutput(filename + obj_ext)
-        implicit = precompiled_header.GetObjDependencies([input], [output])
-        variables = []
-        if GetToolchainOrNone(self.flavor):
-          (variables, output,
-           implicit) = precompiled_header.GetFlagsModifications(
-               input, output, implicit, command, cflags_c, cflags_cc,
-               self.ExpandSpecial)
+        output = '{0}.o'.format(self.GypPathToUniqueOutput(source))
         self.ninja.build(
             output,
-            command,
+            rule_name,
             input,
-            implicit=[gch for _, _, gch in implicit],
-            order_only=predepends,
-            variables=variables)
+            implicit=None,  # TODO: Implemenet precompiled headers.
+            order_only=predepends)
         outputs.append(output)
 
-      self.WritePchTargets(pch_commands)
-
     self.ninja.newline()
     return outputs
 
-  def WritePchTargets(self, pch_commands):
-    """Writes ninja rules to compile prefix headers."""
-    if not pch_commands:
-      return
-
-    for gch, lang_flag, lang, input in pch_commands:
-      var_name = {
-          'c': 'cflags_pch_c',
-          'cc': 'cflags_pch_cc',
-          'm': 'cflags_pch_objc',
-          'mm': 'cflags_pch_objcc',
-      }[lang]
-
-      map = {
-          'c': 'cc',
-          'cc': 'cxx',
-          'm': 'objc',
-          'mm': 'objcxx',
-      }
-      cmd = map.get(lang)
-      self.ninja.build(gch, cmd, input, variables=[(var_name, lang_flag)])
-
   def WriteLink(self, spec, config_name, config, link_deps):
     """Write out a link step. Fills out target.binary. """
+    if self.toolset == 'target':
+      toolchain = GetTargetToolchain(
+          self.flavor,
+          spec=spec,
+          config_name=config_name,
+          gyp_path_to_ninja=self.GypPathToNinja,
+          expand_special=self.ExpandSpecial,
+          gyp_path_to_unique_output=self.GypPathToUniqueOutput,
+          compute_output_file_name=self.ComputeOutputFileName
+      )
+    else:
+      toolchain = GetHostToolchain(
+          self.flavor,
+          spec=spec,
+          config_name=config_name,
+          gyp_path_to_ninja=self.GypPathToNinja,
+          expand_special=self.ExpandSpecial,
+          gyp_path_to_unique_output=self.GypPathToUniqueOutput,
+          compute_output_file_name=self.ComputeOutputFileName
+      )
 
-    try:
-      if self.toolset == 'target':
-        toolchain = GetTargetToolchain(
-            self.flavor,
-            spec=spec,
-            config_name=config_name,
-            gyp_path_to_ninja=self.GypPathToNinja,
-            expand_special=self.ExpandSpecial,
-            gyp_path_to_unique_output=self.GypPathToUniqueOutput,
-            compute_output_file_name=self.ComputeOutputFileName
-        )
-      else:
-        toolchain = GetHostToolchain(
-            self.flavor,
-            spec=spec,
-            config_name=config_name,
-            gyp_path_to_ninja=self.GypPathToNinja,
-            expand_special=self.ExpandSpecial,
-            gyp_path_to_unique_output=self.GypPathToUniqueOutput,
-            compute_output_file_name=self.ComputeOutputFileName
-        )
+    shell = GetShell(self.flavor)
+    extra_bindings = []
+    target_type = spec['type']
+    if target_type == 'executable':
+      executable_linker = FindFirstInstanceOf(abstract.ExecutableLinker,
+                                              toolchain)
+      assert executable_linker, ('Toolchain must provide executable linker '
+                                 'for {0} platform.').format(self.toolset)
 
-      shell = GetShell(self.flavor)
-      extra_bindings = []
-      target_type = spec['type']
-      if target_type == 'executable':
-        executable_linker = FindFirstInstanceOf(abstract.ExecutableLinker,
-                                                toolchain)
-        assert executable_linker, ('Toolchain must provide executable linker '
-                                   'for {0} platform.').format(self.toolset)
+      rule_name = GetNinjaRuleName(executable_linker, self.toolset)
 
-        rule_name = GetNinjaRuleName(executable_linker, self.toolset)
+      # TODO: This code emulates legacy toolchain behavior. We need to migrate
+      #       to single-responsibility, toolchain-independent GYP keywords as
+      #       per abstract toolchain design doc.
+      libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
+                                                'host' else '')
+      libraries = spec.get(libraries_keyword, []) + config.get(
+          libraries_keyword, [])
 
-        # TODO: This code emulates legacy toolchain behavior. We need to migrate
-        #       to single-responsibility, toolchain-independent GYP keywords as
-        #       per abstract toolchain design doc.
-        libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
-                                                  'host' else '')
-        libraries = spec.get(libraries_keyword, []) + config.get(
-            libraries_keyword, [])
+      ldflags_executable = GetConfigFlags(
+          config, self.toolset, 'ldflags_executable')
+      if not ldflags_executable:
+        ldflags_executable = GetConfigFlags(config, self.toolset, 'ldflags')
 
-        ldflags_executable = GetConfigFlags(
-            config, self.toolset, 'ldflags_executable')
-        if not ldflags_executable:
-          ldflags_executable = GetConfigFlags(config, self.toolset, 'ldflags')
+      ldflags = gyp.common.uniquer(
+          map(self.ExpandSpecial, ldflags_executable + libraries))
 
-        ldflags = gyp.common.uniquer(
-            map(self.ExpandSpecial, ldflags_executable + libraries))
+      executable_linker_flags = executable_linker.GetFlags(ldflags)
+      self.ninja.variable('{0}_flags'.format(rule_name),
+                          shell.Join(executable_linker_flags))
+    elif target_type == 'shared_library':
+      shared_library_linker = FindFirstInstanceOf(
+          abstract.SharedLibraryLinker, toolchain)
+      assert shared_library_linker, (
+          'Toolchain must provide shared library linker '
+          'for {0} platform.').format(self.toolset)
 
-        executable_linker_flags = executable_linker.GetFlags(ldflags)
-        self.ninja.variable('{0}_flags'.format(rule_name),
-                            shell.Join(executable_linker_flags))
-      elif target_type == 'shared_library':
-        shared_library_linker = FindFirstInstanceOf(
-            abstract.SharedLibraryLinker, toolchain)
-        assert shared_library_linker, (
-            'Toolchain must provide shared library linker '
-            'for {0} platform.').format(self.toolset)
+      rule_name = GetNinjaRuleName(shared_library_linker, self.toolset)
 
-        rule_name = GetNinjaRuleName(shared_library_linker, self.toolset)
+      # TODO: This code emulates legacy toolchain behavior. We need to migrate
+      #       to single-responsibility, toolchain-independent GYP keywords as
+      #       per abstract toolchain design doc.
+      libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
+                                                'host' else '')
+      libraries = spec.get(libraries_keyword, []) + config.get(
+          libraries_keyword, [])
 
-        # TODO: This code emulates legacy toolchain behavior. We need to migrate
-        #       to single-responsibility, toolchain-independent GYP keywords as
-        #       per abstract toolchain design doc.
-        libraries_keyword = 'libraries{0}'.format('_host' if self.toolset ==
-                                                  'host' else '')
-        libraries = spec.get(libraries_keyword, []) + config.get(
-            libraries_keyword, [])
+      ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags_shared')
+      if not ldflags_shared:
+        ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags')
 
-        ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags_shared')
-        if not ldflags_shared:
-          ldflags_shared = GetConfigFlags(config, self.toolset, 'ldflags')
+      ldflags = gyp.common.uniquer(
+          map(self.ExpandSpecial, ldflags_shared + libraries))
 
-        ldflags = gyp.common.uniquer(
-            map(self.ExpandSpecial, ldflags_shared + libraries))
-
-        shared_library_linker_flags = shared_library_linker.GetFlags(ldflags)
-        self.ninja.variable('{0}_flags'.format(rule_name),
-                            shell.Join(shared_library_linker_flags))
-        output = self.ComputeOutput(spec)
-        extra_bindings.append(('soname', os.path.split(output)[1]))
-        extra_bindings.append(('dll', output))
-        if '/NOENTRY' not in shared_library_linker_flags:
-          extra_bindings.append(('implibflag',
-                                 '/IMPLIB:%s' % output + '.lib'))
-
-      else:
-        raise Exception('Target type {0} is not supported for target {1}.'
-                        .format(target_type, spec['target_name']))
-
-      order_only_deps = set()
-
-      if 'dependencies' in spec:
-        # Two kinds of dependencies:
-        # - Linkable dependencies (like a .a or a .so): add them to the link
-        #   line.
-        # - Non-linkable dependencies (like a rule that generates a file
-        #   and writes a stamp file): add them to implicit_deps or
-        #   order_only_deps
-        extra_link_deps = []
-        for dep in spec['dependencies']:
-          target = self.target_outputs.get(dep)
-          if not target:
-            continue
-          linkable = target.Linkable()
-          if linkable:
-            extra_link_deps.append(target.binary)
-
-          final_output = target.FinalOutput()
-          if not linkable or final_output != target.binary:
-            order_only_deps.add(final_output)
-
-        # dedup the extra link deps while preserving order
-        seen = set()
-        extra_link_deps = [
-            x for x in extra_link_deps if x not in seen and not seen.add(x)
-        ]
-
-        link_deps.extend(extra_link_deps)
-
-      tail_deps = GetConfigFlags(config, self.toolset, 'TailDependencies')
-      if tail_deps:
-        link_deps.extend(map(self.ExpandSpecial, tail_deps))
-
+      shared_library_linker_flags = shared_library_linker.GetFlags(ldflags)
+      self.ninja.variable('{0}_flags'.format(rule_name),
+                          shell.Join(shared_library_linker_flags))
       output = self.ComputeOutput(spec)
-      self.target.binary = output
+      extra_bindings.append(('soname', os.path.split(output)[1]))
+      extra_bindings.append(('dll', output))
+      if '/NOENTRY' not in shared_library_linker_flags:
+        extra_bindings.append(('implibflag',
+                               '/IMPLIB:%s' % output + '.lib'))
 
-      self.ninja.build(
-          output,
-          rule_name,
-          link_deps,
-          order_only=list(order_only_deps),
-          variables=extra_bindings)
+    else:
+      raise Exception('Target type {0} is not supported for target {1}.'
+                      .format(target_type, spec['target_name']))
 
-    except NotImplementedError:
-      # Fall back to the legacy toolchain.
+    order_only_deps = set()
 
-      command = {
-          'executable': 'link',
-          'loadable_module': 'solink_module',
-          'shared_library': 'solink',
-      }[spec['type']]
+    if 'dependencies' in spec:
+      # Two kinds of dependencies:
+      # - Linkable dependencies (like a .a or a .so): add them to the link
+      #   line.
+      # - Non-linkable dependencies (like a rule that generates a file
+      #   and writes a stamp file): add them to implicit_deps or
+      #   order_only_deps
+      extra_link_deps = []
+      for dep in spec['dependencies']:
+        target = self.target_outputs.get(dep)
+        if not target:
+          continue
+        linkable = target.Linkable()
+        if linkable:
+          extra_link_deps.append(target.binary)
 
-      implicit_deps = set()
-      order_only_deps = set()
-      solibs = set()
+        final_output = target.FinalOutput()
+        if not linkable or final_output != target.binary:
+          order_only_deps.add(final_output)
 
-      if 'dependencies' in spec:
-        # Two kinds of dependencies:
-        # - Linkable dependencies (like a .a or a .so): add them to the link
-        #   line.
-        # - Non-linkable dependencies (like a rule that generates a file
-        #   and writes a stamp file): add them to implicit_deps or
-        #   order_only_deps
-        extra_link_deps = []
-        for dep in spec['dependencies']:
-          target = self.target_outputs.get(dep)
-          if not target:
-            continue
-          linkable = target.Linkable()
-          # TODO: Starboardize.
-          if linkable:
-            if (self.flavor in microsoft_flavors and target.component_objs and
-                GetToolchainOrNone(self.flavor).GetCompilerSettings()
-                .IsUseLibraryDependencyInputs(config_name)):
-              extra_link_deps.extend(target.component_objs)
-            elif (self.flavor in microsoft_flavors and
-                  target.import_lib):
-              extra_link_deps.append(target.import_lib)
-            elif target.UsesToc(self.flavor):
-              solibs.add(target.binary)
-              implicit_deps.add(target.binary + '.TOC')
-            else:
-              extra_link_deps.append(target.binary)
+      # dedup the extra link deps while preserving order
+      seen = set()
+      extra_link_deps = [
+          x for x in extra_link_deps if x not in seen and not seen.add(x)
+      ]
 
-          final_output = target.FinalOutput()
-          if not linkable or final_output != target.binary:
-            order_only_deps.add(final_output)
+      link_deps.extend(extra_link_deps)
 
-        # dedup the extra link deps while preserving order
-        seen = set()
-        extra_link_deps = [
-            x for x in extra_link_deps if x not in seen and not seen.add(x)
-        ]
+    tail_deps = GetConfigFlags(config, self.toolset, 'TailDependencies')
+    if tail_deps:
+      link_deps.extend(map(self.ExpandSpecial, tail_deps))
 
-        link_deps.extend(extra_link_deps)
+    output = self.ComputeOutput(spec)
+    self.target.binary = output
 
-      extra_bindings = []
-      if self.is_mac_bundle:
-        output = self.ComputeMacBundleBinaryOutput()
-      else:
-        output = self.ComputeOutput(spec)
-        extra_bindings.append(('postbuilds',
-                               self.GetPostbuildCommand(spec, output, output)))
-
-      if self.flavor == 'mac':
-        ldflags = self.xcode_settings.GetLdflags(
-            config_name,
-            self.ExpandSpecial(generator_default_variables['PRODUCT_DIR']),
-            self.GypPathToNinja)
-      elif GetToolchainOrNone(self.flavor):
-        libflags = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetLibFlags(
-                config_name, self.GypPathToNinja)
-        self.WriteVariableList(
-            'libflags', gyp.common.uniquer(map(self.ExpandSpecial, libflags)))
-        is_executable = spec['type'] == 'executable'
-        manifest_name = self.GypPathToUniqueOutput(
-            self.ComputeOutputFileName(spec))
-        ldflags, manifest_files = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().GetLdFlags(
-                config_name, **{
-                    'gyp_path_to_ninja': self.GypPathToNinja,
-                    'expand_special': self.ExpandSpecial,
-                    'manifest_name': manifest_name,
-                    'is_executable': is_executable
-                })
-        self.WriteVariableList('manifests', manifest_files)
-      else:
-        ldflags = config.get('ldflags', [])
-        ldflags_host = config.get('ldflags_host', ldflags)
-
-      self.WriteVariableList(
-          'ldflags', gyp.common.uniquer(map(self.ExpandSpecial, ldflags)))
-      if ('ldflags_host' in locals()):
-        self.WriteVariableList(
-            'ldflags_host',
-            gyp.common.uniquer(map(self.ExpandSpecial, ldflags_host)))
-
-      if self.toolset == 'host':
-        libs = spec.get('libraries_host', [])
-        libs.extend(config.get('libraries_host', []))
-      else:
-        libs = spec.get('libraries', [])
-        libs.extend(config.get('libraries', []))
-
-      libraries = gyp.common.uniquer(map(self.ExpandSpecial, libs))
-
-      if self.flavor == 'mac':
-        libraries = self.xcode_settings.AdjustLibraries(libraries)
-      elif GetToolchainOrNone(self.flavor):
-        libraries = GetToolchainOrNone(
-            self.flavor).GetCompilerSettings().ProcessLibraries(libraries)
-      self.WriteVariableList('libs', libraries)
-
-      self.target.binary = output
-
-      if command in ('solink', 'solink_module'):
-        extra_bindings.append(('soname', os.path.split(output)[1]))
-        extra_bindings.append(('lib',
-                               gyp.common.EncodePOSIXShellArgument(output)))
-        # TODO: Starboardize.
-        if self.flavor in microsoft_flavors:
-          extra_bindings.append(('dll', output))
-          if '/NOENTRY' not in ldflags:
-            self.target.import_lib = output + '.lib'
-            extra_bindings.append(('implibflag',
-                                   '/IMPLIB:%s' % self.target.import_lib))
-            output = [output, self.target.import_lib]
-        else:
-          output = [output, output + '.TOC']
-
-      if len(solibs):
-        extra_bindings.append(('solibs',
-                               gyp.common.EncodePOSIXShellList(solibs)))
-
-      if self.toolset != 'target':
-        command += '_' + self.toolset
-
-      self.ninja.build(
-          output,
-          command,
-          link_deps,
-          implicit=list(implicit_deps),
-          order_only=list(order_only_deps),
-          variables=extra_bindings)
+    self.ninja.build(
+        output,
+        rule_name,
+        link_deps,
+        order_only=list(order_only_deps),
+        variables=extra_bindings)
 
   def WriteTarget(self, spec, config_name, config, link_deps, compile_deps):
     if spec['type'] == 'none':
@@ -1494,62 +1139,37 @@
       self.target.binary = self.ComputeOutput(spec)
       variables = []
 
-      try:
-        if self.toolset == 'target':
-          toolchain = GetTargetToolchain(
-              self.flavor,
-              spec=spec,
-              config_name=config_name,
-              gyp_path_to_ninja=self.GypPathToNinja
-          )
-        else:
-          toolchain = GetHostToolchain(
-              self.flavor,
-              spec=spec,
-              config_name=config_name,
-              gyp_path_to_ninja=self.GypPathToNinja
-          )
+      if self.toolset == 'target':
+        toolchain = GetTargetToolchain(
+            self.flavor,
+            spec=spec,
+            config_name=config_name,
+            gyp_path_to_ninja=self.GypPathToNinja
+        )
+      else:
+        toolchain = GetHostToolchain(
+            self.flavor,
+            spec=spec,
+            config_name=config_name,
+            gyp_path_to_ninja=self.GypPathToNinja
+        )
 
-        shell = GetShell(self.flavor)
-        static_linker = FindFirstInstanceOf(abstract.StaticLinker, toolchain)
-        if not self.is_standalone_static_library:
-          static_thin_linker = FindFirstInstanceOf(abstract.StaticThinLinker,
-                                                   toolchain)
-          if static_thin_linker:
-            static_linker = static_thin_linker
-        assert static_linker, ('Toolchain must provide static linker in order '
-                               'to build {0} for {1} platform.').format(
-                                   self.target.binary, self.toolset)
+      shell = GetShell(self.flavor)
+      static_linker = FindFirstInstanceOf(abstract.StaticLinker, toolchain)
+      if not self.is_standalone_static_library:
+        static_thin_linker = FindFirstInstanceOf(abstract.StaticThinLinker,
+                                                 toolchain)
+        if static_thin_linker:
+          static_linker = static_thin_linker
+      assert static_linker, ('Toolchain must provide static linker in order '
+                             'to build {0} for {1} platform.').format(
+                                 self.target.binary, self.toolset)
 
-        rule_name = GetNinjaRuleName(static_linker, self.toolset)
+      rule_name = GetNinjaRuleName(static_linker, self.toolset)
 
-        static_linker_flags = static_linker.GetFlags()
-        self.ninja.variable('{0}_flags'.format(rule_name),
-                            shell.Join(static_linker_flags))
-      except NotImplementedError:
-        # Fall back to the legacy toolchain.
-
-        if GetToolchainOrNone(self.flavor):
-          libflags = GetToolchainOrNone(
-              self.flavor).GetCompilerSettings().GetLibFlags(
-                  config_name, self.GypPathToNinja)
-          # TODO: Starboardize libflags vs libtool_flags.
-          variables.append(('libflags', ' '.join(libflags)))
-        postbuild = self.GetPostbuildCommand(spec, self.target.binary,
-                                             self.target.binary)
-        if postbuild:
-          variables.append(('postbuilds', postbuild))
-        if self.xcode_settings:
-          variables.append(('libtool_flags',
-                            self.xcode_settings.GetLibtoolflags(config_name)))
-        # TODO: Starboardize.
-        if (self.flavor not in (['mac'] + microsoft_flavors) and
-            not self.is_standalone_static_library):
-          rule_name = 'alink_thin'
-        else:
-          rule_name = 'alink'
-        if self.toolset != 'target':
-          rule_name += '_' + self.toolset
+      static_linker_flags = static_linker.GetFlags()
+      self.ninja.variable('{0}_flags'.format(rule_name),
+                          shell.Join(static_linker_flags))
 
       self.ninja.build(
           self.target.binary,
@@ -1660,12 +1280,6 @@
     path = self.ExpandSpecial(generator_default_variables['PRODUCT_DIR'])
     return os.path.join(path, self.xcode_settings.GetWrapperName())
 
-  def ComputeMacBundleBinaryOutput(self):
-    """Return the 'output' (full output path) to the binary in a bundle."""
-    assert self.is_mac_bundle
-    path = self.ExpandSpecial(generator_default_variables['PRODUCT_DIR'])
-    return os.path.join(path, self.xcode_settings.GetExecutablePath())
-
   def ComputeOutputFileName(self, spec, type=None):
     """Compute the filename of the final output for the current target."""
     if not type:
@@ -1936,62 +1550,6 @@
     pass
   return open(path, mode)
 
-
-def GetDefaultConcurrentLinks():
-  """Returns a best-guess for a number of concurrent links."""
-  pool_size = int(os.getenv('GYP_LINK_CONCURRENCY', 0))
-  if pool_size:
-    return pool_size
-
-  if sys.platform in ('win32', 'cygwin'):
-    import ctypes
-
-    class MEMORYSTATUSEX(ctypes.Structure):
-      _fields_ = [
-          ('dwLength', ctypes.c_ulong),
-          ('dwMemoryLoad', ctypes.c_ulong),
-          ('ullTotalPhys', ctypes.c_ulonglong),
-          ('ullAvailPhys', ctypes.c_ulonglong),
-          ('ullTotalPageFile', ctypes.c_ulonglong),
-          ('ullAvailPageFile', ctypes.c_ulonglong),
-          ('ullTotalVirtual', ctypes.c_ulonglong),
-          ('ullAvailVirtual', ctypes.c_ulonglong),
-          ('sullAvailExtendedVirtual', ctypes.c_ulonglong),
-      ]
-
-    stat = MEMORYSTATUSEX()
-    stat.dwLength = ctypes.sizeof(stat)
-    ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
-
-    # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM
-    # on a 64 GB machine.
-    mem_limit = max(1, stat.ullTotalPhys / (5 * (2**30)))  # total / 5GB
-    hard_cap = max(1, int(os.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32)))
-    return min(mem_limit, hard_cap)
-  elif sys.platform.startswith('linux'):
-    if os.path.exists('/proc/meminfo'):
-      with open('/proc/meminfo') as meminfo:
-        memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB')
-        for line in meminfo:
-          match = memtotal_re.match(line)
-          if not match:
-            continue
-          # Allow 6Gb per link on Linux because Gold is quite memory hungry
-          return max(1, int(match.group(1)) / (6 * (2**20)))
-    return 1
-  elif sys.platform == 'darwin':
-    try:
-      avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.memsize']))
-      # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
-      # 4GB per ld process allows for some more bloat.
-      return max(1, avail_bytes / (4 * (2**30)))  # total / 4GB
-    except:
-      return 1
-  else:
-    # TODO(scottmg): Implement this for other platforms.
-    return 1
-
-
 def MaybeWritePathVariable(ninja, tool, toolset):
   if tool.GetPath():
     ninja.variable('{0}_path'.format(GetNinjaRuleName(tool, toolset)),
@@ -2053,609 +1611,53 @@
   build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
   make_global_settings = data[build_file].get('make_global_settings', [])
 
-  try:
-    # To avoid duplication, platform-agnostic tools (such as stamp and copy)
-    # will be processed only in the host toolchain.
-    target_toolchain = [
-        target_tool for target_tool in GetTargetToolchain(flavor)
-        if not target_tool.IsPlatformAgnostic()
-    ]
-    host_toolchain = GetHostToolchain(flavor)
+  # To avoid duplication, platform-agnostic tools (such as stamp and copy)
+  # will be processed only in the host toolchain.
+  target_toolchain = [
+      target_tool for target_tool in GetTargetToolchain(flavor)
+      if not target_tool.IsPlatformAgnostic()
+  ]
+  host_toolchain = GetHostToolchain(flavor)
 
-    shell = GetShell(flavor)
+  shell = GetShell(flavor)
 
-    for target_tool in target_toolchain:
-      MaybeWritePathVariable(master_ninja, target_tool, 'target')
-    for host_tool in host_toolchain:
-      MaybeWritePathVariable(master_ninja, host_tool, 'host')
-    master_ninja.newline()
+  for target_tool in target_toolchain:
+    MaybeWritePathVariable(master_ninja, target_tool, 'target')
+  for host_tool in host_toolchain:
+    MaybeWritePathVariable(master_ninja, host_tool, 'host')
+  master_ninja.newline()
 
-    for target_tool in target_toolchain:
-      MaybeWriteExtraFlagsVariable(master_ninja, target_tool, 'target', shell)
-    for host_tool in host_toolchain:
-      MaybeWriteExtraFlagsVariable(master_ninja, host_tool, 'host', shell)
-    master_ninja.newline()
+  for target_tool in target_toolchain:
+    MaybeWriteExtraFlagsVariable(master_ninja, target_tool, 'target', shell)
+  for host_tool in host_toolchain:
+    MaybeWriteExtraFlagsVariable(master_ninja, host_tool, 'host', shell)
+  master_ninja.newline()
 
-    for target_tool in target_toolchain:
-      MaybeWritePool(master_ninja, target_tool, 'target')
-    for host_tool in host_toolchain:
-      MaybeWritePool(master_ninja, host_tool, 'host')
-    master_ninja.newline()
+  for target_tool in target_toolchain:
+    MaybeWritePool(master_ninja, target_tool, 'target')
+  for host_tool in host_toolchain:
+    MaybeWritePool(master_ninja, host_tool, 'host')
+  master_ninja.newline()
 
-    for target_tool in target_toolchain:
-      MaybeWriteRule(master_ninja, target_tool, 'target', shell)
-    for host_tool in host_toolchain:
-      MaybeWriteRule(master_ninja, host_tool, 'host', shell)
-    master_ninja.newline()
+  for target_tool in target_toolchain:
+    MaybeWriteRule(master_ninja, target_tool, 'target', shell)
+  for host_tool in host_toolchain:
+    MaybeWriteRule(master_ninja, host_tool, 'host', shell)
+  master_ninja.newline()
 
-    # Copy the gyp-win-tool to the toplevel_build.
-    # Also write python to the master_ninja.
-    if is_windows:
-      gyp.common.CopyTool(flavor, toplevel_build)
-      if GetToolchainOrNone(flavor):
-        GetToolchainOrNone(flavor).GenerateEnvironmentFiles(
-            toplevel_build, generator_flags, OpenOutput)
-      else:
-        gyp.msvs_emulation.GenerateEnvironmentFiles(toplevel_build,
-            generator_flags, OpenOutput)
-      master_ninja.variable('python', sys.executable)
-      master_ninja.newline()
-
-  except NotImplementedError:
-    # Fall back to the legacy toolchain.
-
-    # Put build-time support tools in out/{config_name}.
+  # Copy the gyp-win-tool to the toplevel_build.
+  # Also write python to the master_ninja.
+  if is_windows:
     gyp.common.CopyTool(flavor, toplevel_build)
-
-    # Grab make settings for CC/CXX.
-    # The rules are
-    # - The priority from low to high is gcc/g++, the 'make_global_settings' in
-    #   gyp, the environment variable.
-    # - If there is no 'make_global_settings' for CC.host/CXX.host or
-    #   'CC_host'/'CXX_host' enviroment variable, cc_host/cxx_host should be set
-    #   to cc/cxx.
-    if (flavor in sony_flavors and is_windows):
-      cc = 'cl.exe'
-      cxx = 'cl.exe'
-      ld = 'link.exe'
-      gyp.msvs_emulation.GenerateEnvironmentFiles(toplevel_build,
-                                                  generator_flags, OpenOutput)
-      ld_host = '$ld'
-    elif GetToolchainOrNone(flavor):
-      # TODO: starboardize.
-      cc = 'cl.exe'
-      cxx = 'cl.exe'
-      ld = 'link.exe'
+    if GetToolchainOrNone(flavor):
       GetToolchainOrNone(flavor).GenerateEnvironmentFiles(
           toplevel_build, generator_flags, OpenOutput)
-      ld_host = '$ld'
     else:
-      cc = 'gcc'
-      cxx = 'g++'
-      ld = '$cxx'
-      ld_host = '$cxx_host'
-
-    cc_host = None
-    cxx_host = None
-    cc_host_global_setting = None
-    cxx_host_global_setting = None
-
-    build_to_root = InvertRelativePath(build_dir)
-    for key, value in make_global_settings:
-      if key == 'CC':
-        cc = os.path.join(build_to_root, value)
-      if key == 'CXX':
-        cxx = os.path.join(build_to_root, value)
-      if key == 'LD':
-        ld = os.path.join(build_to_root, value)
-      if key == 'CC.host':
-        cc_host = os.path.join(build_to_root, value)
-        cc_host_global_setting = value
-      if key == 'CXX.host':
-        cxx_host = os.path.join(build_to_root, value)
-        cxx_host_global_setting = value
-      if key == 'LD.host':
-        ld_host = os.path.join(build_to_root, value)
-
-    flock = 'flock'
-    if flavor == 'mac':
-      flock = './gyp-mac-tool flock'
-    cc = GetEnvironFallback(['CC_target', 'CC'], cc)
-    master_ninja.variable('cc', cc)
-    cxx = GetEnvironFallback(['CXX_target', 'CXX'], cxx)
-    master_ninja.variable('cxx', cxx)
-    ld = GetEnvironFallback(['LD_target', 'LD'], ld)
-    rc = GetEnvironFallback(['RC'], 'rc.exe')
-
-    if not cc_host:
-      cc_host = cc
-    if not cxx_host:
-      cxx_host = cxx
-
-    # gyp-win-tool wrappers have a winpython only flock implementation.
-    if sys.platform == 'cygwin':
-      python_exec = '$python'
-    else:
-      python_exec = sys.executable
-
-    ar_flags = ''
-    if flavor in microsoft_flavors:
-      master_ninja.variable('ld', ld)
-      master_ninja.variable('ar', os.environ.get('AR', 'ar'))
-      master_ninja.variable('rc', rc)
-      master_ninja.variable('asm', 'ml.exe')
-      master_ninja.variable('mt', 'mt.exe')
-      master_ninja.variable('use_dep_database', '1')
-    elif flavor in sony_flavors:
-      # Require LD to be set.
-      master_ninja.variable('ld', os.environ.get('LD'))
-      master_ninja.variable('ar', os.environ.get('AR', 'ar'))
-      ar_flags = os.environ.get('ARFLAGS', 'rcs')
-      master_ninja.variable('arFlags', ar_flags)
-      # On Sony, when we use orbis-snarl.exe with a response file, we cannot
-      # pass it flags (like 'rcs'), so ARFLAGS is likely set to '' for this
-      # platform.  In that case, do not append the thin archive 'T' flag
-      # to the flags string.
-      thin_flag_to_add = ''
-      if len(ar_flags) >= 1 and ar_flags.find('T') == -1:
-        thin_flag_to_add = 'T'
-      master_ninja.variable('arThinFlags', ar_flags + thin_flag_to_add)
-
-    else:
-      master_ninja.variable('ld', ld)
-      master_ninja.variable('ar', GetEnvironFallback(['AR_target', 'AR'], 'ar'))
-      ar_flags = os.environ.get('ARFLAGS', 'rcs')
-      master_ninja.variable('arFlags', ar_flags)
-      thin_flag_to_add = ''
-      if ar_flags.find('T') == -1:
-        thin_flag_to_add = 'T'
-      master_ninja.variable('arThinFlags', ar_flags + thin_flag_to_add)
-    master_ninja.variable('ar_host', GetEnvironFallback(['AR_host'], 'ar'))
-    cc_host = GetEnvironFallback(['CC_host'], cc_host)
-    cxx_host = GetEnvironFallback(['CXX_host'], cxx_host)
-    ld_host = GetEnvironFallback(['LD_host'], ld_host)
-    arflags_host = GetEnvironFallback(['ARFLAGS_host'], ar_flags)
-    arthinflags_host = GetEnvironFallback(['ARTHINFLAGS_host'], arflags_host)
-
-    # The environment variable could be used in 'make_global_settings', like
-    # ['CC.host', '$(CC)'] or ['CXX.host', '$(CXX)'], transform them here.
-    if '$(CC)' in cc_host and cc_host_global_setting:
-      cc_host = cc_host_global_setting.replace('$(CC)', cc)
-    if '$(CXX)' in cxx_host and cxx_host_global_setting:
-      cxx_host = cxx_host_global_setting.replace('$(CXX)', cxx)
-    master_ninja.variable('cc_host', cc_host)
-    master_ninja.variable('cxx_host', cxx_host)
-    master_ninja.variable('arFlags_host', arflags_host)
-    master_ninja.variable('arThinFlags_host', arthinflags_host)
-    master_ninja.variable('ld_host', ld_host)
-
-    if sys.platform == 'cygwin':
-      python_path = cygpath.to_nt(
-          '/cygdrive/c/python_27_amd64/files/python.exe')
-    else:
-      python_path = 'python'
-    master_ninja.variable('python', python_path)
+      gyp.msvs_emulation.GenerateEnvironmentFiles(toplevel_build,
+          generator_flags, OpenOutput)
+    master_ninja.variable('python', sys.executable)
     master_ninja.newline()
 
-    master_ninja.pool('link_pool', depth=GetDefaultConcurrentLinks())
-    master_ninja.newline()
-
-    if flavor not in microsoft_flavors:
-      if flavor in sony_flavors:
-        # uca := Unnamed Console A
-        dep_format = 'uca'
-        master_ninja.rule(
-            'cc',
-            description='CC $out',
-            command=('$cc @$out.rsp'),
-            rspfile='$out.rsp',
-            rspfile_content=('-c $in -o $out '
-                             '-MMD $defines $includes $cflags $cflags_c '
-                             '$cflags_pch_c'),
-            depfile='$out_no_ext.d',
-            deps='gcc',
-            depformat=dep_format)
-        master_ninja.rule(
-            'cxx',
-            description='CXX $out',
-            command=('$cxx @$out.rsp'),
-            rspfile='$out.rsp',
-            rspfile_content=('-c $in -o $out '
-                             '-MMD $defines $includes $cflags $cflags_cc '
-                             '$cflags_pch_cc'),
-            depfile='$out_no_ext.d',
-            deps='gcc',
-            depformat=dep_format)
-      else:
-        master_ninja.rule(
-            'cc',
-            description='CC $out',
-            command=('$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c '
-                     '$cflags_pch_c -c $in -o $out'),
-            deps='gcc',
-            depfile='$out.d')
-        master_ninja.rule(
-            'cc_s',
-            description='CC $out',
-            command=('$cc $defines $includes $cflags $cflags_c '
-                     '$cflags_pch_c -c $in -o $out'))
-        master_ninja.rule(
-            'cxx',
-            description='CXX $out',
-            command=(
-                '$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc '
-                '$cflags_pch_cc -c $in -o $out'),
-            deps='gcc',
-            depfile='$out.d')
-
-    else:
-      cc_command = ('$cc /nologo /showIncludes /FC '
-                    '@$out.rsp /c $in /Fo$out /Fd$pdbname ')
-      cxx_command = ('$cxx /nologo /showIncludes /FC '
-                     '@$out.rsp /c $in /Fo$out /Fd$pdbname ')
-      master_ninja.rule(
-          'cc',
-          description='CC $out',
-          command=cc_command,
-          deps='msvc',
-          rspfile='$out.rsp',
-          rspfile_content='$defines $includes $cflags $cflags_c')
-      master_ninja.rule(
-          'cxx',
-          description='CXX $out',
-          command=cxx_command,
-          deps='msvc',
-          rspfile='$out.rsp',
-          rspfile_content='$defines $includes $cflags $cflags_cc')
-
-      master_ninja.rule(
-          'rc',
-          description='RC $in',
-          # Note: $in must be last otherwise rc.exe complains.
-          command=('%s gyp-win-tool rc-wrapper '
-                   '$arch $rc $defines $includes $rcflags /fo$out $in' %
-                   python_exec))
-      master_ninja.rule(
-          'asm',
-          description='ASM $in',
-          command=(
-              '%s gyp-win-tool asm-wrapper '
-              '$arch $asm $defines $includes /c /Fo $out $in' % python_exec))
-
-    if flavor not in (['mac'] + microsoft_flavors):
-      alink_command = 'rm -f $out && $ar $arFlags $out @$out.rsp'
-      # TODO: Use rcsT on Linux only.
-      alink_thin_command = 'rm -f $out && $ar $arThinFlags $out @$out.rsp'
-
-      ld_cmd = '$ld'
-
-      if flavor in sony_flavors and is_windows:
-        alink_command = 'cmd.exe /c ' + alink_command
-        alink_thin_command = 'cmd.exe /c ' + alink_thin_command
-        ld_cmd = '%s gyp-win-tool link-wrapper $arch $ld' % python_exec
-
-      master_ninja.rule(
-          'alink',
-          description='AR $out',
-          command=alink_command,
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline')
-      master_ninja.rule(
-          'alink_thin',
-          description='AR $out',
-          command=alink_thin_command,
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline')
-
-      # This allows targets that only need to depend on $lib's API to declare
-      # an order-only dependency on $lib.TOC and avoid relinking such
-      # downstream dependencies when $lib changes only in non-public ways.
-      # The resulting string leaves an uninterpolated %{suffix} which
-      # is used in the final substitution below.
-      mtime_preserving_solink_base = (
-          'if [ ! -e $lib -o ! -e ${lib}.TOC ]; then %(solink)s && '
-          '%(extract_toc)s > ${lib}.TOC; else %(solink)s && %(extract_toc)s '
-          '> ${lib}.tmp && if ! cmp -s ${lib}.tmp ${lib}.TOC; then mv '
-          '${lib}.tmp ${lib}.TOC ; fi; fi' % {
-              'solink': (
-                  ld_cmd +
-                  ' -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)s'),
-              'extract_toc': ('{ readelf -d ${lib} | grep SONAME ; '
-                              'nm -gD -f p ${lib} | cut -f1-2 -d\' \'; }')
-          })
-
-      master_ninja.rule(
-          'solink',
-          description='SOLINK $lib',
-          restat=True,
-          command=(mtime_preserving_solink_base % {
-              'suffix':
-                  '-Wl,--whole-archive $in $solibs -Wl,--no-whole-archive '
-                  '$libs'
-          }))
-      master_ninja.rule(
-          'solink_module',
-          description='SOLINK(module) $lib',
-          restat=True,
-          command=(mtime_preserving_solink_base % {
-              'suffix': '-Wl,--start-group $in $solibs -Wl,--end-group $libs'
-          }))
-
-      if flavor in sony_flavors:
-        # Sony linkers don't know about rpath.
-        rpath = ''
-      else:
-        rpath = r'-Wl,-rpath=\$$ORIGIN/lib'
-
-      master_ninja.rule(
-          'link',
-          description='LINK $out',
-          command=(ld_cmd + ' @$out.rsp'),
-          rspfile='$out.rsp',
-          rspfile_content=('$ldflags -o $out %s -Wl,--start-group $in $solibs '
-                           '-Wl,--end-group $libs' % rpath),
-          pool='link_pool')
-    elif flavor in microsoft_flavors:
-      master_ninja.rule(
-          'alink',
-          description='LIB $out',
-          command=(
-              '%s gyp-win-tool link-wrapper $arch '
-              '$ar /nologo /ignore:4221 /OUT:$out @$out.rsp' % python_exec),
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline $libflags')
-      dlldesc = 'LINK(DLL) $dll'
-      dllcmd = ('%s gyp-win-tool link-wrapper $arch '
-                '$ld /nologo $implibflag /DLL /OUT:$dll '
-                '/PDB:$dll.pdb @$dll.rsp' % python_exec)
-      if not flavor in microsoft_flavors:
-        # XB1 doesn't need a manifest.
-        dllcmd += (
-            ' && %s gyp-win-tool manifest-wrapper $arch '
-            '$mt -nologo -manifest $manifests -out:$dll.manifest' % python_exec)
-      master_ninja.rule(
-          'solink',
-          description=dlldesc,
-          command=dllcmd,
-          rspfile='$dll.rsp',
-          rspfile_content='$libs $in_newline $ldflags',
-          restat=True)
-      master_ninja.rule(
-          'solink_module',
-          description=dlldesc,
-          command=dllcmd,
-          rspfile='$dll.rsp',
-          rspfile_content='$libs $in_newline $ldflags',
-          restat=True)
-      # Note that ldflags goes at the end so that it has the option of
-      # overriding default settings earlier in the command line.
-      if flavor == 'win':
-        link_command = ('%s gyp-win-tool link-wrapper $arch '
-                        '$ld /nologo /OUT:$out /PDB:$out.pdb @$out.rsp && '
-                        '%s gyp-win-tool manifest-wrapper $arch '
-                        '$mt -nologo -manifest $manifests -out:$out.manifest' %
-                        (python_exec, python_exec))
-      else:
-        assert flavor in microsoft_flavors
-        # XB1 doesn't need a manifest.
-        link_command = (
-            '%s gyp-win-tool link-wrapper $arch '
-            '$ld /nologo /OUT:$out /PDB:$out.pdb @$out.rsp' % (python_exec))
-
-      master_ninja.rule(
-          'link',
-          description='LINK $out',
-          command=link_command,
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline $libs $ldflags',
-          pool='link_pool')
-    else:
-      master_ninja.rule(
-          'objc',
-          description='OBJC $out',
-          command=(
-              '$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc '
-              '$cflags_pch_objc -c $in -o $out'),
-          depfile='$out.d')
-      master_ninja.rule(
-          'objcxx',
-          description='OBJCXX $out',
-          command=(
-              '$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc '
-              '$cflags_pch_objcc -c $in -o $out'),
-          depfile='$out.d')
-      master_ninja.rule(
-          'alink',
-          description='LIBTOOL-STATIC $out, POSTBUILDS',
-          command='rm -f $out && '
-          './gyp-mac-tool filter-libtool libtool $libtool_flags '
-          '-static -o $out $in'
-          '$postbuilds')
-
-      # Record the public interface of $lib in $lib.TOC. See the corresponding
-      # comment in the posix section above for details.
-      mtime_preserving_solink_base = (
-          'if [ ! -e $lib -o ! -e ${lib}.TOC ] || '
-          # Always force dependent targets to relink if this library
-          # reexports something. Handling this correctly would require
-          # recursive TOC dumping but this is rare in practice, so punt.
-          'otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then '
-          '%(solink)s && %(extract_toc)s > ${lib}.TOC; '
-          'else '
-          '%(solink)s && %(extract_toc)s > ${lib}.tmp && '
-          'if ! cmp -s ${lib}.tmp ${lib}.TOC; then '
-          'mv ${lib}.tmp ${lib}.TOC ; '
-          'fi; '
-          'fi' % {
-              'solink': '$ld -shared $ldflags -o $lib %(suffix)s',
-              'extract_toc':
-                  '{ otool -l $lib | grep LC_ID_DYLIB -A 5; '
-                  'nm -gP $lib | cut -f1-2 -d\' \' | grep -v U$$; true; }'
-          })
-
-      # TODO(thakis): The solink_module rule is likely wrong. Xcode seems to
-      # pass -bundle -single_module here (for osmesa.so).
-      master_ninja.rule(
-          'solink',
-          description='SOLINK $lib, POSTBUILDS',
-          restat=True,
-          command=(mtime_preserving_solink_base % {
-              'suffix': '$in $solibs $libs$postbuilds'
-          }))
-      master_ninja.rule(
-          'solink_module',
-          description='SOLINK(module) $lib, POSTBUILDS',
-          restat=True,
-          command=(mtime_preserving_solink_base % {
-              'suffix': '$in $solibs $libs$postbuilds'
-          }))
-
-      master_ninja.rule(
-          'link',
-          description='LINK $out, POSTBUILDS',
-          command=('$ld $ldflags -o $out '
-                   '$in $solibs $libs$postbuilds'),
-          pool='link_pool')
-      master_ninja.rule(
-          'infoplist',
-          description='INFOPLIST $out',
-          command=('$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && '
-                   'plutil -convert xml1 $out $out'))
-      master_ninja.rule(
-          'mac_tool',
-          description='MACTOOL $mactool_cmd $in',
-          command='$env ./gyp-mac-tool $mactool_cmd $in $out')
-      master_ninja.rule(
-          'package_framework',
-          description='PACKAGE FRAMEWORK $out, POSTBUILDS',
-          command='./gyp-mac-tool package-framework $out $version$postbuilds '
-          '&& touch $out')
-    if flavor in microsoft_flavors:
-      master_ninja.rule(
-          'stamp',
-          description='STAMP $out',
-          command='%s gyp-win-tool stamp $out' % python_exec)
-      master_ninja.rule(
-          'copy',
-          description='COPY $in $out',
-          command='%s gyp-win-tool recursive-mirror $in $out' % python_exec)
-    elif sys.platform in ['cygwin', 'win32']:
-      master_ninja.rule(
-          'stamp',
-          description='STAMP $out',
-          command='$python gyp-win-tool stamp $out')
-      master_ninja.rule(
-          'copy',
-          description='COPY $in $out',
-          command='$python gyp-win-tool recursive-mirror $in $out')
-    else:
-      master_ninja.rule(
-          'stamp', description='STAMP $out', command='${postbuilds}touch $out')
-      master_ninja.rule(
-          'copy',
-          description='COPY $in $out',
-          command='rm -rf $out && cp -af $in $out')
-    master_ninja.newline()
-
-    # Output host building rules
-    if is_windows:
-      cc_command = ('$cc /nologo /showIncludes /FC '
-                    '@$out.rsp /c $in /Fo$out /Fd$pdbname ')
-      cxx_command = ('$cxx /nologo /showIncludes /FC '
-                     '@$out.rsp /c $in /Fo$out /Fd$pdbname ')
-      master_ninja.rule(
-          'cc_host',
-          description='CC_HOST $out',
-          command=cc_command,
-          deps='msvc',
-          rspfile='$out.rsp',
-          rspfile_content='$defines $includes $cflags_host $cflags_c_host')
-      master_ninja.rule(
-          'cxx_host',
-          description='CXX_HOST $out',
-          command=cxx_command,
-          deps='msvc',
-          rspfile='$out.rsp',
-          rspfile_content='$defines $includes $cflags_host $cflags_cc_host')
-
-      master_ninja.rule(
-          'alink_host',
-          description='LIB_HOST $out',
-          command=(
-              '%s gyp-win-tool link-wrapper $arch '
-              '$ar /nologo /ignore:4221 /OUT:$out @$out.rsp' % python_exec),
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline $libflags_host')
-
-      master_ninja.rule(
-          'alink_thin_host',
-          description='LIB_HOST $out',
-          command=(
-              '%s gyp-win-tool link-wrapper $arch '
-              '$ar /nologo /ignore:4221 /OUT:$out @$out.rsp' % python_exec),
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline $libflags_host')
-
-      link_command = (
-          '%s gyp-win-tool link-wrapper $arch '
-          '$ld /nologo /OUT:$out /PDB:$out.pdb @$out.rsp' % (python_exec))
-
-      master_ninja.rule(
-          'link_host',
-          description='LINK_HOST $out',
-          command=link_command,
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline $libs $ldflags',
-          pool='link_pool')
-    else:
-      cc_command = 'bash -c "$cc_host @$out.rsp"'
-      cxx_command = 'bash -c "$cxx_host @$out.rsp"'
-      master_ninja.rule(
-          'cc_host',
-          description='CC_HOST $out',
-          command=cc_command,
-          rspfile='$out.rsp',
-          rspfile_content=('-MMD -MF $out.d $defines $includes $cflags_host '
-                           '$cflags_c_host $cflags_pch_c -c $in -o $out'),
-          depfile='$out.d')
-      master_ninja.rule(
-          'cxx_host',
-          description='CXX_HOST $out',
-          command=cxx_command,
-          rspfile='$out.rsp',
-          rspfile_content=('-MMD -MF $out.d $defines $includes $cflags_host '
-                           '$cflags_cc_host $cflags_pch_cc -c $in -o $out'),
-          depfile='$out.d')
-
-      alink_command = 'rm -f $out && $ar_host $arFlags_host $out @$out.rsp'
-      alink_thin_command = ('rm -f $out && $ar_host $arThinFlags_host $out '
-                            '@$out.rsp')
-
-      master_ninja.rule(
-          'alink_host',
-          description='AR_HOST $out',
-          command='bash -c "' + alink_command + '"',
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline')
-      master_ninja.rule(
-          'alink_thin_host',
-          description='AR_HOST $out',
-          command='bash -c "' + alink_thin_command + '"',
-          rspfile='$out.rsp',
-          rspfile_content='$in_newline')
-      beginlinkinlibs = ''
-      endlinkinlibs = ''
-      if is_linux:
-        beginlinkinlibs = '-Wl,--start-group'
-        endlinkinlibs = '-Wl,--end-group'
-      rpath = '-Wl,-rpath=\$$ORIGIN/lib'
-      master_ninja.rule(
-          'link_host',
-          description='LINK_HOST $out',
-          command=('bash -c "$ld_host $ldflags_host -o $out %s '
-                   '%s $in $solibs %s $libs"' % (rpath, beginlinkinlibs,
-                                                 endlinkinlibs)))
-
   all_targets = set()
   for build_file in params['build_files']:
     for target in gyp.common.AllTargets(target_list, target_dicts,