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,
