Update from https://crrev.com/320931
- Add IsFlat() definition to ui/gfx/transform
- Change sky's uses of skia's FilterLevel to FilterQuality
- Update cc_strip_video.patch

R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/1013463003
diff --git a/DEPS b/DEPS
index 930c1de..8280b31 100644
--- a/DEPS
+++ b/DEPS
@@ -21,11 +21,11 @@
   'chromium_git': 'https://chromium.googlesource.com',
   'dart_svn': 'https://dart.googlecode.com',
   'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
-  'skia_revision': 'd1783aefcc0da86c5ff1d124c54704252d817621',
+  'skia_revision': 'cdeca446197329de91d87d12ad689d03d7e4d261',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and V8 without interference from each other.
-  'v8_revision': '8f7dfb46871191fa9c96f9030d88be6757d46eab',
+  'v8_revision': '2a8ff45e5c7fce5037cf975c4997718c324744dd',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -49,7 +49,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lss
   # and whatever else without interference from each other.
-  'lss_revision': '952107fa7cea0daaabead28c0e92d579bee517eb',
+  'lss_revision': 'e079768b7e3a94dcbe7d338496c0c3bde7151b6e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nss
   # and whatever else without interference from each other.
@@ -124,7 +124,7 @@
    'https://boringssl.googlesource.com/boringssl.git' + '@' +  Var('boringssl_revision'),
 
   'src/tools/gyp':
-    Var('chromium_git') + '/external/gyp.git' + '@' + '4a9b712d5cb4a5ba7a9950128a7219569caf7263',
+    Var('chromium_git') + '/external/gyp.git' + '@' + 'd174d75bf69c682cb62af9187879e01513b35e52',
 }
 
 
@@ -150,7 +150,7 @@
         Var('chromium_git') + '/external/jsr-305.git' + '@' + '642c508235471f7220af6d5df2d3210e3bfc0919',
 
     'src/third_party/android_tools':
-     Var('chromium_git') + '/android_tools.git' + '@' + 'fd5a8ec0c75d487635f7e6bd3bdc90eb23eba941',
+     Var('chromium_git') + '/android_tools.git' + '@' + '98a434576d8d9a65f9bdb8ea161e158142c0c5e5',
 
     'src/third_party/appurify-python/src':
      Var('chromium_git') + '/external/github.com/appurify/appurify-python.git' + '@' + 'ee7abd5c5ae3106f72b2a0b9d2cb55094688e867',
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 69f366e..f103446 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -9,6 +9,10 @@
   import("//build/config/android/rules.gni")
 }
 
+config("base_implementation") {
+  defines = [ "BASE_IMPLEMENTATION" ]
+}
+
 source_set("base_paths") {
   sources = [
     "base_paths.cc",
@@ -34,7 +38,7 @@
     ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ ":base_implementation" ]
 
   deps = [
     "//base/memory",
@@ -607,7 +611,7 @@
     "sys_info_openbsd.cc",
   ]
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ ":base_implementation" ]
 
   deps = [
     ":base_static",
@@ -630,7 +634,7 @@
   # Allow more direct string conversions on platforms with native utf8
   # strings
   if (is_mac || is_ios || is_chromeos) {
-    defines += [ "SYSTEM_NATIVE_UTF8" ]
+    defines = [ "SYSTEM_NATIVE_UTF8" ]
   }
 
   if (is_android) {
@@ -758,12 +762,9 @@
     configs += linux_configs
     all_dependent_configs = linux_configs
 
-    defines += [ "USE_SYMBOLIZE" ]
-
     # These dependencies are not required on Android, and in the case
     # of xdg_mime must be excluded due to licensing restrictions.
     deps += [
-      "//base/third_party/symbolize",
       "//base/third_party/xdg_mime",
       "//base/third_party/xdg_user_dirs",
     ]
@@ -1135,7 +1136,6 @@
     "mac/scoped_sending_event_unittest.mm",
     "md5_unittest.cc",
     "memory/aligned_memory_unittest.cc",
-    "memory/discardable_memory_unittest.cc",
     "memory/discardable_shared_memory_unittest.cc",
     "memory/linked_ptr_unittest.cc",
     "memory/ref_counted_memory_unittest.cc",
@@ -1283,8 +1283,6 @@
     "win/wrapped_window_proc_unittest.cc",
   ]
 
-  defines = []
-
   deps = [
     ":base",
     ":i18n",
@@ -1304,7 +1302,7 @@
   # Allow more direct string conversions on platforms with native utf8
   # strings
   if (is_mac || is_ios || is_chromeos) {
-    defines += [ "SYSTEM_NATIVE_UTF8" ]
+    defines = [ "SYSTEM_NATIVE_UTF8" ]
   }
 
   if (is_android) {
@@ -1341,7 +1339,6 @@
   if (is_linux) {
     sources -= [ "file_version_info_unittest.cc" ]
     sources += [ "nix/xdg_util_unittest.cc" ]
-    defines += [ "USE_SYMBOLIZE" ]
     if (use_glib) {
       configs += [ "//build/config/linux:glib" ]
     }
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index c7d8527..484c6bc 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -5,6 +5,8 @@
 package org.chromium.base.library_loader;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.AsyncTask;
 import android.os.SystemClock;
 import android.util.Log;
 
@@ -13,6 +15,13 @@
 import org.chromium.base.JNINamespace;
 import org.chromium.base.TraceEvent;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.HashMap;
 import java.util.Locale;
 
 import javax.annotation.Nullable;
@@ -87,6 +96,9 @@
     // final (like now) or be protected in some way (volatile of synchronized).
     private final int mLibraryProcessType;
 
+    // Library -> Path it has been loaded from.
+    private final HashMap<String, String> mLoadedFrom;
+
     /**
      * @param libraryProcessType the process the shared library is loaded in. refer to
      *                           LibraryProcessType for possible values.
@@ -106,6 +118,7 @@
 
     private LibraryLoader(int libraryProcessType) {
         mLibraryProcessType = libraryProcessType;
+        mLoadedFrom = new HashMap<String, String>();
     }
 
     /**
@@ -189,6 +202,68 @@
         }
     }
 
+    private void prefetchLibraryToMemory(Context context, String library) {
+        String libFilePath = mLoadedFrom.get(library);
+        if (libFilePath == null) {
+            Log.i(TAG, "File path not found for " + library);
+            return;
+        }
+        String apkFilePath = context.getApplicationInfo().sourceDir;
+        if (libFilePath.equals(apkFilePath)) {
+            // TODO(lizeb): Make pre-faulting work with libraries loaded from the APK.
+            return;
+        }
+        try {
+            TraceEvent.begin("LibraryLoader.prefetchLibraryToMemory");
+            File file = new File(libFilePath);
+            int size = (int) file.length();
+            FileChannel channel = new RandomAccessFile(file, "r").getChannel();
+            MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, size);
+            // TODO(lizeb): Figure out whether walking the entire library is really necessary.
+            // Page size is 4096 for all current Android architectures.
+            for (int index = 0; index < size; index += 4096) {
+                // Note: Testing shows that neither the Java compiler nor
+                // Dalvik/ART eliminates this loop.
+                buffer.get(index);
+            }
+        } catch (FileNotFoundException e) {
+            Log.w(TAG, "Library file not found: " + e);
+        } catch (IOException e) {
+            Log.w(TAG, "Impossible to map the file: " + e);
+        } finally {
+            TraceEvent.end("LibraryLoader.prefetchLibraryToMemory");
+        }
+    }
+
+    /** Prefetches the native libraries in a background thread.
+     *
+     * Launches an AsyncTask that maps the native libraries into memory, reads a
+     * part of each page from it, than unmaps it. This is done to warm up the
+     * page cache, turning hard page faults into soft ones.
+     *
+     * This is done this way, as testing shows that fadvise(FADV_WILLNEED) is
+     * detrimental to the startup time.
+     *
+     * @param context the application context.
+     */
+    public void asyncPrefetchLibrariesToMemory(final Context context) {
+        new AsyncTask<Void, Void, Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                // Note: AsyncTasks are executed in a low priority background
+                // thread, which is the desired behavior here since we don't
+                // want to interfere with the rest of the initialization.
+                for (String library : NativeLibraries.LIBRARIES) {
+                    if (Linker.isChromiumLinkerLibrary(library)) {
+                        continue;
+                    }
+                    prefetchLibraryToMemory(context, library);
+                }
+                return null;
+            }
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+    }
+
     // Invoke System.loadLibrary(...), triggering JNI_OnLoad in native code
     private void loadAlreadyLocked(
             Context context, boolean shouldDeleteFallbackLibraries)
@@ -263,6 +338,7 @@
                                                 ? "using no map executable support fallback"
                                                 : "directly")
                                         + " from within " + apkFilePath);
+                                mLoadedFrom.put(library, apkFilePath);
                             } else {
                                 // Unpack library fallback.
                                 Log.i(TAG, "Loading " + library
@@ -272,10 +348,14 @@
                                         context, library);
                                 fallbackWasUsed = true;
                                 Log.i(TAG, "Built fallback library " + libFilePath);
+                                mLoadedFrom.put(library, libFilePath);
                             }
                         } else {
                             // The library is in its own file.
                             Log.i(TAG, "Loading " + library);
+                            ApplicationInfo applicationInfo = context.getApplicationInfo();
+                            mLoadedFrom.put(library, new File(applicationInfo.nativeLibraryDir,
+                                                              libFilePath).getAbsolutePath());
                         }
 
                         // Load the library.
diff --git a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java
index 08c314f..c1f6d36 100644
--- a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java
+++ b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java
@@ -43,6 +43,16 @@
     }
 
     /**
+     * Records a sample in a count histogram of the given name. This is the Java equivalent of the
+     * UMA_HISTOGRAM_COUNTS C++ macro.
+     * @param name name of the histogram
+     * @param sample sample to be recorded, at least 1 and at most 999999
+     */
+    public static void recordCountHistogram(String name, int sample) {
+        nativeRecordCountHistogram(name, System.identityHashCode(name), sample);
+    }
+
+    /**
      * Records a sample in a histogram of times. Useful for recording short durations. This is the
      * Java equivalent of the UMA_HISTOGRAM_TIMES C++ macro.
      * @param name name of the histogram
@@ -123,6 +133,7 @@
     private static native void nativeRecordBooleanHistogram(String name, int key, boolean sample);
     private static native void nativeRecordEnumeratedHistogram(
             String name, int key, int sample, int boundary);
+    private static native void nativeRecordCountHistogram(String name, int key, int sample);
 
     private static native int nativeGetHistogramValueCountForTesting(String name, int sample);
     private static native void nativeInitialize();
diff --git a/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java b/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java
index f0489d3..24af056 100644
--- a/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java
+++ b/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java
@@ -80,6 +80,47 @@
     }
 
     /**
+     * Tests recording of count histograms.
+     */
+    @SmallTest
+    public void testRecordCountHistogram() {
+        String histogram = "HelloWorld.CountMetric";
+        HistogramDelta zeroCount = new HistogramDelta(histogram, 0);
+        HistogramDelta oneCount = new HistogramDelta(histogram, 1);
+        HistogramDelta twoCount = new HistogramDelta(histogram, 2);
+        HistogramDelta eightThousandCount = new HistogramDelta(histogram, 8000);
+
+        assertEquals(0, zeroCount.getDelta());
+        assertEquals(0, oneCount.getDelta());
+        assertEquals(0, twoCount.getDelta());
+        assertEquals(0, eightThousandCount.getDelta());
+
+        RecordHistogram.recordCountHistogram(histogram, 0);
+        assertEquals(1, zeroCount.getDelta());
+        assertEquals(0, oneCount.getDelta());
+        assertEquals(0, twoCount.getDelta());
+        assertEquals(0, eightThousandCount.getDelta());
+
+        RecordHistogram.recordCountHistogram(histogram, 0);
+        assertEquals(2, zeroCount.getDelta());
+        assertEquals(0, oneCount.getDelta());
+        assertEquals(0, twoCount.getDelta());
+        assertEquals(0, eightThousandCount.getDelta());
+
+        RecordHistogram.recordCountHistogram(histogram, 2);
+        assertEquals(2, zeroCount.getDelta());
+        assertEquals(0, oneCount.getDelta());
+        assertEquals(1, twoCount.getDelta());
+        assertEquals(0, eightThousandCount.getDelta());
+
+        RecordHistogram.recordCountHistogram(histogram, 8000);
+        assertEquals(2, zeroCount.getDelta());
+        assertEquals(0, oneCount.getDelta());
+        assertEquals(1, twoCount.getDelta());
+        assertEquals(1, eightThousandCount.getDelta());
+    }
+
+    /**
      * Tests recording of custom times histograms.
      */
     @SmallTest
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index a2de00a..1b715dc 100644
--- a/base/android/jni_android.cc
+++ b/base/android/jni_android.cc
@@ -159,10 +159,25 @@
 ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
   jclass clazz;
   if (!g_class_loader.Get().is_null()) {
+    // ClassLoader.loadClass expects a classname with components separated by
+    // dots instead of the slashes that JNIEnv::FindClass expects. The JNI
+    // generator generates names with slashes, so we have to replace them here.
+    // TODO(torne): move to an approach where we always use ClassLoader except
+    // for the special case of base::android::GetClassLoader(), and change the
+    // JNI generator to generate dot-separated names. http://crbug.com/461773
+    size_t bufsize = strlen(class_name) + 1;
+    char dotted_name[bufsize];
+    memmove(dotted_name, class_name, bufsize);
+    for (size_t i = 0; i < bufsize; ++i) {
+      if (dotted_name[i] == '/') {
+        dotted_name[i] = '.';
+      }
+    }
+
     clazz = static_cast<jclass>(
         env->CallObjectMethod(g_class_loader.Get().obj(),
                               g_class_loader_load_class_method_id,
-                              ConvertUTF8ToJavaString(env, class_name).obj()));
+                              ConvertUTF8ToJavaString(env, dotted_name).obj()));
   } else {
     clazz = env->FindClass(class_name);
   }
diff --git a/base/android/record_histogram.cc b/base/android/record_histogram.cc
index 0df0487..8b7f7bd 100644
--- a/base/android/record_histogram.cc
+++ b/base/android/record_histogram.cc
@@ -60,6 +60,31 @@
     return InsertLocked(j_histogram_key, histogram);
   }
 
+  HistogramBase* CountHistogram(JNIEnv* env,
+                                jstring j_histogram_name,
+                                jint j_histogram_key) {
+    // These values are based on the hard-coded constants in the
+    // UMA_HISTOGRAM_COUNTS macro from base/metrics/histogram_macros.h.
+    const int histogram_min = 1;
+    const int histogram_max = 1000000;
+    const int histogram_num_buckets = 50;
+
+    DCHECK(j_histogram_name);
+    DCHECK(j_histogram_key);
+    HistogramBase* histogram = FindLocked(j_histogram_key);
+    if (histogram) {
+      DCHECK(histogram->HasConstructionArguments(histogram_min, histogram_max,
+                                                 histogram_num_buckets));
+      return histogram;
+    }
+
+    std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+    histogram = Histogram::FactoryGet(histogram_name, histogram_min,
+                                      histogram_max, histogram_num_buckets,
+                                      HistogramBase::kUmaTargetedHistogramFlag);
+    return InsertLocked(j_histogram_key, histogram);
+  }
+
   HistogramBase* CustomTimesHistogram(JNIEnv* env,
                                       jstring j_histogram_name,
                                       jint j_histogram_key,
@@ -133,6 +158,18 @@
       ->Add(sample);
 }
 
+void RecordCountHistogram(JNIEnv* env,
+                          jclass clazz,
+                          jstring j_histogram_name,
+                          jint j_histogram_key,
+                          jint j_sample) {
+  int sample = static_cast<int>(j_sample);
+
+  g_histograms.Get()
+      .CountHistogram(env, j_histogram_name, j_histogram_key)
+      ->Add(sample);
+}
+
 void RecordCustomTimesHistogramMilliseconds(JNIEnv* env,
                                             jclass clazz,
                                             jstring j_histogram_name,
diff --git a/base/base.gyp b/base/base.gyp
index 5f640d8..c7a2481 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -541,7 +541,6 @@
         'mac/scoped_sending_event_unittest.mm',
         'md5_unittest.cc',
         'memory/aligned_memory_unittest.cc',
-        'memory/discardable_memory_unittest.cc',
         'memory/discardable_shared_memory_unittest.cc',
         'memory/linked_ptr_unittest.cc',
         'memory/ref_counted_memory_unittest.cc',
@@ -976,6 +975,8 @@
         'test/simple_test_tick_clock.h',
         'test/task_runner_test_template.cc',
         'test/task_runner_test_template.h',
+        'test/test_discardable_memory_shmem_allocator.cc',
+        'test/test_discardable_memory_shmem_allocator.h',
         'test/test_file_util.cc',
         'test/test_file_util.h',
         'test/test_file_util_android.cc',
diff --git a/base/base.gypi b/base/base.gypi
index ebc7e3e..13cba85 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -318,14 +318,10 @@
           'memory/aligned_memory.h',
           'memory/discardable_memory.cc',
           'memory/discardable_memory.h',
-          'memory/discardable_memory_android.cc',
-          'memory/discardable_memory_linux.cc',
-          'memory/discardable_memory_mac.cc',
           'memory/discardable_memory_shmem.cc',
           'memory/discardable_memory_shmem.h',
           'memory/discardable_memory_shmem_allocator.cc',
           'memory/discardable_memory_shmem_allocator.h',
-          'memory/discardable_memory_win.cc',
           'memory/discardable_shared_memory.cc',
           'memory/discardable_shared_memory.h',
           'memory/linked_ptr.h',
@@ -889,7 +885,6 @@
               ['include', '^mac/scoped_mach_vm\\.'],
               ['include', '^mac/scoped_nsautorelease_pool\\.'],
               ['include', '^mac/scoped_nsobject\\.'],
-              ['include', '^memory/discardable_memory_mac\\.'],
               ['include', '^message_loop/message_pump_mac\\.'],
               ['include', '^strings/sys_string_conversions_mac\\.'],
               ['include', '^threading/platform_thread_mac\\.'],
diff --git a/base/base_paths_win.cc b/base/base_paths_win.cc
index 5bef310..4ecb59d 100644
--- a/base/base_paths_win.cc
+++ b/base/base_paths_win.cc
@@ -6,8 +6,10 @@
 #include <shlobj.h>
 
 #include "base/base_paths.h"
+#include "base/environment.h"
 #include "base/files/file_path.h"
 #include "base/path_service.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/win/scoped_co_mem.h"
 #include "base/win/windows_version.h"
 
@@ -65,6 +67,27 @@
         return false;
       cur = FilePath(system_buffer);
       break;
+    case base::DIR_PROGRAM_FILES6432:
+#if !defined(_WIN64)
+      if (base::win::OSInfo::GetInstance()->wow64_status() ==
+          base::win::OSInfo::WOW64_ENABLED) {
+        scoped_ptr<base::Environment> env(base::Environment::Create());
+        std::string programfiles_w6432;
+        // 32-bit process running in WOW64 sets ProgramW6432 environment
+        // variable. See
+        // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx.
+        if (!env->GetVar("ProgramW6432", &programfiles_w6432))
+          return false;
+        // GetVar returns UTF8 - convert back to Wide.
+        cur = FilePath(UTF8ToWide(programfiles_w6432));
+        break;
+      }
+#endif
+      if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
+                                 SHGFP_TYPE_CURRENT, system_buffer)))
+        return false;
+      cur = FilePath(system_buffer);
+      break;
     case base::DIR_IE_INTERNET_CACHE:
       if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL,
                                  SHGFP_TYPE_CURRENT, system_buffer)))
diff --git a/base/base_paths_win.h b/base/base_paths_win.h
index 032de34..4ab6af1 100644
--- a/base/base_paths_win.h
+++ b/base/base_paths_win.h
@@ -16,8 +16,14 @@
 
   DIR_WINDOWS,  // Windows directory, usually "c:\windows"
   DIR_SYSTEM,   // Usually c:\windows\system32"
-  DIR_PROGRAM_FILES,      // Usually c:\program files
-  DIR_PROGRAM_FILESX86,   // Usually c:\program files or c:\program files (x86)
+  //                         32-bit     32-bit on 64-bit   64-bit on 64-bit
+  // DIR_PROGRAM_FILES         1               2                  1
+  // DIR_PROGRAM_FILESX86      1               2                  2
+  // DIR_PROGRAM_FILES6432     1               1                  1
+  // 1 - C:\Program Files   2 - C:\Program Files (x86)
+  DIR_PROGRAM_FILES,      // See table above.
+  DIR_PROGRAM_FILESX86,   // See table above.
+  DIR_PROGRAM_FILES6432,  // See table above.
 
   DIR_IE_INTERNET_CACHE,  // Temporary Internet Files directory.
   DIR_COMMON_START_MENU,  // Usually "C:\Documents and Settings\All Users\
diff --git a/base/compiler_specific.h b/base/compiler_specific.h
index 47ca977..034cf06 100644
--- a/base/compiler_specific.h
+++ b/base/compiler_specific.h
@@ -175,9 +175,17 @@
 // Mark a memory region fully initialized.
 // Use this to annotate code that deliberately reads uninitialized data, for
 // example a GC scavenging root set pointers from the stack.
-#define MSAN_UNPOISON(p, s)  __msan_unpoison(p, s)
+#define MSAN_UNPOISON(p, size)  __msan_unpoison(p, size)
+
+// Check a memory region for initializedness, as if it was being used here.
+// If any bits are uninitialized, crash with an MSan report.
+// Use this to sanitize data which MSan won't be able to track, e.g. before
+// passing data to another process via shared memory.
+#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \
+    __msan_check_mem_is_initialized(p, size)
 #else  // MEMORY_SANITIZER
-#define MSAN_UNPOISON(p, s)
+#define MSAN_UNPOISON(p, size)
+#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size)
 #endif  // MEMORY_SANITIZER
 
 // Macro useful for writing cross-platform function pointers.
diff --git a/base/debug/BUILD.gn b/base/debug/BUILD.gn
index 37a0ab2..8ed623b 100644
--- a/base/debug/BUILD.gn
+++ b/base/debug/BUILD.gn
@@ -55,7 +55,7 @@
     ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   deps = [
     "//base/memory",
@@ -63,6 +63,7 @@
   ]
 
   if (is_linux) {
+    defines = [ "USE_SYMBOLIZE" ]
     deps += [ "//base/third_party/symbolize" ]
   }
 
diff --git a/base/files/file_posix.cc b/base/files/file_posix.cc
index 245ea6a..663f099 100644
--- a/base/files/file_posix.cc
+++ b/base/files/file_posix.cc
@@ -471,12 +471,15 @@
     case EROFS:
     case EPERM:
       return FILE_ERROR_ACCESS_DENIED;
+    case EBUSY:
 #if !defined(OS_NACL)  // ETXTBSY not defined by NaCl.
     case ETXTBSY:
-      return FILE_ERROR_IN_USE;
 #endif
+      return FILE_ERROR_IN_USE;
     case EEXIST:
       return FILE_ERROR_EXISTS;
+    case EIO:
+      return FILE_ERROR_IO;
     case ENOENT:
       return FILE_ERROR_NOT_FOUND;
     case EMFILE:
diff --git a/base/ios/weak_nsobject.h b/base/ios/weak_nsobject.h
index a1984bb..fc3a7c3 100644
--- a/base/ios/weak_nsobject.h
+++ b/base/ios/weak_nsobject.h
@@ -117,7 +117,9 @@
   }
 
   WeakNSProtocol& operator=(const WeakNSProtocol<NST>& that) {
-    DCHECK(checker_.CalledOnValidThread());
+    // A WeakNSProtocol object can be copied on one thread and used on
+    // another.
+    checker_.DetachFromThread();
     container_ = that.container_;
     return *this;
   }
diff --git a/base/ios/weak_nsobject_unittest.mm b/base/ios/weak_nsobject_unittest.mm
index 325dcd2..81de993 100644
--- a/base/ios/weak_nsobject_unittest.mm
+++ b/base/ios/weak_nsobject_unittest.mm
@@ -109,8 +109,12 @@
 // the weak object on its original thread.
 void CopyWeakNSObjectAndPost(const WeakNSObject<NSMutableData>& weak_object,
                              scoped_refptr<SingleThreadTaskRunner> runner) {
-  WeakNSObject<NSMutableData> weak_copy(weak_object);
-  runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy));
+  // Copy using constructor.
+  WeakNSObject<NSMutableData> weak_copy1(weak_object);
+  runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy1));
+  // Copy using assignment operator.
+  WeakNSObject<NSMutableData> weak_copy2 = weak_object;
+  runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy2));
 }
 
 // Tests that the weak object can be copied on a different thread.
@@ -128,8 +132,8 @@
   other_thread.Stop();
   loop.RunUntilIdle();
 
-  // Check that TouchWeakData was called.
-  EXPECT_EQ(1u, [data length]);
+  // Check that TouchWeakData was called and the object touched twice.
+  EXPECT_EQ(2u, [data length]);
 }
 
 }  // namespace
diff --git a/base/json/BUILD.gn b/base/json/BUILD.gn
index 0310ea9..70830c1 100644
--- a/base/json/BUILD.gn
+++ b/base/json/BUILD.gn
@@ -27,7 +27,7 @@
     ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   deps = [
     "//base/memory",
diff --git a/base/location.cc b/base/location.cc
index 8b32b97..1333e6e 100644
--- a/base/location.cc
+++ b/base/location.cc
@@ -31,6 +31,13 @@
       program_counter_(NULL) {
 }
 
+Location::Location(const Location& other)
+    : function_name_(other.function_name_),
+      file_name_(other.file_name_),
+      line_number_(other.line_number_),
+      program_counter_(other.program_counter_) {
+}
+
 std::string Location::ToString() const {
   return std::string(function_name_) + "@" + file_name_ + ":" +
       base::IntToString(line_number_);
diff --git a/base/location.h b/base/location.h
index 05a4f66..477dc02 100644
--- a/base/location.h
+++ b/base/location.h
@@ -5,10 +5,12 @@
 #ifndef BASE_LOCATION_H_
 #define BASE_LOCATION_H_
 
+#include <cassert>
 #include <string>
 
 #include "base/base_export.h"
 #include "base/basictypes.h"
+#include "base/containers/hash_tables.h"
 
 namespace tracked_objects {
 
@@ -27,18 +29,15 @@
   // Provide a default constructor for easy of debugging.
   Location();
 
-  // Comparison operator for insertion into a std::map<> hash tables.
-  // All we need is *some* (any) hashing distinction.  Strings should already
-  // be unique, so we don't bother with strcmp or such.
-  // Use line number as the primary key (because it is fast, and usually gets us
-  // a difference), and then pointers as secondary keys (just to get some
-  // distinctions).
-  bool operator < (const Location& other) const {
-    if (line_number_ != other.line_number_)
-      return line_number_ < other.line_number_;
-    if (file_name_ != other.file_name_)
-      return file_name_ < other.file_name_;
-    return function_name_ < other.function_name_;
+  // Copy constructor.
+  Location(const Location& other);
+
+  // Comparator for hash map insertion.
+  // No need to use |function_name_| since the other two fields uniquely
+  // identify this location.
+  bool operator==(const Location& other) const {
+    return line_number_ == other.line_number_ &&
+           file_name_ == other.file_name_;
   }
 
   const char* function_name()   const { return function_name_; }
@@ -48,6 +47,26 @@
 
   std::string ToString() const;
 
+  // Hash operator for hash maps.
+  struct Hash {
+    size_t operator()(const Location& location) const {
+      // Compute the hash value using file name pointer and line number.
+      // No need to use |function_name_| since the other two fields uniquely
+      // identify this location.
+
+      // The file name will always be uniquely identified by its pointer since
+      // it comes from __FILE__, so no need to check the contents of the string.
+      // See the definition of FROM_HERE in location.h, and how it is used
+      // elsewhere.
+
+      // Due to inconsistent definitions of uint64_t and uintptr_t, casting the
+      // file name pointer to a uintptr_t causes a compiler error for some
+      // platforms. The solution is to explicitly cast it to a uint64_t.
+      return base::HashPair(reinterpret_cast<uint64_t>(location.file_name()),
+                            location.line_number());
+    }
+  };
+
   // Translate the some of the state in this instance into a human readable
   // string with HTML characters in the function names escaped, and append that
   // string to |output|.  Inclusion of the file_name_ and function_name_ are
diff --git a/base/mac/scoped_mach_port.h b/base/mac/scoped_mach_port.h
index 9ef90d6..beb62b0 100644
--- a/base/mac/scoped_mach_port.h
+++ b/base/mac/scoped_mach_port.h
@@ -20,7 +20,7 @@
     return MACH_PORT_NULL;
   }
 
-  static void Free(mach_port_t port);
+  BASE_EXPORT static void Free(mach_port_t port);
 };
 
 struct BASE_EXPORT ReceiveRightTraits {
@@ -28,7 +28,7 @@
     return MACH_PORT_NULL;
   }
 
-  static void Free(mach_port_t port);
+  BASE_EXPORT static void Free(mach_port_t port);
 };
 
 struct PortSetTraits {
@@ -36,7 +36,7 @@
     return MACH_PORT_NULL;
   }
 
-  static void Free(mach_port_t port);
+  BASE_EXPORT static void Free(mach_port_t port);
 };
 
 }  // namespace internal
diff --git a/base/memory/BUILD.gn b/base/memory/BUILD.gn
index 5d016ff..3d4c22c 100644
--- a/base/memory/BUILD.gn
+++ b/base/memory/BUILD.gn
@@ -8,14 +8,10 @@
     "aligned_memory.h",
     "discardable_memory.cc",
     "discardable_memory.h",
-    "discardable_memory_android.cc",
-    "discardable_memory_linux.cc",
-    "discardable_memory_mac.cc",
     "discardable_memory_shmem.cc",
     "discardable_memory_shmem.h",
     "discardable_memory_shmem_allocator.cc",
     "discardable_memory_shmem_allocator.h",
-    "discardable_memory_win.cc",
     "discardable_shared_memory.cc",
     "discardable_shared_memory.h",
     "linked_ptr.h",
@@ -58,7 +54,7 @@
     sources -= [ "shared_memory_nacl.cc" ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   visibility = [ "//base/*" ]
 }
diff --git a/base/memory/discardable_memory.cc b/base/memory/discardable_memory.cc
index 7d19f9a..0e3b58a 100644
--- a/base/memory/discardable_memory.cc
+++ b/base/memory/discardable_memory.cc
@@ -4,80 +4,14 @@
 
 #include "base/memory/discardable_memory.h"
 
-#include "base/lazy_instance.h"
-#include "base/logging.h"
+#include "base/memory/discardable_memory_shmem.h"
 
 namespace base {
-namespace {
-
-const struct TypeNamePair {
-  DiscardableMemoryType type;
-  const char* name;
-} kTypeNamePairs[] = {
-  { DISCARDABLE_MEMORY_TYPE_SHMEM, "shmem" }
-};
-
-DiscardableMemoryType g_preferred_type = DISCARDABLE_MEMORY_TYPE_NONE;
-
-struct DefaultPreferredType {
-  DefaultPreferredType() : value(DISCARDABLE_MEMORY_TYPE_NONE) {
-    std::vector<DiscardableMemoryType> supported_types;
-    DiscardableMemory::GetSupportedTypes(&supported_types);
-    DCHECK(!supported_types.empty());
-    value = supported_types[0];
-  }
-  DiscardableMemoryType value;
-};
-LazyInstance<DefaultPreferredType>::Leaky g_default_preferred_type =
-    LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// static
-DiscardableMemoryType DiscardableMemory::GetNamedType(
-    const std::string& name) {
-  for (size_t i = 0; i < arraysize(kTypeNamePairs); ++i) {
-    if (name == kTypeNamePairs[i].name)
-      return kTypeNamePairs[i].type;
-  }
-
-  return DISCARDABLE_MEMORY_TYPE_NONE;
-}
-
-// static
-const char* DiscardableMemory::GetTypeName(DiscardableMemoryType type) {
-  for (size_t i = 0; i < arraysize(kTypeNamePairs); ++i) {
-    if (type == kTypeNamePairs[i].type)
-      return kTypeNamePairs[i].name;
-  }
-
-  return "unknown";
-}
-
-// static
-void DiscardableMemory::SetPreferredType(DiscardableMemoryType type) {
-  // NONE is a reserved value and not a valid default type.
-  DCHECK_NE(DISCARDABLE_MEMORY_TYPE_NONE, type);
-
-  // Make sure this function is only called once before the first call
-  // to GetPreferredType().
-  DCHECK_EQ(DISCARDABLE_MEMORY_TYPE_NONE, g_preferred_type);
-
-  g_preferred_type = type;
-}
-
-// static
-DiscardableMemoryType DiscardableMemory::GetPreferredType() {
-  if (g_preferred_type == DISCARDABLE_MEMORY_TYPE_NONE)
-    g_preferred_type = g_default_preferred_type.Get().value;
-
-  return g_preferred_type;
-}
 
 // static
 scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemory(
     size_t size) {
-  return CreateLockedMemoryWithType(GetPreferredType(), size);
+  return make_scoped_ptr(new internal::DiscardableMemoryShmem(size));
 }
 
 }  // namespace base
diff --git a/base/memory/discardable_memory.h b/base/memory/discardable_memory.h
index 4e5a9af..ce0f0bb 100644
--- a/base/memory/discardable_memory.h
+++ b/base/memory/discardable_memory.h
@@ -15,11 +15,6 @@
 
 namespace base {
 
-enum DiscardableMemoryType {
-  DISCARDABLE_MEMORY_TYPE_NONE,
-  DISCARDABLE_MEMORY_TYPE_SHMEM
-};
-
 // Platform abstraction for discardable memory. DiscardableMemory is used to
 // cache large objects without worrying about blowing out memory, both on mobile
 // devices where there is no swap, and desktop devices where unused free memory
@@ -55,29 +50,7 @@
  public:
   virtual ~DiscardableMemory() {}
 
-  // Gets the discardable memory type with a given name.
-  static DiscardableMemoryType GetNamedType(const std::string& name);
-
-  // Gets the name of a discardable memory type.
-  static const char* GetTypeName(DiscardableMemoryType type);
-
-  // Gets system supported discardable memory types. Default preferred type
-  // at the front of vector.
-  static void GetSupportedTypes(std::vector<DiscardableMemoryType>* types);
-
-  // Sets the preferred discardable memory type. This overrides the default
-  // preferred type. Can only be called once prior to GetPreferredType()
-  // or CreateLockedMemory(). Caller is responsible for correct ordering.
-  static void SetPreferredType(DiscardableMemoryType type);
-
-  // Gets the preferred discardable memory type.
-  static DiscardableMemoryType GetPreferredType();
-
-  // Create a DiscardableMemory instance with specified |type| and |size|.
-  static scoped_ptr<DiscardableMemory> CreateLockedMemoryWithType(
-      DiscardableMemoryType type, size_t size);
-
-  // Create a DiscardableMemory instance with preferred type and |size|.
+  // Create a DiscardableMemory instance with |size|.
   static scoped_ptr<DiscardableMemory> CreateLockedMemory(size_t size);
 
   // Locks the memory so that it will not be purged by the system. Returns
diff --git a/base/memory/discardable_memory_android.cc b/base/memory/discardable_memory_android.cc
deleted file mode 100644
index a36f54e..0000000
--- a/base/memory/discardable_memory_android.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/discardable_memory.h"
-
-#include "base/logging.h"
-#include "base/memory/discardable_memory_shmem.h"
-
-namespace base {
-
-// static
-void DiscardableMemory::GetSupportedTypes(
-    std::vector<DiscardableMemoryType>* types) {
-  const DiscardableMemoryType supported_types[] = {
-    DISCARDABLE_MEMORY_TYPE_SHMEM
-  };
-  types->assign(supported_types, supported_types + arraysize(supported_types));
-}
-
-// static
-scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemoryWithType(
-    DiscardableMemoryType type, size_t size) {
-  switch (type) {
-    case DISCARDABLE_MEMORY_TYPE_SHMEM:
-      return make_scoped_ptr(new internal::DiscardableMemoryShmem(size));
-    case DISCARDABLE_MEMORY_TYPE_NONE:
-      NOTREACHED();
-      return nullptr;
-  }
-
-  NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace base
diff --git a/base/memory/discardable_memory_linux.cc b/base/memory/discardable_memory_linux.cc
deleted file mode 100644
index b394e07..0000000
--- a/base/memory/discardable_memory_linux.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/discardable_memory.h"
-
-#include "base/logging.h"
-#include "base/memory/discardable_memory_shmem.h"
-
-namespace base {
-
-// static
-void DiscardableMemory::GetSupportedTypes(
-    std::vector<DiscardableMemoryType>* types) {
-  const DiscardableMemoryType supported_types[] = {
-    DISCARDABLE_MEMORY_TYPE_SHMEM
-  };
-  types->assign(supported_types, supported_types + arraysize(supported_types));
-}
-
-// static
-scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemoryWithType(
-    DiscardableMemoryType type, size_t size) {
-  switch (type) {
-    case DISCARDABLE_MEMORY_TYPE_SHMEM:
-      return make_scoped_ptr(new internal::DiscardableMemoryShmem(size));
-    case DISCARDABLE_MEMORY_TYPE_NONE:
-      NOTREACHED();
-      return nullptr;
-  }
-
-  NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace base
diff --git a/base/memory/discardable_memory_mac.cc b/base/memory/discardable_memory_mac.cc
deleted file mode 100644
index d7e6345..0000000
--- a/base/memory/discardable_memory_mac.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/discardable_memory.h"
-
-#include "base/logging.h"
-#include "base/memory/discardable_memory_shmem.h"
-#include "base/memory/scoped_ptr.h"
-
-namespace base {
-
-// static
-void DiscardableMemory::GetSupportedTypes(
-    std::vector<DiscardableMemoryType>* types) {
-  const DiscardableMemoryType supported_types[] = {
-    DISCARDABLE_MEMORY_TYPE_SHMEM
-  };
-  types->assign(supported_types, supported_types + arraysize(supported_types));
-}
-
-// static
-scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemoryWithType(
-    DiscardableMemoryType type, size_t size) {
-  switch (type) {
-    case DISCARDABLE_MEMORY_TYPE_SHMEM:
-      return make_scoped_ptr(new internal::DiscardableMemoryShmem(size));
-    case DISCARDABLE_MEMORY_TYPE_NONE:
-      NOTREACHED();
-      return nullptr;
-  }
-
-  NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace base
diff --git a/base/memory/discardable_memory_shmem_allocator.cc b/base/memory/discardable_memory_shmem_allocator.cc
index 761204f..a87c58d 100644
--- a/base/memory/discardable_memory_shmem_allocator.cc
+++ b/base/memory/discardable_memory_shmem_allocator.cc
@@ -11,45 +11,6 @@
 namespace base {
 namespace {
 
-class DiscardableMemoryShmemChunkImpl : public DiscardableMemoryShmemChunk {
- public:
-  explicit DiscardableMemoryShmemChunkImpl(
-      scoped_ptr<DiscardableSharedMemory> shared_memory)
-      : shared_memory_(shared_memory.Pass()) {}
-
-  // Overridden from DiscardableMemoryShmemChunk:
-  bool Lock() override { return false; }
-  void Unlock() override {
-    shared_memory_->Unlock(0, 0);
-    shared_memory_.reset();
-  }
-  void* Memory() const override { return shared_memory_->memory(); }
-
- private:
-  scoped_ptr<DiscardableSharedMemory> shared_memory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryShmemChunkImpl);
-};
-
-// Default allocator implementation that allocates in-process
-// DiscardableSharedMemory instances.
-class DiscardableMemoryShmemAllocatorImpl
-    : public DiscardableMemoryShmemAllocator {
- public:
-  // Overridden from DiscardableMemoryShmemAllocator:
-  scoped_ptr<DiscardableMemoryShmemChunk>
-  AllocateLockedDiscardableMemory(size_t size) override {
-    scoped_ptr<DiscardableSharedMemory> memory(new DiscardableSharedMemory);
-    if (!memory->CreateAndMap(size))
-      return nullptr;
-
-    return make_scoped_ptr(new DiscardableMemoryShmemChunkImpl(memory.Pass()));
-  }
-};
-
-LazyInstance<DiscardableMemoryShmemAllocatorImpl>::Leaky g_default_allocator =
-    LAZY_INSTANCE_INITIALIZER;
-
 DiscardableMemoryShmemAllocator* g_allocator = nullptr;
 
 }  // namespace
@@ -69,9 +30,7 @@
 // static
 DiscardableMemoryShmemAllocator*
 DiscardableMemoryShmemAllocator::GetInstance() {
-  if (!g_allocator)
-    g_allocator = g_default_allocator.Pointer();
-
+  DCHECK(g_allocator);
   return g_allocator;
 }
 
diff --git a/base/memory/discardable_memory_unittest.cc b/base/memory/discardable_memory_unittest.cc
deleted file mode 100644
index a769e17..0000000
--- a/base/memory/discardable_memory_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/discardable_memory.h"
-
-#include <algorithm>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include <limits>
-#endif
-
-namespace base {
-namespace {
-
-class DiscardableMemoryTest
-    : public testing::TestWithParam<DiscardableMemoryType> {
- public:
-  DiscardableMemoryTest() {}
-  virtual ~DiscardableMemoryTest() {
-  }
-
- protected:
-  scoped_ptr<DiscardableMemory> CreateLockedMemory(size_t size) {
-    return DiscardableMemory::CreateLockedMemoryWithType(
-        GetParam(), size).Pass();
-  }
-};
-
-const size_t kSize = 1024;
-
-TEST_P(DiscardableMemoryTest, IsNamed) {
-  std::string type_name(DiscardableMemory::GetTypeName(GetParam()));
-  EXPECT_NE("unknown", type_name);
-  EXPECT_EQ(GetParam(), DiscardableMemory::GetNamedType(type_name));
-}
-
-bool IsNativeType(DiscardableMemoryType type) {
-#if defined(OS_ANDROID)
-    // SHMEM is backed by native discardable memory on Android.
-  return type == DISCARDABLE_MEMORY_TYPE_SHMEM;
-#else
-  return false;
-#endif
-}
-
-TEST_P(DiscardableMemoryTest, SupportedNatively) {
-  std::vector<DiscardableMemoryType> supported_types;
-  DiscardableMemory::GetSupportedTypes(&supported_types);
-#if defined(DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY)
-  EXPECT_NE(0, std::count_if(supported_types.begin(),
-                             supported_types.end(),
-                             IsNativeType));
-#else
-  // If we ever have a platform that decides at runtime if it can support
-  // discardable memory natively, then we'll have to add a 'never supported
-  // natively' define for this case. At present, if it's not always supported
-  // natively, it's never supported.
-  EXPECT_EQ(0, std::count_if(supported_types.begin(),
-                             supported_types.end(),
-                             IsNativeType));
-#endif
-}
-
-// Test Lock() and Unlock() functionalities.
-TEST_P(DiscardableMemoryTest, LockAndUnLock) {
-  const scoped_ptr<DiscardableMemory> memory(CreateLockedMemory(kSize));
-  ASSERT_TRUE(memory);
-  void* addr = memory->Memory();
-  EXPECT_NE(nullptr, addr);
-  memory->Unlock();
-}
-
-// Test delete a discardable memory while it is locked.
-TEST_P(DiscardableMemoryTest, DeleteWhileLocked) {
-  const scoped_ptr<DiscardableMemory> memory(CreateLockedMemory(kSize));
-  ASSERT_TRUE(memory);
-}
-
-#if !defined(NDEBUG) && !defined(OS_ANDROID)
-// Death tests are not supported with Android APKs.
-TEST_P(DiscardableMemoryTest, UnlockedMemoryAccessCrashesInDebugMode) {
-  const scoped_ptr<DiscardableMemory> memory(CreateLockedMemory(kSize));
-  ASSERT_TRUE(memory);
-  memory->Unlock();
-  ASSERT_DEATH_IF_SUPPORTED(
-      { *static_cast<int*>(memory->Memory()) = 0xdeadbeef; }, ".*");
-}
-#endif
-
-// Test behavior when creating enough instances that could use up a 32-bit
-// address space.
-// This is disabled under AddressSanitizer on Windows as it crashes (by design)
-// on OOM. See http://llvm.org/PR22026 for the details.
-#if !defined(ADDRESS_SANITIZER) || !defined(OS_WIN)
-TEST_P(DiscardableMemoryTest, AddressSpace) {
-  const size_t kLargeSize = 4 * 1024 * 1024;  // 4MiB.
-  const size_t kNumberOfInstances = 1024 + 1;  // >4GiB total.
-
-  scoped_ptr<DiscardableMemory> instances[kNumberOfInstances];
-  for (auto& memory : instances) {
-    memory = CreateLockedMemory(kLargeSize);
-    ASSERT_TRUE(memory);
-    void* addr = memory->Memory();
-    EXPECT_NE(nullptr, addr);
-    memory->Unlock();
-  }
-}
-#endif
-
-std::vector<DiscardableMemoryType> GetSupportedDiscardableMemoryTypes() {
-  std::vector<DiscardableMemoryType> supported_types;
-  DiscardableMemory::GetSupportedTypes(&supported_types);
-  return supported_types;
-}
-
-INSTANTIATE_TEST_CASE_P(
-    DiscardableMemoryTests,
-    DiscardableMemoryTest,
-    ::testing::ValuesIn(GetSupportedDiscardableMemoryTypes()));
-
-}  // namespace
-}  // namespace base
diff --git a/base/memory/discardable_memory_win.cc b/base/memory/discardable_memory_win.cc
deleted file mode 100644
index b394e07..0000000
--- a/base/memory/discardable_memory_win.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/discardable_memory.h"
-
-#include "base/logging.h"
-#include "base/memory/discardable_memory_shmem.h"
-
-namespace base {
-
-// static
-void DiscardableMemory::GetSupportedTypes(
-    std::vector<DiscardableMemoryType>* types) {
-  const DiscardableMemoryType supported_types[] = {
-    DISCARDABLE_MEMORY_TYPE_SHMEM
-  };
-  types->assign(supported_types, supported_types + arraysize(supported_types));
-}
-
-// static
-scoped_ptr<DiscardableMemory> DiscardableMemory::CreateLockedMemoryWithType(
-    DiscardableMemoryType type, size_t size) {
-  switch (type) {
-    case DISCARDABLE_MEMORY_TYPE_SHMEM:
-      return make_scoped_ptr(new internal::DiscardableMemoryShmem(size));
-    case DISCARDABLE_MEMORY_TYPE_NONE:
-      NOTREACHED();
-      return nullptr;
-  }
-
-  NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace base
diff --git a/base/metrics/BUILD.gn b/base/metrics/BUILD.gn
index 804e59b..0202637 100644
--- a/base/metrics/BUILD.gn
+++ b/base/metrics/BUILD.gn
@@ -37,7 +37,7 @@
     sources -= [ "field_trial.cc" ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   deps = [
     "//base/debug",
diff --git a/base/path_service_unittest.cc b/base/path_service_unittest.cc
index 543deb6..7551d67 100644
--- a/base/path_service_unittest.cc
+++ b/base/path_service_unittest.cc
@@ -220,3 +220,55 @@
   EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &new_user_data_dir));
   EXPECT_EQ(original_user_data_dir, new_user_data_dir);
 }
+
+#if defined(OS_WIN)
+TEST_F(PathServiceTest, GetProgramFiles) {
+  base::FilePath programfiles_dir;
+#if defined(_WIN64)
+  // 64-bit on 64-bit.
+  EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES,
+      &programfiles_dir));
+  EXPECT_EQ(programfiles_dir.value(),
+      FILE_PATH_LITERAL("C:\\Program Files"));
+  EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86,
+      &programfiles_dir));
+  EXPECT_EQ(programfiles_dir.value(),
+      FILE_PATH_LITERAL("C:\\Program Files (x86)"));
+  EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432,
+      &programfiles_dir));
+  EXPECT_EQ(programfiles_dir.value(),
+      FILE_PATH_LITERAL("C:\\Program Files"));
+#else
+  if (base::win::OSInfo::GetInstance()->wow64_status() ==
+      base::win::OSInfo::WOW64_ENABLED) {
+    // 32-bit on 64-bit.
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files (x86)"));
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files (x86)"));
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files"));
+  } else {
+    // 32-bit on 32-bit.
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files"));
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files"));
+    EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432,
+        &programfiles_dir));
+    EXPECT_EQ(programfiles_dir.value(),
+        FILE_PATH_LITERAL("C:\\Program Files"));
+  }
+#endif
+}
+#endif
diff --git a/base/pickle.cc b/base/pickle.cc
index 6eb207f..112ddc3 100644
--- a/base/pickle.cc
+++ b/base/pickle.cc
@@ -358,6 +358,7 @@
 inline void Pickle::WriteBytesCommon(const void* data, size_t length) {
   DCHECK_NE(kCapacityReadOnly, capacity_after_header_)
       << "oops: pickle is readonly";
+  MSAN_CHECK_MEM_IS_INITIALIZED(data, length);
   size_t data_len = AlignInt(length, sizeof(uint32));
   DCHECK_GE(data_len, length);
 #ifdef ARCH_CPU_64_BITS
diff --git a/base/process/BUILD.gn b/base/process/BUILD.gn
index 125b451..e570647 100644
--- a/base/process/BUILD.gn
+++ b/base/process/BUILD.gn
@@ -94,7 +94,7 @@
     ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   deps = [
     "//base/memory",
diff --git a/base/process/launch.cc b/base/process/launch.cc
index 1c752bd..c179b2f 100644
--- a/base/process/launch.cc
+++ b/base/process/launch.cc
@@ -27,6 +27,7 @@
 #if defined(OS_LINUX)
       , clone_flags(0)
       , allow_new_privs(false)
+      , kill_on_parent_death(false)
 #endif  // OS_LINUX
 #if defined(OS_POSIX)
       , pre_exec_delegate(NULL)
diff --git a/base/process/launch.h b/base/process/launch.h
index 775e65c..56f27a8 100644
--- a/base/process/launch.h
+++ b/base/process/launch.h
@@ -141,6 +141,9 @@
   // By default, child processes will have the PR_SET_NO_NEW_PRIVS bit set. If
   // true, then this bit will not be set in the new child process.
   bool allow_new_privs;
+
+  // Sets parent process death signal to SIGKILL.
+  bool kill_on_parent_death;
 #endif  // defined(OS_LINUX)
 
 #if defined(OS_POSIX)
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc
index f9963fa..77edc12 100644
--- a/base/process/launch_posix.cc
+++ b/base/process/launch_posix.cc
@@ -523,6 +523,13 @@
         RAW_LOG(FATAL, "prctl(PR_SET_NO_NEW_PRIVS) failed");
       }
     }
+
+    if (options.kill_on_parent_death) {
+      if (prctl(PR_SET_PDEATHSIG, SIGKILL) != 0) {
+        RAW_LOG(ERROR, "prctl(PR_SET_PDEATHSIG) failed");
+        _exit(127);
+      }
+    }
 #endif
 
     if (current_directory != nullptr) {
diff --git a/base/process/process.h b/base/process/process.h
index 41eef10..045f870 100644
--- a/base/process/process.h
+++ b/base/process/process.h
@@ -55,7 +55,7 @@
   // Returns a Process for the given |pid|. On Windows the handle is opened
   // with more access rights and must only be used by trusted code (can read the
   // address space and duplicate handles).
-  static Process OpenWithExtraPriviles(ProcessId pid);
+  static Process OpenWithExtraPrivileges(ProcessId pid);
 
 #if defined(OS_WIN)
   // Returns a Process for the given |pid|, using some |desired_access|.
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index 1c4210b..a083123 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -238,7 +238,7 @@
 }
 
 // static
-Process Process::OpenWithExtraPriviles(ProcessId pid) {
+Process Process::OpenWithExtraPrivileges(ProcessId pid) {
   // On POSIX there are no privileges to set.
   return Open(pid);
 }
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index 32da8ab..d72dd49 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -54,7 +54,7 @@
 }
 
 // static
-Process Process::OpenWithExtraPriviles(ProcessId pid) {
+Process Process::OpenWithExtraPrivileges(ProcessId pid) {
   DWORD access = kBasicProcessAccess | PROCESS_DUP_HANDLE | PROCESS_VM_READ;
   return Process(::OpenProcess(access, FALSE, pid));
 }
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 55e710d..f5d2e4c 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -81,6 +81,8 @@
     "simple_test_tick_clock.h",
     "task_runner_test_template.cc",
     "task_runner_test_template.h",
+    "test_discardable_memory_shmem_allocator.cc",
+    "test_discardable_memory_shmem_allocator.h",
     "test_file_util.cc",
     "test_file_util.h",
     "test_file_util_android.cc",
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index 667d1eb..1d48060 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -383,6 +383,9 @@
   }
 #elif defined(OS_POSIX)
   options.new_process_group = true;
+#if defined(OS_LINUX)
+  options.kill_on_parent_death = true;
+#endif  // defined(OS_LINUX)
 
   FileHandleMappingVector fds_mapping;
   ScopedFD output_file_fd;
diff --git a/base/test/test_discardable_memory_shmem_allocator.cc b/base/test/test_discardable_memory_shmem_allocator.cc
new file mode 100644
index 0000000..24185a2
--- /dev/null
+++ b/base/test/test_discardable_memory_shmem_allocator.cc
@@ -0,0 +1,40 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/test_discardable_memory_shmem_allocator.h"
+
+#include <stdint.h>
+
+namespace base {
+namespace {
+
+class DiscardableMemoryShmemChunkImpl : public DiscardableMemoryShmemChunk {
+ public:
+  explicit DiscardableMemoryShmemChunkImpl(size_t size)
+      : memory_(new uint8_t[size]) {}
+
+  // Overridden from DiscardableMemoryShmemChunk:
+  bool Lock() override { return false; }
+  void Unlock() override {}
+  void* Memory() const override { return memory_.get(); }
+
+ private:
+  scoped_ptr<uint8_t[]> memory_;
+};
+
+}  // namespace
+
+TestDiscardableMemoryShmemAllocator::TestDiscardableMemoryShmemAllocator() {
+}
+
+TestDiscardableMemoryShmemAllocator::~TestDiscardableMemoryShmemAllocator() {
+}
+
+scoped_ptr<DiscardableMemoryShmemChunk>
+TestDiscardableMemoryShmemAllocator::AllocateLockedDiscardableMemory(
+    size_t size) {
+  return make_scoped_ptr(new DiscardableMemoryShmemChunkImpl(size));
+}
+
+}  // namespace base
diff --git a/base/test/test_discardable_memory_shmem_allocator.h b/base/test/test_discardable_memory_shmem_allocator.h
new file mode 100644
index 0000000..a40960e
--- /dev/null
+++ b/base/test/test_discardable_memory_shmem_allocator.h
@@ -0,0 +1,28 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TEST_TEST_DISCARDABLE_MEMORY_SHMEM_ALLOCATOR_H_
+#define BASE_TEST_TEST_DISCARDABLE_MEMORY_SHMEM_ALLOCATOR_H_
+
+#include "base/memory/discardable_memory_shmem_allocator.h"
+
+namespace base {
+
+class TestDiscardableMemoryShmemAllocator
+    : public DiscardableMemoryShmemAllocator {
+ public:
+  TestDiscardableMemoryShmemAllocator();
+  ~TestDiscardableMemoryShmemAllocator() override;
+
+  // Overridden from DiscardableMemoryShmemAllocator:
+  scoped_ptr<DiscardableMemoryShmemChunk> AllocateLockedDiscardableMemory(
+      size_t size) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestDiscardableMemoryShmemAllocator);
+};
+
+}  // namespace base
+
+#endif  // BASE_TEST_TEST_DISCARDABLE_MEMORY_SHMEM_ALLOCATOR_H_
diff --git a/base/third_party/nspr/BUILD.gn b/base/third_party/nspr/BUILD.gn
index a67e168..034f37b 100644
--- a/base/third_party/nspr/BUILD.gn
+++ b/base/third_party/nspr/BUILD.gn
@@ -12,7 +12,7 @@
 
   # In GYP this project is part of base, so it uses the base implementation
   # define. TODO(brettw) rename this define.
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   if (is_android && !is_debug) {
     configs -= [ "//build/config/compiler:optimize" ]
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index f20d997..52b178b 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -803,6 +803,20 @@
           delete_these_outside_lock.clear();
           break;
         }
+
+        // No work was found, but there are tasks that need deletion. The
+        // deletion must happen outside of the lock.
+        if (delete_these_outside_lock.size()) {
+          AutoUnlock unlock(lock_);
+          delete_these_outside_lock.clear();
+
+          // Since the lock has been released, |status| may no longer be
+          // accurate. It might read GET_WORK_WAIT even if there are tasks
+          // ready to perform work. Jump to the top of the loop to recalculate
+          // |status|.
+          continue;
+        }
+
         waiting_thread_count_++;
 
         switch (status) {
diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc
index c132731..5d0880c 100644
--- a/base/threading/sequenced_worker_pool_unittest.cc
+++ b/base/threading/sequenced_worker_pool_unittest.cc
@@ -148,6 +148,17 @@
         FROM_HERE, reposting_task, SequencedWorkerPool::SKIP_ON_SHUTDOWN);
   }
 
+  // This task reposts itself back onto the SequencedWorkerPool before it
+  // finishes running.
+  void PostRepostingBlockingTask(
+      const scoped_refptr<SequencedWorkerPool>& pool,
+      const SequencedWorkerPool::SequenceToken& token) {
+    Closure reposting_task =
+        base::Bind(&TestTracker::PostRepostingBlockingTask, this, pool, token);
+    pool->PostSequencedWorkerTaskWithShutdownBehavior(token,
+        FROM_HERE, reposting_task, SequencedWorkerPool::BLOCK_SHUTDOWN);
+  }
+
   // Waits until the given number of tasks have started executing.
   void WaitUntilTasksBlocked(size_t count) {
     {
@@ -795,6 +806,26 @@
   pool()->Shutdown();
 }
 
+// Similar to the test AvoidsDeadlockOnShutdown, but there are now also
+// sequenced, blocking tasks in the queue during shutdown.
+TEST_F(SequencedWorkerPoolTest,
+       AvoidsDeadlockOnShutdownWithSequencedBlockingTasks) {
+  const std::string sequence_token_name("name");
+  for (int i = 0; i < 4; ++i) {
+    scoped_refptr<DestructionDeadlockChecker> checker(
+        new DestructionDeadlockChecker(pool()));
+    tracker()->PostRepostingTask(pool(), checker);
+
+    SequencedWorkerPool::SequenceToken token1 =
+        pool()->GetNamedSequenceToken(sequence_token_name);
+    tracker()->PostRepostingBlockingTask(pool(), token1);
+  }
+
+  // Shutting down the pool should destroy the DestructionDeadlockCheckers,
+  // which in turn should not deadlock in their destructors.
+  pool()->Shutdown();
+}
+
 // Verify that FlushForTesting works as intended.
 TEST_F(SequencedWorkerPoolTest, FlushForTesting) {
   // Should be fine to call on a new instance.
diff --git a/base/time/time.h b/base/time/time.h
index b18c0b2..6a45b81 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -233,13 +233,16 @@
 // Represents a wall clock time in UTC.
 class BASE_EXPORT Time {
  public:
+  static const int64 kHoursPerDay = 24;
   static const int64 kMillisecondsPerSecond = 1000;
+  static const int64 kMillisecondsPerDay = kMillisecondsPerSecond * 60 * 60 *
+                                           kHoursPerDay;
   static const int64 kMicrosecondsPerMillisecond = 1000;
   static const int64 kMicrosecondsPerSecond = kMicrosecondsPerMillisecond *
                                               kMillisecondsPerSecond;
   static const int64 kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
   static const int64 kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
-  static const int64 kMicrosecondsPerDay = kMicrosecondsPerHour * 24;
+  static const int64 kMicrosecondsPerDay = kMicrosecondsPerHour * kHoursPerDay;
   static const int64 kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
   static const int64 kNanosecondsPerMicrosecond = 1000;
   static const int64 kNanosecondsPerSecond = kNanosecondsPerMicrosecond *
diff --git a/base/trace_event/BUILD.gn b/base/trace_event/BUILD.gn
index eec607b..10f7ec9 100644
--- a/base/trace_event/BUILD.gn
+++ b/base/trace_event/BUILD.gn
@@ -41,7 +41,7 @@
     ]
   }
 
-  defines = [ "BASE_IMPLEMENTATION" ]
+  configs += [ "//base:base_implementation" ]
 
   deps = [
     "//base/debug",
diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
index b90a3ea..9d8e7d1 100644
--- a/base/trace_event/trace_event.h
+++ b/base/trace_event/trace_event.h
@@ -520,6 +520,27 @@
         value1_name, static_cast<int>(value1_val), \
         value2_name, static_cast<int>(value2_val))
 
+// TRACE_EVENT_SAMPLE_* events are injected by the sampling profiler.
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP0(category_group, name,       \
+                                                   thread_id, timestamp)       \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE)
+
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP1(                            \
+    category_group, name, thread_id, timestamp, arg1_name, arg1_val)           \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
+
+#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP2(category_group, name,       \
+                                                   thread_id, timestamp,       \
+                                                   arg1_name, arg1_val,        \
+                                                   arg2_name, arg2_val)        \
+  INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
+      TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \
+      TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
+
 // ASYNC_STEP_* APIs should be only used by legacy code. New code should
 // consider using NESTABLE_ASYNC_* APIs to describe substeps within an async
 // event.
diff --git a/base/tracked_objects.h b/base/tracked_objects.h
index 7840fec..34c3667 100644
--- a/base/tracked_objects.h
+++ b/base/tracked_objects.h
@@ -14,6 +14,7 @@
 
 #include "base/base_export.h"
 #include "base/basictypes.h"
+#include "base/containers/hash_tables.h"
 #include "base/gtest_prod_util.h"
 #include "base/lazy_instance.h"
 #include "base/location.h"
@@ -357,7 +358,7 @@
     STATUS_LAST = PROFILING_CHILDREN_ACTIVE
   };
 
-  typedef std::map<Location, Births*> BirthMap;
+  typedef base::hash_map<Location, Births*, Location::Hash> BirthMap;
   typedef std::map<const Births*, DeathData> DeathMap;
   typedef std::pair<const Births*, const Births*> ParentChildPair;
   typedef std::set<ParentChildPair> ParentChildSet;
diff --git a/build/all.gyp b/build/all.gyp
index 4108962..2813ca2 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -163,6 +163,7 @@
         ['OS=="mac"', {
           'dependencies': [
             '../sandbox/sandbox.gyp:*',
+            '../third_party/crashpad/crashpad/crashpad.gyp:*',
             '../third_party/ocmock/ocmock.gyp:*',
           ],
         }],
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py
index 3738062..a0fcda8 100755
--- a/build/android/gyp/javac.py
+++ b/build/android/gyp/javac.py
@@ -80,7 +80,8 @@
       '-classpath', ':'.join(classpath),
       '-d', classes_dir]
   if chromium_code:
-    javac_args.extend(['-Xlint:unchecked', '-Xlint:deprecation'])
+    # TODO(aurimas): re-enable '-Xlint:deprecation' checks once they are fixed.
+    javac_args.extend(['-Xlint:unchecked'])
   else:
     # XDignore.symbol.file makes javac compile against rt.jar instead of
     # ct.sym. This means that using a java internal package/class will not
diff --git a/build/android/gyp/package_resources.py b/build/android/gyp/package_resources.py
index 9b6ec68..2251de0 100755
--- a/build/android/gyp/package_resources.py
+++ b/build/android/gyp/package_resources.py
@@ -100,11 +100,11 @@
   multiple targets. If it is multiple targets merged into one, the actual
   resource directories will be contained in the subdirectories 0, 1, 2, ...
   """
-  res_dirs = []
   subdirs = [os.path.join(d, s) for s in os.listdir(d)]
-  subdirs = sorted([s for s in subdirs if os.path.isdir(s)])
-  if subdirs and os.path.basename(subdirs[0]) == '0':
-    res_dirs = subdirs
+  subdirs = [s for s in subdirs if os.path.isdir(s)]
+  is_multi = '0' in [os.path.basename(s) for s in subdirs]
+  if is_multi:
+    res_dirs = sorted(subdirs, key=lambda p : int(os.path.basename(p)))
   else:
     res_dirs = [d]
   package_command = []
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index bf887e3..5fc8955 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -139,6 +139,9 @@
 
   direct_resources_deps = DepsOfType('android_resources', direct_deps_configs)
   all_resources_deps = DepsOfType('android_resources', all_deps_configs)
+  # Resources should be ordered with the highest-level dependency first so that
+  # overrides are done correctly.
+  all_resources_deps.reverse()
 
   # Initialize some common config.
   config = {
diff --git a/build/android/pylib/constants.py b/build/android/pylib/constants.py
index b849a8d..34dbf19 100644
--- a/build/android/pylib/constants.py
+++ b/build/android/pylib/constants.py
@@ -167,9 +167,10 @@
   KITKAT = 19
   KITKAT_WATCH = 20
   LOLLIPOP = 21
+  LOLLIPOP_MR1 = 22
 
-ANDROID_SDK_VERSION = ANDROID_SDK_VERSION_CODES.LOLLIPOP
-ANDROID_SDK_BUILD_TOOLS_VERSION = '21.0.1'
+ANDROID_SDK_VERSION = ANDROID_SDK_VERSION_CODES.LOLLIPOP_MR1
+ANDROID_SDK_BUILD_TOOLS_VERSION = '22.0.0'
 ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
                                 'third_party/android_tools/sdk')
 ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py
index b6fd732..292752a 100644
--- a/build/android/pylib/device/device_utils.py
+++ b/build/android/pylib/device/device_utils.py
@@ -13,7 +13,9 @@
 import logging
 import multiprocessing
 import os
+import posixpath
 import re
+import shutil
 import sys
 import tempfile
 import time
@@ -129,6 +131,7 @@
 class DeviceUtils(object):
 
   _MAX_ADB_COMMAND_LENGTH = 512
+  _MAX_ADB_OUTPUT_LENGTH = 32768
   _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
 
   # Property in /data/local.prop that controls Java assertions.
@@ -937,6 +940,21 @@
       os.makedirs(dirname)
     self.adb.Pull(device_path, host_path)
 
+  def _ReadFileWithPull(self, device_path):
+    try:
+      d = tempfile.mkdtemp()
+      host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull')
+      self.adb.Pull(device_path, host_temp_path)
+      with open(host_temp_path, 'r') as host_temp:
+        return host_temp.read()
+    finally:
+      if os.path.exists(d):
+        shutil.rmtree(d)
+
+  _LS_RE = re.compile(
+      r'(?P<perms>\S+) +(?P<owner>\S+) +(?P<group>\S+) +(?:(?P<size>\d+) +)?'
+      + r'(?P<date>\S+) +(?P<time>\S+) +(?P<name>.+)$')
+
   @decorators.WithTimeoutAndRetriesFromInstance()
   def ReadFile(self, device_path, as_root=False,
                timeout=None, retries=None):
@@ -960,8 +978,29 @@
       CommandTimeoutError on timeout.
       DeviceUnreachableError on missing device.
     """
-    return _JoinLines(self.RunShellCommand(
-        ['cat', device_path], as_root=as_root, check_return=True))
+    # TODO(jbudorick): Implement a generic version of Stat() that handles
+    # as_root=True, then switch this implementation to use that.
+    size = None
+    ls_out = self.RunShellCommand(['ls', '-l', device_path], as_root=as_root,
+                                  check_return=True)
+    for line in ls_out:
+      m = self._LS_RE.match(line)
+      if m and m.group('name') == posixpath.basename(device_path):
+        size = int(m.group('size'))
+        break
+    else:
+      logging.warning('Could not determine size of %s.', device_path)
+
+    if size is None or size <= self._MAX_ADB_OUTPUT_LENGTH:
+      return _JoinLines(self.RunShellCommand(
+          ['cat', device_path], as_root=as_root, check_return=True))
+    elif as_root and self.NeedsSU():
+      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
+        self.RunShellCommand(['cp', device_path, device_temp.name],
+                             as_root=True, check_return=True)
+        return self._ReadFileWithPull(device_temp.name)
+    else:
+      return self._ReadFileWithPull(device_path)
 
   def _WriteFileWithPush(self, device_path, contents):
     with tempfile.NamedTemporaryFile() as host_temp:
diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
index b7e807e..7c20f0d 100755
--- a/build/android/pylib/device/device_utils_test.py
+++ b/build/android/pylib/device/device_utils_test.py
@@ -1046,31 +1046,100 @@
 
 class DeviceUtilsReadFileTest(DeviceUtilsTest):
 
+  def testReadFileWithPull_success(self):
+    tmp_host_dir = '/tmp/dir/on.host/'
+    tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull')
+    tmp_host.file.read.return_value = 'some interesting contents'
+    with self.assertCalls(
+        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
+        (self.call.adb.Pull('/path/to/device/file', mock.ANY)),
+        (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host),
+        (mock.call.os.path.exists(tmp_host_dir), True),
+        (mock.call.shutil.rmtree(tmp_host_dir), None)):
+      self.assertEquals('some interesting contents',
+                        self.device._ReadFileWithPull('/path/to/device/file'))
+    tmp_host.file.read.assert_called_once_with()
+
+  def testReadFileWithPull_rejected(self):
+    tmp_host_dir = '/tmp/dir/on.host/'
+    with self.assertCalls(
+        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
+        (self.call.adb.Pull('/path/to/device/file', mock.ANY),
+         self.CommandError()),
+        (mock.call.os.path.exists(tmp_host_dir), True),
+        (mock.call.shutil.rmtree(tmp_host_dir), None)):
+      with self.assertRaises(device_errors.CommandFailedError):
+        self.device._ReadFileWithPull('/path/to/device/file')
+
   def testReadFile_exists(self):
-    with self.assertCall(
-        self.call.adb.Shell('cat /read/this/test/file'),
-        'this is a test file\r\n'):
+    with self.assertCalls(
+        (self.call.device.RunShellCommand(
+            ['ls', '-l', '/read/this/test/file'],
+            as_root=False, check_return=True),
+         ['-rw-rw---- root foo 256 1970-01-01 00:00 file']),
+        (self.call.device.RunShellCommand(
+            ['cat', '/read/this/test/file'], as_root=False, check_return=True),
+         ['this is a test file'])):
       self.assertEqual('this is a test file\n',
                        self.device.ReadFile('/read/this/test/file'))
 
   def testReadFile_doesNotExist(self):
     with self.assertCall(
-        self.call.adb.Shell('cat /this/file/does.not.exist'),
-        self.ShellError('/system/bin/sh: cat: /this/file/does.not.exist: '
-                        'No such file or directory')):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
+        self.call.device.RunShellCommand(
+            ['ls', '-l', '/this/file/does.not.exist'],
+            as_root=False, check_return=True),
+        self.CommandError('File does not exist')):
+      with self.assertRaises(device_errors.CommandFailedError):
         self.device.ReadFile('/this/file/does.not.exist')
 
   def testReadFile_withSU(self):
     with self.assertCalls(
-      (self.call.device.NeedsSU(), True),
-      (self.call.adb.Shell("su -c sh -c 'cat /this/file/can.be.read.with.su'"),
-       'this is a test file\nread with su')):
+        (self.call.device.RunShellCommand(
+            ['ls', '-l', '/this/file/can.be.read.with.su'],
+            as_root=True, check_return=True),
+         ['-rw------- root root 256 1970-01-01 00:00 can.be.read.with.su']),
+        (self.call.device.RunShellCommand(
+            ['cat', '/this/file/can.be.read.with.su'],
+            as_root=True, check_return=True),
+         ['this is a test file', 'read with su'])):
       self.assertEqual(
           'this is a test file\nread with su\n',
           self.device.ReadFile('/this/file/can.be.read.with.su',
                                as_root=True))
 
+  def testReadFile_withPull(self):
+    contents = 'a' * 123456
+    with self.assertCalls(
+        (self.call.device.RunShellCommand(
+            ['ls', '-l', '/read/this/big/test/file'],
+            as_root=False, check_return=True),
+         ['-rw-rw---- root foo 123456 1970-01-01 00:00 file']),
+        (self.call.device._ReadFileWithPull('/read/this/big/test/file'),
+         contents)):
+      self.assertEqual(
+          contents, self.device.ReadFile('/read/this/big/test/file'))
+
+  def testReadFile_withPullAndSU(self):
+    contents = 'b' * 123456
+    with self.assertCalls(
+        (self.call.device.RunShellCommand(
+            ['ls', '-l', '/this/big/file/can.be.read.with.su'],
+            as_root=True, check_return=True),
+         ['-rw------- root root 123456 1970-01-01 00:00 can.be.read.with.su']),
+        (self.call.device.NeedsSU(), True),
+        (mock.call.pylib.utils.device_temp_file.DeviceTempFile(self.adb),
+         MockTempFile('/sdcard/tmp/on.device')),
+        self.call.device.RunShellCommand(
+            ['cp', '/this/big/file/can.be.read.with.su',
+             '/sdcard/tmp/on.device'],
+            as_root=True, check_return=True),
+        (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
+         contents)):
+      self.assertEqual(
+          contents,
+          self.device.ReadFile('/this/big/file/can.be.read.with.su',
+                               as_root=True))
+
 
 class DeviceUtilsWriteFileTest(DeviceUtilsTest):
 
diff --git a/build/android/tombstones.py b/build/android/tombstones.py
index 7449a73..9b8a8b2 100755
--- a/build/android/tombstones.py
+++ b/build/android/tombstones.py
@@ -18,9 +18,12 @@
 import optparse
 
 from pylib import android_commands
+from pylib.device import device_errors
 from pylib.device import device_utils
 
 
+_TZ_UTC = {'TZ': 'UTC'}
+
 def _ListTombstones(device):
   """List the tombstone files on the device.
 
@@ -30,7 +33,9 @@
   Yields:
     Tuples of (tombstone filename, date time of file on device).
   """
-  lines = device.RunShellCommand('TZ=UTC su -c ls -a -l /data/tombstones')
+  lines = device.RunShellCommand(
+      ['ls', '-a', '-l', '/data/tombstones'],
+      as_root=True, check_return=True, env=_TZ_UTC, timeout=60)
   for line in lines:
     if 'tombstone' in line and not 'No such file or directory' in line:
       details = line.split()
@@ -48,7 +53,8 @@
   Returns:
     A datetime instance.
   """
-  device_now_string = device.RunShellCommand('TZ=UTC date')
+  device_now_string = device.RunShellCommand(
+      ['date'], check_return=True, env=_TZ_UTC)
   return datetime.datetime.strptime(
       device_now_string[0], '%a %b %d %H:%M:%S %Z %Y')
 
@@ -75,7 +81,8 @@
     tombstone_file: the tombstone to delete.
   """
   return device.RunShellCommand(
-      'rm /data/tombstones/' + tombstone_file, as_root=True)
+      ['rm', '/data/tombstones/' + tombstone_file],
+      as_root=True, check_return=True)
 
 
 def _DeviceAbiToArch(device_abi):
@@ -172,14 +179,21 @@
   tombstones = all_tombstones if options.all_tombstones else [all_tombstones[0]]
 
   device_now = _GetDeviceDateTime(device)
-  for tombstone_file, tombstone_time in tombstones:
-    ret += [{'serial': str(device),
-             'device_abi': device.product_cpu_abi,
-             'device_now': device_now,
-             'time': tombstone_time,
-             'file': tombstone_file,
-             'stack': options.stack,
-             'data': _GetTombstoneData(device, tombstone_file)}]
+  try:
+    for tombstone_file, tombstone_time in tombstones:
+      ret += [{'serial': str(device),
+               'device_abi': device.product_cpu_abi,
+               'device_now': device_now,
+               'time': tombstone_time,
+               'file': tombstone_file,
+               'stack': options.stack,
+               'data': _GetTombstoneData(device, tombstone_file)}]
+  except device_errors.CommandFailedError:
+    for line in device.RunShellCommand(
+        ['ls', '-a', '-l', '/data/tombstones'],
+        as_root=True, check_return=True, env=_TZ_UTC, timeout=60):
+      print '%s: %s' % (str(device), line)
+    raise
 
   # Erase all the tombstones if desired.
   if options.wipe_tombstones:
diff --git a/build/common.gypi b/build/common.gypi
index 043dd92..61224ba 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -581,7 +581,7 @@
       # Use experimental lld linker instead of the platform's default linker.
       'use_lld%': 0,
 
-      # Enable plug-in installation by default.
+      # Enable plugin installation by default.
       'enable_plugin_installation%': 1,
 
       # Specifies whether to use canvas_skia.cc in place of platform
@@ -603,9 +603,6 @@
       # Supervised users are enabled by default.
       'enable_supervised_users%': 1,
 
-      # Platform natively supports discardable memory.
-      'native_discardable_memory%': 0,
-
       # Platform sends memory pressure signals natively.
       'native_memory_pressure_signals%': 0,
 
@@ -760,7 +757,6 @@
           'remoting%': 0,
           'arm_neon%': 0,
           'arm_neon_optional%': 1,
-          'native_discardable_memory%': 1,
           'native_memory_pressure_signals%': 1,
           'enable_basic_printing%': 1,
           'enable_print_preview%': 0,
@@ -1201,7 +1197,6 @@
     'google_default_client_id%': '<(google_default_client_id)',
     'google_default_client_secret%': '<(google_default_client_secret)',
     'enable_supervised_users%': '<(enable_supervised_users)',
-    'native_discardable_memory%': '<(native_discardable_memory)',
     'native_memory_pressure_signals%': '<(native_memory_pressure_signals)',
     'spdy_proxy_auth_property%': '<(spdy_proxy_auth_property)',
     'spdy_proxy_auth_value%': '<(spdy_proxy_auth_value)',
@@ -1502,6 +1497,7 @@
     # Ozone platforms to include in the build.
     'ozone_platform_caca%': 0,
     'ozone_platform_dri%': 0,
+    'ozone_platform_drm%': 0,
     'ozone_platform_egltest%': 0,
     'ozone_platform_gbm%': 0,
     'ozone_platform_ozonex%': 0,
@@ -1523,7 +1519,7 @@
         'dont_embed_build_metadata%': 0,
       }],
       # Enable the Syzygy optimization step for the official builds.
-      ['OS=="win" and buildtype=="Official" and syzyasan!=1', {
+      ['OS=="win" and buildtype=="Official" and syzyasan!=1 and clang!=1', {
         'syzygy_optimize%': 1,
       }, {
         'syzygy_optimize%': 0,
@@ -1686,8 +1682,8 @@
             'android_ndk_absolute_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/ndk/',
             'android_host_arch%': '<!(uname -m)',
             # Android API-level of the SDK used for compilation.
-            'android_sdk_version%': '21',
-            'android_sdk_build_tools_version%': '21.0.1',
+            'android_sdk_version%': '22',
+            'android_sdk_build_tools_version%': '22.0.0',
             'host_os%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')",
           },
           # Copy conditionally-set variables out one scope.
@@ -1955,7 +1951,9 @@
             'win_use_allocator_shim%': 0,
           }],
           ['syzyasan==1', {
-            'kasko%': 1,
+            # Uncomment the following line to enable Kasko for
+            # SyzyASAN-instrumented releases.
+            # 'kasko%': 1,
           }],
           ['component=="shared_library" and "<(GENERATOR)"=="ninja"', {
             # Only enabled by default for ninja because it's buggy in VS.
@@ -2350,6 +2348,7 @@
         # Build all platforms whose deps are in install-build-deps.sh.
         # Only these platforms will be compile tested by buildbots.
         'ozone_platform_dri%': 1,
+        'ozone_platform_drm%': 1,
         'ozone_platform_test%': 1,
         'ozone_platform_egltest%': 1,
       }],
@@ -2719,9 +2718,6 @@
       ['enable_hidpi==1', {
         'defines': ['ENABLE_HIDPI=1'],
       }],
-      ['native_discardable_memory==1', {
-        'defines': ['DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY'],
-      }],
       ['native_memory_pressure_signals==1', {
         'defines': ['SYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE'],
       }],
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index cebf4de..5a27e78 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -16,8 +16,8 @@
 
   if (!defined(default_android_sdk_root)) {
     default_android_sdk_root = "//third_party/android_tools/sdk"
-    default_android_sdk_version = "21"
-    default_android_sdk_build_tools_version = "21.0.1"
+    default_android_sdk_version = "22"
+    default_android_sdk_build_tools_version = "22.0.0"
   }
 
   if (!defined(google_play_services_library)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 28608cb..a056997 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1216,6 +1216,11 @@
         invoker.enable_relocation_packing) {
       _enable_relocation_packing = true
     }
+
+    _native_lib_version_name = ""
+    if (defined(invoker.native_lib_version_name)) {
+      _native_lib_version_name = invoker.native_lib_version_name
+    }
   }
 
   _rebased_build_config = rebase_path(_build_config, root_build_dir)
@@ -1252,8 +1257,6 @@
       _enable_chromium_linker_tests = invoker.enable_chromium_linker_tests
     }
 
-    _native_lib_version_name = ""
-
     java_cpp_template("${_template_name}__native_libraries_java") {
       package_name = "org/chromium/base/library_loader"
       sources = [
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index f75ad06..42dc584 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -726,6 +726,7 @@
   if (is_win) {
     cflags = [
       "/WX",  # Treat warnings as errors.
+
       # Warnings permanently disabled:
 
       # TODO(GYP) The GYP build doesn't have this globally enabled but disabled
@@ -780,6 +781,7 @@
       # have to turn off this warning (and be careful about how object
       # destruction happens in such cases).
       "/wd4611",
+
       # Warnings to evaluate and possibly fix/reenable later:
 
       "/wd4100",  # Unreferenced formal function parameter.
@@ -923,6 +925,8 @@
 #
 # Note that this can be applied regardless of platform and architecture to
 # clean up the call sites. This will only apply the flag when necessary.
+#
+# TODO(jschuh): crbug.com/167187 fix this and delete this config.
 config("no_size_t_to_int_warning") {
   if (is_win && current_cpu == "x64") {
     cflags = [ "/wd4267" ]
diff --git a/build/config/features.gni b/build/config/features.gni
index ee61da5..783e32d 100644
--- a/build/config/features.gni
+++ b/build/config/features.gni
@@ -72,6 +72,8 @@
   enable_google_now = !is_ios && !is_android
 
   enable_one_click_signin = is_win || is_mac || (is_linux && !is_chromeos)
+
+  enable_remoting = !is_ios && !is_android
 }
 
 # Additional dependent variables -----------------------------------------------
@@ -158,8 +160,6 @@
 # Image loader extension is enabled on ChromeOS only.
 enable_image_loader_extension = is_chromeos
 
-enable_remoting = !is_ios && !is_android
-
 # Chrome OS: whether to also build the upcoming version of
 # ChromeVox, which can then be enabled via a command-line switch.
 enable_chromevox_next = false
diff --git a/build/config/linux/BUILD.gn b/build/config/linux/BUILD.gn
index 202fd73..3d65937 100644
--- a/build/config/linux/BUILD.gn
+++ b/build/config/linux/BUILD.gn
@@ -35,6 +35,25 @@
   }
 }
 
+pkg_config("atk") {
+  packages = [ "atk" ]
+  atk_lib_dir = exec_script(pkg_config_script,
+                            [
+                              "--libdir",
+                              "atk",
+                            ],
+                            "string")
+  defines = [ "ATK_LIB_DIR=\"$atk_lib_dir\"" ]
+}
+
+# gn orders flags on a target before flags from configs. The default config
+# adds -Wall, and these flags have to be after -Wall -- so they need to come
+# from a config and can't be on the target directly.
+config("atk_warnings") {
+  # glib uses the pre-c++11 typedef-as-static_assert hack.
+  cflags = [ "-Wno-unused-local-typedef" ]
+}
+
 config("fontconfig") {
   libs = [ "fontconfig" ]
 }
diff --git a/build/config/linux/pkg-config.py b/build/config/linux/pkg-config.py
index a4f4703..fadcc0b 100644
--- a/build/config/linux/pkg-config.py
+++ b/build/config/linux/pkg-config.py
@@ -112,6 +112,7 @@
 parser.add_option('-a', action='store', dest='arch', type='string')
 parser.add_option('--atleast-version', action='store',
                   dest='atleast_version', type='string')
+parser.add_option('--libdir', action='store_true', dest='libdir')
 (options, args) = parser.parse_args()
 
 # Make a list of regular expressions to strip out.
@@ -138,6 +139,18 @@
     print "false"
   sys.exit(0)
 
+if options.libdir:
+  try:
+    libdir = subprocess.check_output([options.pkg_config,
+                                      "--variable=libdir"] +
+                                     args,
+                                     env=os.environ)
+  except:
+    print "Error from pkg-config."
+    sys.exit(1)
+  sys.stdout.write(libdir.strip())
+  sys.exit(0)
+
 try:
   flag_string = subprocess.check_output(
       [ options.pkg_config, "--cflags", "--libs-only-l", "--libs-only-L" ] +
diff --git a/build/filename_rules.gypi b/build/filename_rules.gypi
index bc657d8..48c8027 100644
--- a/build/filename_rules.gypi
+++ b/build/filename_rules.gypi
@@ -106,11 +106,6 @@
                     ['exclude', '(^|/)evdev/'],
       ]
     }],
-    ['<(ozone_platform_dri)==0 or >(nacl_untrusted_build)==1', {
-      'sources/': [ ['exclude', '_dri(_browsertest|_unittest)?\\.(h|cc)$'],
-                    ['exclude', '(^|/)dri/'],
-      ]
-    }],
     ['<(use_pango)==0', {
       'sources/': [ ['exclude', '(^|_)pango(_util|_browsertest|_unittest)?\\.(h|cc)$'], ],
     }],
diff --git a/build/gn_migration.gypi b/build/gn_migration.gypi
index 92c050f..8413002 100644
--- a/build/gn_migration.gypi
+++ b/build/gn_migration.gypi
@@ -112,6 +112,10 @@
         '../net/net.gyp:dump_cache',
         '../net/net.gyp:gdig',
         '../net/net.gyp:get_server_time',
+        '../net/net.gyp:hpack_example_generator',
+        '../net/net.gyp:hpack_fuzz_mutator',
+        '../net/net.gyp:hpack_fuzz_wrapper',
+        '../net/net.gyp:net_perftests',
         '../net/net.gyp:net_unittests',
         '../net/net.gyp:net_watcher',  # TODO(GYP): This should be conditional on use_v8_in_net
         '../net/net.gyp:run_testserver',
@@ -227,7 +231,7 @@
         }],
         ['OS=="android"', {
           'dependencies': [
-            '../base/base.gyp:chromium_android_linker', 
+            '../base/base.gyp:chromium_android_linker',
             '../breakpad/breakpad.gyp:dump_syms',
             '../build/android/rezip.gyp:rezip_apk_jar',
             '../chrome/chrome.gyp:chrome_shell_apk',
@@ -235,7 +239,7 @@
             #"//clank" TODO(GYP) - conditional somehow?
             '../tools/imagediff/image_diff.gyp:image_diff#host',
             '../tools/telemetry/telemetry.gyp:bitmaptools#host',
-      
+
             # TODO(GYP): Remove these when the components_unittests work.
             #"//components/history/core/test:test",
             #"//components/policy:policy_component_test_support",
@@ -247,7 +251,7 @@
             #"//components/wallpaper",
 
             '../content/content_shell_and_tests.gyp:content_shell_apk',
-      
+
             # TODO(GYP): Are these needed, or will they be pulled in automatically?
             #"//third_party/android_tools:android_gcm_java",
             #"//third_party/android_tools:uiautomator_java",
@@ -408,7 +412,6 @@
             '../device/device_tests.gyp:device_unittests',
             '../gin/gin.gyp:gin_v8_snapshot_fingerprint',
             '../gin/gin.gyp:gin_shell',
-            '../google_apis/gcm/gcm.gyp:mcs_probe',
             '../gpu/gpu.gyp:gl_tests',
             '../gpu/gles2_conform_support/gles2_conform_support.gyp:gles2_conform_support',
             '../gpu/gles2_conform_support/gles2_conform_test.gyp:gles2_conform_test',
@@ -418,10 +421,6 @@
             '../media/cast/cast.gyp:generate_timecode_audio',
             '../media/cast/cast.gyp:tap_proxy',
             '../mojo/mojo_base.gyp:mojo_application_chromium',
-            '../net/net.gyp:hpack_example_generator',
-            '../net/net.gyp:hpack_fuzz_mutator',
-            '../net/net.gyp:hpack_fuzz_wrapper',
-            '../net/net.gyp:net_perftests',
             '../ppapi/ppapi_internal.gyp:ppapi_unittests',
             '../ppapi/tools/ppapi_tools.gyp:pepper_hash_for_uma',
             '../sandbox/sandbox.gyp:sandbox_linux_jni_unittests',
diff --git a/build/gyp_helper.py b/build/gyp_helper.py
index a2cc7e1..9be2b9e 100644
--- a/build/gyp_helper.py
+++ b/build/gyp_helper.py
@@ -44,11 +44,17 @@
       if var in os.environ:
         behavior = 'replaces'
         if var == 'GYP_DEFINES':
-          os.environ[var] = file_val + ' ' + os.environ[var]
-          behavior = 'overrides'
+          result = file_val + ' ' + os.environ[var]
+          behavior = 'merges with, and individual components override,'
+        else:
+          result = os.environ[var]
         print 'INFO: Environment value for "%s" %s value in %s' % (
             var, behavior, os.path.abspath(file_path)
         )
+        string_padding = max(len(var), len(file_path), len('result'))
+        print '      %s: %s' % (var.rjust(string_padding), os.environ[var])
+        print '      %s: %s' % (file_path.rjust(string_padding), file_val)
+        os.environ[var] = result
       else:
         os.environ[var] = file_val
 
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index 43b5545..32dd744 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -102,16 +102,15 @@
           language-pack-fr language-pack-he language-pack-zh-hant
           libapache2-mod-php5 libasound2-dev libbrlapi-dev libav-tools
           libbz2-dev libcairo2-dev libcap-dev libcups2-dev libcurl4-gnutls-dev
-          libdrm-dev libelf-dev libexif-dev libgconf2-dev libgl1-mesa-dev
-          libglib2.0-dev libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev
-          libkrb5-dev libnspr4-dev libnss3-dev libpam0g-dev libpci-dev
-          libpulse-dev libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev
-          libudev-dev libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev
-          mesa-common-dev openbox patch perl php5-cgi pkg-config python
-          python-cherrypy3 python-crypto python-dev python-numpy python-opencv
-          python-openssl python-psutil rpm ruby subversion ttf-dejavu-core
-          ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho wdiff xfonts-mathml
-          zip $chromeos_dev_list"
+          libdrm-dev libelf-dev libexif-dev libgconf2-dev libglib2.0-dev
+          libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev libkrb5-dev
+          libnspr4-dev libnss3-dev libpam0g-dev libpci-dev libpulse-dev
+          libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev libudev-dev
+          libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev openbox
+          patch perl php5-cgi pkg-config python python-cherrypy3 python-crypto
+          python-dev python-numpy python-opencv python-openssl python-psutil
+          rpm ruby subversion ttf-dejavu-core ttf-indic-fonts ttf-kochi-gothic
+          ttf-kochi-mincho wdiff xfonts-mathml zip $chromeos_dev_list"
 
 # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
 # NaCl binaries.
@@ -164,14 +163,16 @@
 # it depends on mesa, and only one version of mesa can exists on the system.
 # Hence we must match the same version or this entire script will fail.
 mesa_variant=""
-for variant in "-lts-quantal" "-lts-raring" "-lts-saucy" "-lts-trusty"; do
+for variant in "-lts-quantal" "-lts-raring" "-lts-saucy" "-lts-trusty" \
+               "-lts-utopic"; do
   if $(dpkg-query -Wf'${Status}' libgl1-mesa-glx${variant} 2>/dev/null | \
        grep -q " ok installed"); then
     mesa_variant="${variant}"
   fi
 done
 dev_list="${dev_list} libgbm-dev${mesa_variant}
-          libgles2-mesa-dev${mesa_variant}"
+          libgles2-mesa-dev${mesa_variant} libgl1-mesa-dev${mesa_variant}
+          mesa-common-dev${mesa_variant}"
 nacl_list="${nacl_list} libgl1-mesa-glx${mesa_variant}:i386"
 
 # Some package names have changed over time
diff --git a/build/ios/grit_whitelist.txt b/build/ios/grit_whitelist.txt
index 0d19361..28407eb 100644
--- a/build/ios/grit_whitelist.txt
+++ b/build/ios/grit_whitelist.txt
@@ -273,7 +273,6 @@
 IDS_CRASHES_NO_CRASHES_MESSAGE
 IDS_CRASHES_TITLE
 IDS_CRASHES_UPLOAD_MESSAGE
-IDS_CREDIT_CARD_NUMBER_PREVIEW_FORMAT
 IDS_DATA_REDUCTION_PROXY_BACK_BUTTON
 IDS_DATA_REDUCTION_PROXY_CANNOT_PROXY_HEADING
 IDS_DATA_REDUCTION_PROXY_CANNOT_PROXY_PRIMARY_PARAGRAPH
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
index a71a5c5..5333798 100644
--- a/build/linux/system.gyp
+++ b/build/linux/system.gyp
@@ -91,6 +91,30 @@
       # added back to Chrome OS and Ozone. Don't try to use GTK on Chrome OS and Ozone.
       'targets': [
         {
+          'target_name': 'atk',
+          'type': 'none',
+          'conditions': [
+            ['_toolset=="target"', {
+              'direct_dependent_settings': {
+                'cflags': [
+                  '<!@(<(pkg-config) --cflags atk)',
+                ],
+                'defines': [
+                  'ATK_LIB_DIR="<!@(<(pkg-config) --variable=libdir atk)"',
+                ],
+              },
+              'link_settings': {
+                'ldflags': [
+                  '<!@(<(pkg-config) --libs-only-L --libs-only-other atk)',
+                ],
+                'libraries': [
+                  '<!@(<(pkg-config) --libs-only-l atk)',
+                ],
+              },
+            }],
+          ],
+        },
+        {
           'target_name': 'gdk',
           'type': 'none',
           'conditions': [
@@ -508,7 +532,7 @@
         },
       ],
     }],
-    ['ozone_platform_dri==1 or ozone_platform_gbm==1', {
+    ['ozone_platform_dri==1 or ozone_platform_drm==1 or ozone_platform_gbm==1', {
       'targets': [
         {
           'target_name': 'libdrm',
diff --git a/build/secondary/tools/grit/grit_rule.gni b/build/secondary/tools/grit/grit_rule.gni
index 626fd74..777c3dc 100644
--- a/build/secondary/tools/grit/grit_rule.gni
+++ b/build/secondary/tools/grit/grit_rule.gni
@@ -364,8 +364,21 @@
   action(grit_custom_target) {
     script = "//tools/grit/grit.py"
     inputs = grit_inputs
-    outputs = grit_outputs
-    depfile = "$output_dir/${grit_output_name}.d"
+
+    # TODO(knn): Remove this once grit has rolled to recognize the flag.
+    depend_on_stamp =
+        defined(invoker.depend_on_stamp) && invoker.depend_on_stamp
+    if (depend_on_stamp) {
+      # Need this for migrating existing targets without clobbering.
+      depfile = "$output_dir/${grit_output_name}_stamp.d"
+      outputs = [
+        "${depfile}.stamp",
+      ]
+    } else {
+      depfile = "$output_dir/${grit_output_name}.d"
+      outputs = []
+    }
+    outputs += grit_outputs
 
     args = [
       "-i",
@@ -379,14 +392,18 @@
       ]
     }
     args += [
-              "-o",
-              rebased_output_dir,
-              "--depdir",
-              ".",
-              "--depfile",
-              rebase_path(depfile, root_build_dir),
-              "--write-only-new=1",
-            ] + grit_defines
+      "-o",
+      rebased_output_dir,
+      "--depdir",
+      ".",
+      "--depfile",
+      rebase_path(depfile, root_build_dir),
+      "--write-only-new=1",
+    ]
+    if (depend_on_stamp) {
+      args += [ "--depend-on-stamp" ]
+    }
+    args += grit_defines
 
     # Add extra defines with -D flags.
     if (defined(invoker.defines)) {
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
index 7191150..ea82f4e 100644
--- a/build/whitespace_file.txt
+++ b/build/whitespace_file.txt
@@ -152,3 +152,5 @@
 
 In the BUILD we trust.
 ^_^
+
+In the masters we don't.
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 4ee07db..ad33651 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -38,39 +38,6 @@
     "animation/transform_operation.h",
     "animation/transform_operations.cc",
     "animation/transform_operations.h",
-    "base/completion_event.h",
-    "base/delayed_unique_notifier.cc",
-    "base/delayed_unique_notifier.h",
-    "base/invalidation_region.cc",
-    "base/invalidation_region.h",
-    "base/latency_info_swap_promise.cc",
-    "base/latency_info_swap_promise.h",
-    "base/latency_info_swap_promise_monitor.cc",
-    "base/latency_info_swap_promise_monitor.h",
-    "base/math_util.cc",
-    "base/math_util.h",
-    "base/ref_counted_managed.h",
-    "base/region.cc",
-    "base/region.h",
-    "base/rolling_time_delta_history.cc",
-    "base/rolling_time_delta_history.h",
-    "base/scoped_ptr_algorithm.h",
-    "base/scoped_ptr_deque.h",
-    "base/scoped_ptr_vector.h",
-    "base/simple_enclosed_region.cc",
-    "base/simple_enclosed_region.h",
-    "base/swap_promise.h",
-    "base/swap_promise_monitor.cc",
-    "base/swap_promise_monitor.h",
-    "base/switches.cc",
-    "base/switches.h",
-    "base/synced_property.h",
-    "base/tiling_data.cc",
-    "base/tiling_data.h",
-    "base/time_util.h",
-    "base/unique_notifier.cc",
-    "base/unique_notifier.h",
-    "base/util.h",
     "debug/benchmark_instrumentation.cc",
     "debug/benchmark_instrumentation.h",
     "debug/debug_colors.cc",
@@ -260,6 +227,8 @@
     "output/gl_renderer.h",
     "output/gl_renderer_draw_cache.cc",
     "output/gl_renderer_draw_cache.h",
+    "output/latency_info_swap_promise.cc",
+    "output/latency_info_swap_promise.h",
     "output/managed_memory_policy.cc",
     "output/managed_memory_policy.h",
     "output/output_surface.cc",
@@ -278,6 +247,8 @@
     "output/render_surface_filters.h",
     "output/renderer.cc",
     "output/renderer.h",
+    "output/renderer_capabilities.cc",
+    "output/renderer_capabilities.h",
     "output/renderer_settings.cc",
     "output/renderer_settings.h",
     "output/shader.cc",
@@ -290,6 +261,7 @@
     "output/software_renderer.h",
     "output/static_geometry_binding.cc",
     "output/static_geometry_binding.h",
+    "output/swap_promise.h",
     "output/viewport_selection_bound.cc",
     "output/viewport_selection_bound.h",
     "output/vsync_parameter_observer.h",
@@ -499,6 +471,8 @@
     "trees/damage_tracker.h",
     "trees/draw_property_utils.cc",
     "trees/draw_property_utils.h",
+    "trees/latency_info_swap_promise_monitor.cc",
+    "trees/latency_info_swap_promise_monitor.h",
     "trees/layer_tree_host.cc",
     "trees/layer_tree_host.h",
     "trees/layer_tree_host_client.h",
@@ -526,6 +500,8 @@
     "trees/scoped_abort_remaining_swap_promises.h",
     "trees/single_thread_proxy.cc",
     "trees/single_thread_proxy.h",
+    "trees/swap_promise_monitor.cc",
+    "trees/swap_promise_monitor.h",
     "trees/thread_proxy.cc",
     "trees/thread_proxy.h",
     "trees/tree_synchronizer.cc",
@@ -536,6 +512,7 @@
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 
   public_deps = [
+    "//cc/base",
     "//skia",
   ]
   deps = [
diff --git a/cc/base/BUILD.gn b/cc/base/BUILD.gn
new file mode 100644
index 0000000..203f84a
--- /dev/null
+++ b/cc/base/BUILD.gn
@@ -0,0 +1,51 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("base") {
+  visibility = [ "//cc" ]
+
+  sources = [
+    "completion_event.h",
+    "delayed_unique_notifier.cc",
+    "delayed_unique_notifier.h",
+    "invalidation_region.cc",
+    "invalidation_region.h",
+    "math_util.cc",
+    "math_util.h",
+    "ref_counted_managed.h",
+    "region.cc",
+    "region.h",
+    "rolling_time_delta_history.cc",
+    "rolling_time_delta_history.h",
+    "scoped_ptr_algorithm.h",
+    "scoped_ptr_deque.h",
+    "scoped_ptr_vector.h",
+    "simple_enclosed_region.cc",
+    "simple_enclosed_region.h",
+    "switches.cc",
+    "switches.h",
+    "synced_property.h",
+    "tiling_data.cc",
+    "tiling_data.h",
+    "time_util.h",
+    "unique_notifier.cc",
+    "unique_notifier.h",
+    "util.h",
+  ]
+
+  deps = [
+    "//base",
+    "//base/third_party/dynamic_annotations",
+    "//skia",
+    "//ui/gfx",
+    "//ui/gfx/geometry",
+  ]
+
+  defines = [ "CC_IMPLEMENTATION=1" ]
+
+  if (!is_debug && (is_win || is_android)) {
+    configs -= [ "//build/config/compiler:optimize" ]
+    configs += [ "//build/config/compiler:optimize_max" ]
+  }
+}
diff --git a/cc/base/DEPS b/cc/base/DEPS
new file mode 100644
index 0000000..33b4e8f
--- /dev/null
+++ b/cc/base/DEPS
@@ -0,0 +1,12 @@
+# Things within cc/base should not depend on things in cc/ outside of cc/base.
+include_rules = [
+  "-cc",
+  "+cc/base",
+]
+
+# Tests can use things in cc/test
+specific_include_rules = {
+  ".*unittest\.cc": [
+    "+cc/test",
+  ]
+}
diff --git a/cc/base/latency_info_swap_promise.cc b/cc/base/latency_info_swap_promise.cc
deleted file mode 100644
index 8c6ee0e..0000000
--- a/cc/base/latency_info_swap_promise.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/base/latency_info_swap_promise.h"
-
-#include "base/logging.h"
-
-namespace {
-  ui::LatencyComponentType DidNotSwapReasonToLatencyComponentType(
-      cc::SwapPromise::DidNotSwapReason reason) {
-    switch (reason) {
-      case cc::SwapPromise::DID_NOT_SWAP_UNKNOWN:
-      case cc::SwapPromise::SWAP_FAILS:
-        return ui::INPUT_EVENT_LATENCY_TERMINATED_SWAP_FAILED_COMPONENT;
-      case cc::SwapPromise::COMMIT_FAILS:
-        return ui::INPUT_EVENT_LATENCY_TERMINATED_COMMIT_FAILED_COMPONENT;
-      case cc::SwapPromise::COMMIT_NO_UPDATE:
-        return ui::INPUT_EVENT_LATENCY_TERMINATED_COMMIT_NO_UPDATE_COMPONENT;
-    }
-    NOTREACHED() << "Unhandled DidNotSwapReason.";
-    return ui::INPUT_EVENT_LATENCY_TERMINATED_SWAP_FAILED_COMPONENT;
-  }
-}  // namespace
-
-namespace cc {
-
-LatencyInfoSwapPromise::LatencyInfoSwapPromise(const ui::LatencyInfo& latency)
-    : latency_(latency) {
-}
-
-LatencyInfoSwapPromise::~LatencyInfoSwapPromise() {
-}
-
-void LatencyInfoSwapPromise::DidSwap(CompositorFrameMetadata* metadata) {
-  DCHECK(!latency_.terminated);
-  metadata->latency_info.push_back(latency_);
-}
-
-void LatencyInfoSwapPromise::DidNotSwap(DidNotSwapReason reason) {
-  latency_.AddLatencyNumber(DidNotSwapReasonToLatencyComponentType(reason),
-                            0, 0);
-  // TODO(miletus): Turn this back on once per-event LatencyInfo tracking
-  // is enabled in GPU side.
-  // DCHECK(latency_.terminated);
-}
-
-int64 LatencyInfoSwapPromise::TraceId() const {
-  return latency_.trace_id;
-}
-
-}  // namespace cc
diff --git a/cc/cc.gyp b/cc/cc.gyp
index bc83b1f..c796e7d 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -69,10 +69,6 @@
         'base/delayed_unique_notifier.h',
         'base/invalidation_region.cc',
         'base/invalidation_region.h',
-        'base/latency_info_swap_promise.cc',
-        'base/latency_info_swap_promise.h',
-        'base/latency_info_swap_promise_monitor.cc',
-        'base/latency_info_swap_promise_monitor.h',
         'base/math_util.cc',
         'base/math_util.h',
         'base/ref_counted_managed.h',
@@ -85,9 +81,6 @@
         'base/scoped_ptr_vector.h',
         'base/simple_enclosed_region.cc',
         'base/simple_enclosed_region.h',
-        'base/swap_promise.h',
-        'base/swap_promise_monitor.cc',
-        'base/swap_promise_monitor.h',
         'base/switches.cc',
         'base/switches.h',
         'base/synced_property.h',
@@ -293,6 +286,8 @@
         'output/gl_renderer.h',
         'output/gl_renderer_draw_cache.cc',
         'output/gl_renderer_draw_cache.h',
+        'output/latency_info_swap_promise.cc',
+        'output/latency_info_swap_promise.h',
         'output/managed_memory_policy.cc',
         'output/managed_memory_policy.h',
         'output/output_surface.cc',
@@ -311,6 +306,8 @@
         'output/render_surface_filters.h',
         'output/renderer.cc',
         'output/renderer.h',
+        'output/renderer_capabilities.cc',
+        'output/renderer_capabilities.h',
         'output/renderer_settings.cc',
         'output/renderer_settings.h',
         'output/shader.cc',
@@ -323,6 +320,7 @@
         'output/software_renderer.h',
         'output/static_geometry_binding.cc',
         'output/static_geometry_binding.h',
+        'output/swap_promise.h',
         'output/viewport_selection_bound.cc',
         'output/viewport_selection_bound.h',
         'output/vsync_parameter_observer.h',
@@ -535,6 +533,8 @@
         'trees/damage_tracker.h',
         'trees/draw_property_utils.cc',
         'trees/draw_property_utils.h',
+        'trees/latency_info_swap_promise_monitor.cc',
+        'trees/latency_info_swap_promise_monitor.h',
         'trees/layer_tree_host.cc',
         'trees/layer_tree_host.h',
         'trees/layer_tree_host_client.h',
@@ -562,6 +562,8 @@
         'trees/scoped_abort_remaining_swap_promises.h',
         'trees/single_thread_proxy.cc',
         'trees/single_thread_proxy.h',
+        'trees/swap_promise_monitor.cc',
+        'trees/swap_promise_monitor.h',
         'trees/thread_proxy.cc',
         'trees/thread_proxy.h',
         'trees/tree_synchronizer.cc',
diff --git a/cc/cc_unittests.isolate b/cc/cc_unittests.isolate
index 7c359d0..dc6c449 100644
--- a/cc/cc_unittests.isolate
+++ b/cc/cc_unittests.isolate
@@ -84,6 +84,5 @@
   ],
   'includes': [
     '../base/base.isolate',
-    '../third_party/angle/angle.isolate',
   ],
 }
diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h
index 954f8d7..81d91b8 100644
--- a/cc/input/input_handler.h
+++ b/cc/input/input_handler.h
@@ -9,8 +9,8 @@
 #include "base/memory/scoped_ptr.h"
 #include "base/time/time.h"
 #include "cc/base/cc_export.h"
-#include "cc/base/swap_promise_monitor.h"
 #include "cc/input/scrollbar.h"
+#include "cc/trees/swap_promise_monitor.h"
 
 namespace gfx {
 class Point;
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index bf2f26a..12773a1 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -52,6 +52,7 @@
       transform_tree_index_(-1),
       opacity_tree_index_(-1),
       clip_tree_index_(-1),
+      should_flatten_transform_from_property_tree_(false),
       should_scroll_on_main_thread_(false),
       have_wheel_event_handlers_(false),
       have_scroll_event_handlers_(false),
@@ -1294,6 +1295,8 @@
   if (transform_tree_index() >= 0) {
     gfx::Transform ssxform = tree.Node(transform_tree_index())->data.to_screen;
     xform.ConcatTransform(ssxform);
+    if (should_flatten_transform_from_property_tree_)
+      xform.FlattenTo2d();
   }
   xform.Scale(1.0 / contents_scale_x(), 1.0 / contents_scale_y());
   return xform;
@@ -1313,6 +1316,8 @@
     // If you're not the root, or you don't own a surface, you need to apply
     // your local offset.
     xform = node->data.to_target;
+    if (should_flatten_transform_from_property_tree_)
+      xform.FlattenTo2d();
     xform.Translate(offset_to_transform_parent().x(),
                     offset_to_transform_parent().y());
   } else {
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index a82da24..e0288c7 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -174,6 +174,10 @@
   void SetIsContainerForFixedPositionLayers(bool container);
   bool IsContainerForFixedPositionLayers() const;
 
+  gfx::Vector2dF FixedContainerSizeDelta() const {
+    return gfx::Vector2dF();
+  }
+
   void SetPositionConstraint(const LayerPositionConstraint& constraint);
   const LayerPositionConstraint& position_constraint() const {
     return position_constraint_;
@@ -504,6 +508,10 @@
       const TransformTree& tree) const;
   float DrawOpacityFromPropertyTrees(const OpacityTree& tree) const;
 
+  void set_should_flatten_transform_from_property_tree(bool should_flatten) {
+    should_flatten_transform_from_property_tree_ = should_flatten;
+  }
+
   // TODO(vollick): These values are temporary and will be removed as soon as
   // render surface determinations are moved out of CDP. They only exist because
   // certain logic depends on whether or not a layer would render to a separate
@@ -654,6 +662,7 @@
   int opacity_tree_index_;
   int clip_tree_index_;
   gfx::Vector2dF offset_to_transform_parent_;
+  bool should_flatten_transform_from_property_tree_ : 1;
   bool should_scroll_on_main_thread_ : 1;
   bool have_wheel_event_handlers_ : 1;
   bool have_scroll_event_handlers_ : 1;
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 80d36d8..672aab4 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -9,6 +9,7 @@
 #include "cc/layers/picture_layer_impl.h"
 #include "cc/resources/display_list_recording_source.h"
 #include "cc/resources/picture_pile.h"
+#include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "third_party/skia/include/core/SkPictureRecorder.h"
 #include "ui/gfx/geometry/rect_conversions.h"
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc
index ab6289e..1a690b6 100644
--- a/cc/layers/surface_layer.cc
+++ b/cc/layers/surface_layer.cc
@@ -4,8 +4,8 @@
 
 #include "cc/layers/surface_layer.h"
 
-#include "cc/base/swap_promise.h"
 #include "cc/layers/surface_layer_impl.h"
+#include "cc/output/swap_promise.h"
 #include "cc/trees/layer_tree_host.h"
 
 namespace cc {
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 3813e1d..b49ac8e 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -2073,7 +2073,7 @@
   // un-antialiased quad should have and which vertex this is and the float
   // quad passed in via uniform is the actual geometry that gets used to draw
   // it. This is why this centered rect is used and not the original quad_rect.
-  gfx::RectF tile_rect = quad->visible_rect;
+  gfx::RectF tile_rect = quad->rect;
   GLC(gl_, gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb));
   GLC(gl_, gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust));
 
diff --git a/cc/output/gl_renderer.cc.rej b/cc/output/gl_renderer.cc.rej
new file mode 100644
index 0000000..3cf4e17
--- /dev/null
+++ b/cc/output/gl_renderer.cc.rej
@@ -0,0 +1,9 @@
+diff a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc	(rejected hunks)
+@@ -18,7 +18,6 @@
+ #include "build/build_config.h"
+ #include "base/trace_event/trace_event.h"
+ #include "cc/base/math_util.h"
+-#include "cc/layers/video_layer_impl.h"
+ #include "cc/output/compositor_frame.h"
+ #include "cc/output/compositor_frame_metadata.h"
+ #include "cc/output/context_provider.h"
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index cec0882..62bff6f 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -169,7 +169,7 @@
 
 namespace {
 
-#if !defined(OS_ANDROID)
+#if !defined(OS_ANDROID) && !defined(OS_WIN)
 TEST_F(GLRendererShaderPixelTest, AllShadersCompile) { TestShaders(); }
 #endif
 
diff --git a/cc/output/latency_info_swap_promise.cc b/cc/output/latency_info_swap_promise.cc
new file mode 100644
index 0000000..3c07162
--- /dev/null
+++ b/cc/output/latency_info_swap_promise.cc
@@ -0,0 +1,52 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/output/latency_info_swap_promise.h"
+
+#include "base/logging.h"
+
+namespace {
+ui::LatencyComponentType DidNotSwapReasonToLatencyComponentType(
+    cc::SwapPromise::DidNotSwapReason reason) {
+  switch (reason) {
+    case cc::SwapPromise::DID_NOT_SWAP_UNKNOWN:
+    case cc::SwapPromise::SWAP_FAILS:
+      return ui::INPUT_EVENT_LATENCY_TERMINATED_SWAP_FAILED_COMPONENT;
+    case cc::SwapPromise::COMMIT_FAILS:
+      return ui::INPUT_EVENT_LATENCY_TERMINATED_COMMIT_FAILED_COMPONENT;
+    case cc::SwapPromise::COMMIT_NO_UPDATE:
+      return ui::INPUT_EVENT_LATENCY_TERMINATED_COMMIT_NO_UPDATE_COMPONENT;
+  }
+  NOTREACHED() << "Unhandled DidNotSwapReason.";
+  return ui::INPUT_EVENT_LATENCY_TERMINATED_SWAP_FAILED_COMPONENT;
+}
+}  // namespace
+
+namespace cc {
+
+LatencyInfoSwapPromise::LatencyInfoSwapPromise(const ui::LatencyInfo& latency)
+    : latency_(latency) {
+}
+
+LatencyInfoSwapPromise::~LatencyInfoSwapPromise() {
+}
+
+void LatencyInfoSwapPromise::DidSwap(CompositorFrameMetadata* metadata) {
+  DCHECK(!latency_.terminated);
+  metadata->latency_info.push_back(latency_);
+}
+
+void LatencyInfoSwapPromise::DidNotSwap(DidNotSwapReason reason) {
+  latency_.AddLatencyNumber(DidNotSwapReasonToLatencyComponentType(reason), 0,
+                            0);
+  // TODO(miletus): Turn this back on once per-event LatencyInfo tracking
+  // is enabled in GPU side.
+  // DCHECK(latency_.terminated);
+}
+
+int64 LatencyInfoSwapPromise::TraceId() const {
+  return latency_.trace_id;
+}
+
+}  // namespace cc
diff --git a/cc/base/latency_info_swap_promise.h b/cc/output/latency_info_swap_promise.h
similarity index 78%
rename from cc/base/latency_info_swap_promise.h
rename to cc/output/latency_info_swap_promise.h
index a7941f1..afd1633 100644
--- a/cc/base/latency_info_swap_promise.h
+++ b/cc/output/latency_info_swap_promise.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CC_BASE_LATENCY_INFO_SWAP_PROMISE_H_
-#define CC_BASE_LATENCY_INFO_SWAP_PROMISE_H_
+#ifndef CC_OUTPUT_LATENCY_INFO_SWAP_PROMISE_H_
+#define CC_OUTPUT_LATENCY_INFO_SWAP_PROMISE_H_
 
 #include "base/compiler_specific.h"
-#include "cc/base/swap_promise.h"
+#include "cc/output/swap_promise.h"
 #include "ui/events/latency_info.h"
 
 namespace cc {
@@ -27,4 +27,4 @@
 
 }  // namespace cc
 
-#endif  // CC_BASE_LATENCY_INFO_SWAP_PROMISE_H_
+#endif  // CC_OUTPUT_LATENCY_INFO_SWAP_PROMISE_H_
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
index 9090621..75fbb6e 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "cc/base/scoped_ptr_vector.h"
+#include "cc/output/compositor_frame_metadata.h"
 #include "cc/output/gl_renderer.h"
 #include "cc/output/output_surface.h"
 #include "cc/output/output_surface_client.h"
diff --git a/cc/output/renderer.h b/cc/output/renderer.h
index c92ce6f..b775285 100644
--- a/cc/output/renderer.h
+++ b/cc/output/renderer.h
@@ -8,7 +8,9 @@
 #include "base/basictypes.h"
 #include "cc/base/cc_export.h"
 #include "cc/base/scoped_ptr_vector.h"
-#include "cc/trees/layer_tree_host.h"
+#include "cc/output/renderer_capabilities.h"
+#include "cc/output/renderer_settings.h"
+#include "ui/gfx/geometry/rect.h"
 
 namespace cc {
 
diff --git a/cc/output/renderer_capabilities.cc b/cc/output/renderer_capabilities.cc
new file mode 100644
index 0000000..36e012b
--- /dev/null
+++ b/cc/output/renderer_capabilities.cc
@@ -0,0 +1,29 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/output/renderer_capabilities.h"
+
+namespace cc {
+
+RendererCapabilities::RendererCapabilities(ResourceFormat best_texture_format,
+                                           bool allow_partial_texture_updates,
+                                           int max_texture_size,
+                                           bool using_shared_memory_resources)
+    : best_texture_format(best_texture_format),
+      allow_partial_texture_updates(allow_partial_texture_updates),
+      max_texture_size(max_texture_size),
+      using_shared_memory_resources(using_shared_memory_resources) {
+}
+
+RendererCapabilities::RendererCapabilities()
+    : best_texture_format(RGBA_8888),
+      allow_partial_texture_updates(false),
+      max_texture_size(0),
+      using_shared_memory_resources(false) {
+}
+
+RendererCapabilities::~RendererCapabilities() {
+}
+
+}  // namespace cc
diff --git a/cc/output/renderer_capabilities.h b/cc/output/renderer_capabilities.h
new file mode 100644
index 0000000..f03d51c
--- /dev/null
+++ b/cc/output/renderer_capabilities.h
@@ -0,0 +1,32 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_OUTPUT_RENDERER_CAPABILITIES_H_
+#define CC_OUTPUT_RENDERER_CAPABILITIES_H_
+
+#include "cc/base/cc_export.h"
+#include "cc/resources/resource_format.h"
+
+namespace cc {
+
+// Represents the set of capabilities that a particular Renderer has.
+struct CC_EXPORT RendererCapabilities {
+  RendererCapabilities(ResourceFormat best_texture_format,
+                       bool allow_partial_texture_updates,
+                       int max_texture_size,
+                       bool using_shared_memory_resources);
+
+  RendererCapabilities();
+  ~RendererCapabilities();
+
+  // Duplicate any modification to this list to RendererCapabilitiesImpl.
+  ResourceFormat best_texture_format;
+  bool allow_partial_texture_updates;
+  int max_texture_size;
+  bool using_shared_memory_resources;
+};
+
+}  // namespace cc
+
+#endif  // CC_OUTPUT_RENDERER_CAPABILITIES_H_
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index ebda8d6..9166ea8 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "base/message_loop/message_loop.h"
-#include "cc/layers/append_quads_data.h"
 #include "cc/output/gl_renderer.h"
 #include "cc/quads/draw_quad.h"
 #include "cc/quads/picture_draw_quad.h"
@@ -199,6 +198,7 @@
     RenderPass* render_pass,
     VideoResourceUpdater* video_resource_updater,
     const gfx::Rect& rect,
+    const gfx::Rect& visible_rect,
     ResourceProvider* resource_provider) {
   const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
   const YUVVideoDrawQuad::ColorSpace color_space =
@@ -248,9 +248,9 @@
 
   YUVVideoDrawQuad* yuv_quad =
       render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
-  yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
-                   video_frame->coded_size(), y_resource, u_resource,
-                   v_resource, a_resource, color_space);
+  yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect,
+                   tex_coord_rect, video_frame->coded_size(), y_resource,
+                   u_resource, v_resource, a_resource, color_space);
 }
 
 void CreateTestYUVVideoDrawQuad_Striped(
@@ -261,6 +261,7 @@
     RenderPass* render_pass,
     VideoResourceUpdater* video_resource_updater,
     const gfx::Rect& rect,
+    const gfx::Rect& visible_rect,
     ResourceProvider* resource_provider) {
   scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
       format, rect.size(), rect, rect.size(), base::TimeDelta());
@@ -292,7 +293,7 @@
   uint8 alpha_value = is_transparent ? 0 : 128;
   CreateTestYUVVideoDrawQuad_FromVideoFrame(
       shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
-      video_resource_updater, rect, resource_provider);
+      video_resource_updater, rect, visible_rect, resource_provider);
 }
 
 // Creates a video frame of size background_size filled with yuv_background,
@@ -305,6 +306,7 @@
     bool is_transparent,
     const gfx::RectF& tex_coord_rect,
     const gfx::Size& background_size,
+    const gfx::Rect& visible_rect,
     uint8 y_background,
     uint8 u_background,
     uint8 v_background,
@@ -356,7 +358,7 @@
   uint8 alpha_value = 255;
   CreateTestYUVVideoDrawQuad_FromVideoFrame(
       shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
-      video_resource_updater, rect, resource_provider);
+      video_resource_updater, rect, visible_rect, resource_provider);
 }
 
 void CreateTestYUVVideoDrawQuad_Solid(
@@ -370,6 +372,7 @@
     RenderPass* render_pass,
     VideoResourceUpdater* video_resource_updater,
     const gfx::Rect& rect,
+    const gfx::Rect& visible_rect,
     ResourceProvider* resource_provider) {
   scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
       format, rect.size(), rect, rect.size(), base::TimeDelta());
@@ -389,7 +392,7 @@
   uint8 alpha_value = is_transparent ? 0 : 128;
   CreateTestYUVVideoDrawQuad_FromVideoFrame(
       shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
-      video_resource_updater, rect, resource_provider);
+      video_resource_updater, rect, visible_rect, resource_provider);
 }
 
 typedef ::testing::Types<GLRenderer,
@@ -821,15 +824,17 @@
 
   CreateTestYUVVideoDrawQuad_TwoColor(
       this->front_quad_state_, media::VideoFrame::YV12J, false,
-      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128,
-      inner_rect, 29, 255, 107, this->render_pass_.get(),
-      this->video_resource_updater_.get(), this->resource_provider_.get());
+      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(),
+      this->quad_rect_, 0, 128, 128, inner_rect, 29, 255, 107,
+      this->render_pass_.get(), this->video_resource_updater_.get(),
+      this->resource_provider_.get());
 
   CreateTestYUVVideoDrawQuad_TwoColor(
       this->back_quad_state_, media::VideoFrame::YV12J, false,
-      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21,
-      inner_rect, 0, 128, 128, this->render_pass_.get(),
-      this->video_resource_updater2_.get(), this->resource_provider_.get());
+      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(),
+      this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128,
+      this->render_pass_.get(), this->video_resource_updater2_.get(),
+      this->resource_provider_.get());
 
   SCOPED_TRACE("IntersectingVideoQuads");
   this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>(
@@ -2077,7 +2082,7 @@
   scoped_ptr<FakePicturePile> recording =
       FakePicturePile::CreateFilledPile(pile_tile_size, viewport.size());
   SkPaint paint;
-  paint.setFilterLevel(SkPaint::kLow_FilterLevel);
+  paint.setFilterQuality(kLow_SkFilterQuality);
   recording->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
   recording->RerecordPile();
   scoped_refptr<FakePicturePileImpl> pile =
@@ -2129,7 +2134,7 @@
   scoped_ptr<FakePicturePile> recording =
       FakePicturePile::CreateFilledPile(pile_tile_size, viewport.size());
   SkPaint paint;
-  paint.setFilterLevel(SkPaint::kLow_FilterLevel);
+  paint.setFilterQuality(kLow_SkFilterQuality);
   recording->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
   recording->RerecordPile();
   scoped_refptr<FakePicturePileImpl> pile =
diff --git a/cc/output/renderer_pixeltest.cc.rej b/cc/output/renderer_pixeltest.cc.rej
new file mode 100644
index 0000000..13d6779
--- /dev/null
+++ b/cc/output/renderer_pixeltest.cc.rej
@@ -0,0 +1,245 @@
+diff a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc	(rejected hunks)
+@@ -902,243 +901,6 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
+       FuzzyPixelOffByOneComparator(true)));
+ }
+ 
+-class VideoGLRendererPixelTest : public GLRendererPixelTest {
+- protected:
+-  void CreateEdgeBleedPass(media::VideoFrame::Format format,
+-                           RenderPassList* pass_list) {
+-    gfx::Rect rect(200, 200);
+-
+-    RenderPassId id(1, 1);
+-    scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-    // Scale the video up so that bilinear filtering kicks in to sample more
+-    // than just nearest neighbor would.
+-    gfx::Transform scale_by_2;
+-    scale_by_2.Scale(2.f, 2.f);
+-    gfx::Rect half_rect(100, 100);
+-    SharedQuadState* shared_state =
+-        CreateTestSharedQuadState(scale_by_2, half_rect, pass.get());
+-
+-    gfx::Size background_size(200, 200);
+-    gfx::Rect green_rect(16, 20, 100, 100);
+-    gfx::RectF tex_coord_rect(
+-        static_cast<float>(green_rect.x()) / background_size.width(),
+-        static_cast<float>(green_rect.y()) / background_size.height(),
+-        static_cast<float>(green_rect.width()) / background_size.width(),
+-        static_cast<float>(green_rect.height()) / background_size.height());
+-
+-    // YUV of (149,43,21) should be green (0,255,0) in RGB.
+-    // Create a video frame that has a non-green background rect, with a
+-    // green sub-rectangle that should be the only thing displayed in
+-    // the final image.  Bleeding will appear on all four sides of the video
+-    // if the tex coords are not clamped.
+-    CreateTestYUVVideoDrawQuad_TwoColor(
+-        shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0,
+-        green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(),
+-        resource_provider_.get());
+-    pass_list->push_back(pass.Pass());
+-  }
+-
+-  void SetUp() override {
+-    GLRendererPixelTest::SetUp();
+-    video_resource_updater_.reset(new VideoResourceUpdater(
+-        output_surface_->context_provider(), resource_provider_.get()));
+-  }
+-
+-  scoped_ptr<VideoResourceUpdater> video_resource_updater_;
+-};
+-
+-TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
+-                                     false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-                                     pass.get(), video_resource_updater_.get(),
+-                                     rect, resource_provider_.get());
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(
+-      this->RunPixelTest(&pass_list,
+-                         base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
+-                         FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  // Intentionally sets frame format to I420 for testing coverage.
+-  CreateTestYUVVideoDrawQuad_Striped(
+-      shared_state, media::VideoFrame::I420, false,
+-      gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(),
+-      video_resource_updater_.get(), rect, resource_provider_.get());
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(this->RunPixelTest(
+-      &pass_list,
+-      base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
+-      FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  // In MPEG color range YUV values of (15,128,128) should produce black.
+-  CreateTestYUVVideoDrawQuad_Solid(
+-      shared_state, media::VideoFrame::YV12, false,
+-      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
+-      video_resource_updater_.get(), rect, resource_provider_.get());
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  // If we didn't get black out of the YUV values above, then we probably have a
+-  // color range issue.
+-  EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-                                 base::FilePath(FILE_PATH_LITERAL("black.png")),
+-                                 FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  // YUV of (149,43,21) should be green (0,255,0) in RGB.
+-  CreateTestYUVVideoDrawQuad_Solid(
+-      shared_state, media::VideoFrame::YV12J, false,
+-      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
+-      video_resource_updater_.get(), rect, resource_provider_.get());
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-                                 base::FilePath(FILE_PATH_LITERAL("green.png")),
+-                                 FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-// Test that a YUV video doesn't bleed outside of its tex coords when the
+-// tex coord rect is only a partial subrectangle of the coded contents.
+-TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) {
+-  RenderPassList pass_list;
+-  CreateEdgeBleedPass(media::VideoFrame::YV12J, &pass_list);
+-  EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-                                 base::FilePath(FILE_PATH_LITERAL("green.png")),
+-                                 FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, YUVAEdgeBleed) {
+-  RenderPassList pass_list;
+-  CreateEdgeBleedPass(media::VideoFrame::YV12A, &pass_list);
+-  EXPECT_TRUE(this->RunPixelTest(&pass_list,
+-                                 base::FilePath(FILE_PATH_LITERAL("green.png")),
+-                                 FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  // Dark grey in JPEG color range (in MPEG, this is black).
+-  CreateTestYUVVideoDrawQuad_Solid(
+-      shared_state, media::VideoFrame::YV12J, false,
+-      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
+-      video_resource_updater_.get(), rect, resource_provider_.get());
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(
+-      this->RunPixelTest(&pass_list,
+-                         base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
+-                         FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
+-                                     false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-                                     pass.get(), video_resource_updater_.get(),
+-                                     rect, resource_provider_.get());
+-
+-  SolidColorDrawQuad* color_quad =
+-      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+-  color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(this->RunPixelTest(
+-      &pass_list,
+-      base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
+-      FuzzyPixelOffByOneComparator(true)));
+-}
+-
+-TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
+-  gfx::Rect rect(this->device_viewport_size_);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+-
+-  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
+-                                     true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-                                     pass.get(), video_resource_updater_.get(),
+-                                     rect, resource_provider_.get());
+-
+-  SolidColorDrawQuad* color_quad =
+-      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+-  color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false);
+-
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(this->RunPixelTest(
+-      &pass_list,
+-      base::FilePath(FILE_PATH_LITERAL("black.png")),
+-      ExactPixelComparator(true)));
+-}
+-
+ TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
+   gfx::Rect viewport_rect(this->device_viewport_size_);
+ 
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 19c4fa3..cecd633 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -266,7 +266,7 @@
     if (settings_->allow_antialiasing &&
         (settings_->force_antialiasing || all_four_edges_are_exterior))
       current_paint_.setAntiAlias(true);
-    current_paint_.setFilterLevel(SkPaint::kLow_FilterLevel);
+    current_paint_.setFilterQuality(kLow_SkFilterQuality);
   }
 
   if (quad->ShouldDrawWithBlending() ||
@@ -487,9 +487,8 @@
       QuadVertexRect(), quad->rect, quad->visible_rect);
 
   SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect);
-  current_paint_.setFilterLevel(quad->nearest_neighbor
-                                    ? SkPaint::kNone_FilterLevel
-                                    : SkPaint::kLow_FilterLevel);
+  current_paint_.setFilterQuality(
+      quad->nearest_neighbor ? kNone_SkFilterQuality : kLow_SkFilterQuality);
   current_canvas_->drawBitmapRectToRect(
       *lock.sk_bitmap(),
       &uv_rect,
diff --git a/cc/base/swap_promise.h b/cc/output/swap_promise.h
similarity index 94%
rename from cc/base/swap_promise.h
rename to cc/output/swap_promise.h
index a406fda..1d6dabc 100644
--- a/cc/base/swap_promise.h
+++ b/cc/output/swap_promise.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CC_BASE_SWAP_PROMISE_H_
-#define CC_BASE_SWAP_PROMISE_H_
+#ifndef CC_OUTPUT_SWAP_PROMISE_H_
+#define CC_OUTPUT_SWAP_PROMISE_H_
 
 #include "cc/output/compositor_frame_metadata.h"
 
@@ -50,4 +50,4 @@
 
 }  // namespace cc
 
-#endif  // CC_BASE_SWAP_PROMISE_H_
+#endif  // CC_OUTPUT_SWAP_PROMISE_H_
diff --git a/cc/quads/yuv_video_draw_quad.h.rej b/cc/quads/yuv_video_draw_quad.h.rej
new file mode 100644
index 0000000..a838a4d
--- /dev/null
+++ b/cc/quads/yuv_video_draw_quad.h.rej
@@ -0,0 +1,9 @@
+diff a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h	(rejected hunks)
+@@ -8,7 +8,6 @@
+ #include "base/basictypes.h"
+ #include "base/memory/scoped_ptr.h"
+ #include "cc/base/cc_export.h"
+-#include "cc/layers/video_layer_impl.h"
+ #include "cc/quads/draw_quad.h"
+ 
+ namespace cc {
diff --git a/cc/resources/display_item_list.cc b/cc/resources/display_item_list.cc
index 48f8c66..f8ffbfd 100644
--- a/cc/resources/display_item_list.cc
+++ b/cc/resources/display_item_list.cc
@@ -138,8 +138,8 @@
 
 void DisplayItemList::EmitTraceSnapshot() const {
   TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
-      TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT(
-          "devtools.timeline.picture"),
+      TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") ","
+      TRACE_DISABLED_BY_DEFAULT("devtools.timeline.picture"),
       "cc::DisplayItemList", this, AsValue());
 }
 
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 00ae3da..7ea86f0 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -148,6 +148,10 @@
     // This will cause the image referred to by pixel ref to be decoded.
     pixel_ref_->lockPixels();
     pixel_ref_->unlockPixels();
+
+    // Release the reference after decoding image to ensure that it is not
+    // kept alive unless needed.
+    pixel_ref_.clear();
   }
 
   // Overridden from TileTask:
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 70d726d..3b20b79 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -380,8 +380,7 @@
   TRACE_EVENT1("cc,benchmark", "Scheduler::BeginFrame", "args", args.AsValue());
 
   // Deliver BeginFrames to children.
-  if (settings_.forward_begin_frames_to_children &&
-      state_machine_.children_need_begin_frames()) {
+  if (state_machine_.children_need_begin_frames()) {
     BeginFrameArgs adjusted_args_for_children(args);
     // Adjust a deadline for child schedulers.
     // TODO(simonhong): Once we have commitless update, we can get rid of
@@ -431,7 +430,6 @@
 }
 
 void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) {
-  DCHECK(settings_.forward_begin_frames_to_children);
   state_machine_.SetChildrenNeedBeginFrames(children_need_begin_frames);
   ProcessScheduledActions();
 }
diff --git a/cc/scheduler/scheduler_settings.cc b/cc/scheduler/scheduler_settings.cc
index 8713391..39a98b4 100644
--- a/cc/scheduler/scheduler_settings.cc
+++ b/cc/scheduler/scheduler_settings.cc
@@ -11,22 +11,18 @@
 
 SchedulerSettings::SchedulerSettings()
     : use_external_begin_frame_source(false),
-      forward_begin_frames_to_children(false),
       main_frame_before_activation_enabled(false),
       impl_side_painting(false),
       timeout_and_draw_when_animation_checkerboards(true),
       maximum_number_of_failed_draws_before_draw_is_forced_(3),
       using_synchronous_renderer_compositor(false),
       throttle_frame_production(true),
-      disable_hi_res_timer_tasks_on_battery(false),
       main_thread_should_always_be_low_latency(false),
       background_frame_interval(base::TimeDelta::FromSeconds(1)) {
 }
 
 SchedulerSettings::SchedulerSettings(const LayerTreeSettings& settings)
     : use_external_begin_frame_source(settings.use_external_begin_frame_source),
-      forward_begin_frames_to_children(
-          settings.forward_begin_frames_to_children),
       main_frame_before_activation_enabled(
           settings.main_frame_before_activation_enabled),
       impl_side_painting(settings.impl_side_painting),
@@ -37,8 +33,6 @@
       using_synchronous_renderer_compositor(
           settings.using_synchronous_renderer_compositor),
       throttle_frame_production(settings.throttle_frame_production),
-      disable_hi_res_timer_tasks_on_battery(
-          settings.disable_hi_res_timer_tasks_on_battery),
       main_thread_should_always_be_low_latency(false),
       background_frame_interval(base::TimeDelta::FromSecondsD(
           1.0 / settings.background_animation_rate)) {
@@ -52,8 +46,6 @@
       new base::trace_event::TracedValue();
   state->SetBoolean("use_external_begin_frame_source",
                     use_external_begin_frame_source);
-  state->SetBoolean("forward_begin_frames_to_children",
-                    forward_begin_frames_to_children);
   state->SetBoolean("main_frame_before_activation_enabled",
                     main_frame_before_activation_enabled);
   state->SetBoolean("impl_side_painting", impl_side_painting);
@@ -64,8 +56,6 @@
   state->SetBoolean("using_synchronous_renderer_compositor",
                     using_synchronous_renderer_compositor);
   state->SetBoolean("throttle_frame_production", throttle_frame_production);
-  state->SetBoolean("disable_hi_res_timer_tasks_on_battery",
-                    disable_hi_res_timer_tasks_on_battery);
   state->SetBoolean("main_thread_should_always_be_low_latency",
                     main_thread_should_always_be_low_latency);
   state->SetInteger("background_frame_interval",
diff --git a/cc/scheduler/scheduler_settings.h b/cc/scheduler/scheduler_settings.h
index fe90f43..85f64e1 100644
--- a/cc/scheduler/scheduler_settings.h
+++ b/cc/scheduler/scheduler_settings.h
@@ -26,14 +26,12 @@
   ~SchedulerSettings();
 
   bool use_external_begin_frame_source;
-  bool forward_begin_frames_to_children;
   bool main_frame_before_activation_enabled;
   bool impl_side_painting;
   bool timeout_and_draw_when_animation_checkerboards;
   int maximum_number_of_failed_draws_before_draw_is_forced_;
   bool using_synchronous_renderer_compositor;
   bool throttle_frame_production;
-  bool disable_hi_res_timer_tasks_on_battery;
 
   // In main thread low latency mode the entire
   // BeginMainFrame->Commit->Activation->Draw cycle should complete before
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index f2f6636..189387c 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -768,7 +768,6 @@
 
 void SchedulerStateMachine::SetChildrenNeedBeginFrames(
     bool children_need_begin_frames) {
-  DCHECK(settings_.forward_begin_frames_to_children);
   children_need_begin_frames_ = children_need_begin_frames;
 }
 
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
index ca0e441..98d5b18 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -1804,7 +1804,6 @@
 
 TEST(SchedulerStateMachineTest, TestForwardBeginFramesToChildren) {
   SchedulerSettings settings;
-  settings.forward_begin_frames_to_children = true;
   StateMachine state(settings);
   SET_UP_STATE(state)
 
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 9346536..55f2164 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -407,7 +407,6 @@
 
 TEST_F(SchedulerTest, SendBeginFramesToChildren) {
   scheduler_settings_.use_external_begin_frame_source = true;
-  scheduler_settings_.forward_begin_frames_to_children = true;
   SetUpScheduler(true);
 
   EXPECT_FALSE(client_->begin_frame_is_sent_to_children());
@@ -428,7 +427,6 @@
 
 TEST_F(SchedulerTest, SendBeginFramesToChildrenWithoutCommit) {
   scheduler_settings_.use_external_begin_frame_source = true;
-  scheduler_settings_.forward_begin_frames_to_children = true;
   SetUpScheduler(true);
 
   EXPECT_FALSE(client_->needs_begin_frames());
@@ -503,10 +501,6 @@
   scheduler_settings_.use_external_begin_frame_source = true;
   SetUpScheduler(true);
 
-  scheduler_->SetCanStart();
-  scheduler_->SetVisible(true);
-  scheduler_->SetCanDraw(true);
-
   scheduler_->SetDeferCommits(true);
 
   scheduler_->SetNeedsCommit();
@@ -539,10 +533,6 @@
   scheduler_settings_.use_external_begin_frame_source = true;
   SetUpScheduler(true);
 
-  scheduler_->SetCanStart();
-  scheduler_->SetVisible(true);
-  scheduler_->SetCanDraw(true);
-
   scheduler_->SetDeferCommits(true);
 
   scheduler_->SetNeedsCommit();
diff --git a/cc/surfaces/display.h b/cc/surfaces/display.h
index ed96d07..30db259 100644
--- a/cc/surfaces/display.h
+++ b/cc/surfaces/display.h
@@ -15,6 +15,11 @@
 #include "cc/surfaces/surface_id.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/surfaces/surfaces_export.h"
+#include "ui/events/latency_info.h"
+
+namespace gpu {
+class GpuMemoryBufferManager;
+}
 
 namespace gfx {
 class Size;
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index 4f00ff3..21ec6db 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -228,6 +228,8 @@
 
   bool merge_pass = surface_quad->opacity() == 1.f && copy_requests.empty();
 
+  gfx::Rect surface_damage = DamageRectForSurface(
+      surface, *render_pass_list.back(), surface_quad->visible_rect);
   const RenderPassList& referenced_passes = render_pass_list;
   size_t passes_to_copy =
       merge_pass ? referenced_passes.size() - 1 : referenced_passes.size();
@@ -240,9 +242,7 @@
 
     RenderPassId remapped_pass_id = RemapPassId(source.id, surface_id);
 
-    copy_pass->SetAll(remapped_pass_id,
-                      source.output_rect,
-                      source.damage_rect,
+    copy_pass->SetAll(remapped_pass_id, source.output_rect, gfx::Rect(),
                       source.transform_to_root_target,
                       source.has_transparent_background);
 
@@ -261,6 +261,9 @@
     CopyQuadsToPass(source.quad_list, source.shared_quad_state_list,
                     gfx::Transform(), ClipData(), copy_pass.get(), surface_id);
 
+    if (j == referenced_passes.size() - 1)
+      surface_damage = gfx::UnionRects(surface_damage, copy_pass->damage_rect);
+
     dest_pass_list_->push_back(copy_pass.Pass());
   }
 
@@ -309,9 +312,7 @@
   dest_pass->damage_rect =
       gfx::UnionRects(dest_pass->damage_rect,
                       MathUtil::MapEnclosingClippedRect(
-                          surface_quad->quadTransform(),
-                          DamageRectForSurface(surface, last_pass,
-                                               surface_quad->visible_rect)));
+                          surface_quad->quadTransform(), surface_damage));
 
   referenced_surfaces_.erase(it);
 }
@@ -375,10 +376,20 @@
         RenderPassId remapped_pass_id =
             RemapPassId(original_pass_id, surface_id);
 
-        dest_pass->CopyFromAndAppendRenderPassDrawQuad(
-            pass_quad,
-            dest_pass->shared_quad_state_list.back(),
+        gfx::Rect pass_damage;
+        for (const auto* pass : *dest_pass_list_) {
+          if (pass->id == remapped_pass_id) {
+            pass_damage = pass->damage_rect;
+            break;
+          }
+        }
+
+        DrawQuad* rpdq = dest_pass->CopyFromAndAppendRenderPassDrawQuad(
+            pass_quad, dest_pass->shared_quad_state_list.back(),
             remapped_pass_id);
+        dest_pass->damage_rect = gfx::UnionRects(
+            dest_pass->damage_rect, MathUtil::MapEnclosingClippedRect(
+                                        rpdq->quadTransform(), pass_damage));
       } else {
         dest_pass->CopyFromAndAppendDrawQuad(
             quad, dest_pass->shared_quad_state_list.back());
@@ -411,8 +422,11 @@
     RenderPassId remapped_pass_id =
         RemapPassId(source.id, surface->surface_id());
 
-    copy_pass->SetAll(remapped_pass_id, source.output_rect,
-                      DamageRectForSurface(surface, source, source.output_rect),
+    gfx::Rect damage_rect =
+        (i < source_pass_list.size() - 1)
+            ? gfx::Rect()
+            : DamageRectForSurface(surface, source, source.output_rect);
+    copy_pass->SetAll(remapped_pass_id, source.output_rect, damage_rect,
                       source.transform_to_root_target,
                       source.has_transparent_background);
 
diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc
index cf54568..72aa3f1 100644
--- a/cc/surfaces/surface_aggregator_unittest.cc
+++ b/cc/surfaces/surface_aggregator_unittest.cc
@@ -1083,8 +1083,13 @@
   factory_.SubmitFrame(child_surface_id, child_frame.Pass(),
                        SurfaceFactory::DrawCallback());
 
-  test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)};
-  test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))};
+  RenderPassId pass_id(5, 10);
+  test::Quad first_quads[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)};
+  test::Quad root_quads[] = {test::Quad::RenderPassQuad(pass_id)};
+
+  test::Pass root_passes[] = {
+      test::Pass(first_quads, arraysize(first_quads), pass_id),
+      test::Pass(root_quads, arraysize(root_quads))};
 
   RenderPassList root_pass_list;
   AddPasses(&root_pass_list,
@@ -1096,6 +1101,7 @@
       ->shared_quad_state_list.front()
       ->content_to_target_transform.Translate(0, 10);
   root_pass_list.at(0)->damage_rect = gfx::Rect(5, 5, 10, 10);
+  root_pass_list.at(1)->damage_rect = gfx::Rect(5, 5, 100, 100);
 
   scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData);
   root_pass_list.swap(root_frame_data->render_pass_list);
@@ -1116,11 +1122,11 @@
 
   const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
 
-  ASSERT_EQ(1u, aggregated_pass_list.size());
+  ASSERT_EQ(2u, aggregated_pass_list.size());
 
   // Damage rect for first aggregation should contain entire root surface.
   EXPECT_TRUE(
-      aggregated_pass_list[0]->damage_rect.Contains(gfx::Rect(SurfaceSize())));
+      aggregated_pass_list[1]->damage_rect.Contains(gfx::Rect(SurfaceSize())));
 
   {
     AddPasses(&child_pass_list,
@@ -1154,12 +1160,12 @@
 
     const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
 
-    ASSERT_EQ(1u, aggregated_pass_list.size());
+    ASSERT_EQ(2u, aggregated_pass_list.size());
 
     // Outer surface didn't change, so transformed inner damage rect should be
     // used.
     EXPECT_EQ(gfx::Rect(10, 20, 10, 10).ToString(),
-              aggregated_pass_list[0]->damage_rect.ToString());
+              aggregated_pass_list[1]->damage_rect.ToString());
   }
 
   {
@@ -1216,11 +1222,11 @@
 
     const RenderPassList& aggregated_pass_list = frame_data->render_pass_list;
 
-    ASSERT_EQ(1u, aggregated_pass_list.size());
+    ASSERT_EQ(2u, aggregated_pass_list.size());
 
     // The root surface was enqueued without being aggregated once, so it should
     // be treated as completely damaged.
-    EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.Contains(
+    EXPECT_TRUE(aggregated_pass_list[1]->damage_rect.Contains(
         gfx::Rect(SurfaceSize())));
   }
 
diff --git a/cc/surfaces/surface_display_output_surface.cc b/cc/surfaces/surface_display_output_surface.cc
index ac60271..c07eece 100644
--- a/cc/surfaces/surface_display_output_surface.cc
+++ b/cc/surfaces/surface_display_output_surface.cc
@@ -4,6 +4,7 @@
 
 #include "cc/surfaces/surface_display_output_surface.h"
 
+#include "base/bind.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/compositor_frame_ack.h"
 #include "cc/surfaces/display.h"
diff --git a/cc/test/data/image_mask_of_layer.png b/cc/test/data/image_mask_of_layer.png
index 8f186ad..f64c085 100644
--- a/cc/test/data/image_mask_of_layer.png
+++ b/cc/test/data/image_mask_of_layer.png
Binary files differ
diff --git a/cc/test/data/mask_of_background_filter.png b/cc/test/data/mask_of_background_filter.png
index 35a9b93..cd1eab6 100644
--- a/cc/test/data/mask_of_background_filter.png
+++ b/cc/test/data/mask_of_background_filter.png
Binary files differ
diff --git a/cc/test/data/mask_of_clipped_layer.png b/cc/test/data/mask_of_clipped_layer.png
index 9f4483e..c2c40da 100644
--- a/cc/test/data/mask_of_clipped_layer.png
+++ b/cc/test/data/mask_of_clipped_layer.png
Binary files differ
diff --git a/cc/test/data/mask_of_layer.png b/cc/test/data/mask_of_layer.png
index 8f186ad..f64c085 100644
--- a/cc/test/data/mask_of_layer.png
+++ b/cc/test/data/mask_of_layer.png
Binary files differ
diff --git a/cc/test/data/mask_of_layer_with_blend.png b/cc/test/data/mask_of_layer_with_blend.png
index 1f2bedd..a737361 100644
--- a/cc/test/data/mask_of_layer_with_blend.png
+++ b/cc/test/data/mask_of_layer_with_blend.png
Binary files differ
diff --git a/cc/test/data/mask_of_replica.png b/cc/test/data/mask_of_replica.png
index ee581a1..94e261d 100644
--- a/cc/test/data/mask_of_replica.png
+++ b/cc/test/data/mask_of_replica.png
Binary files differ
diff --git a/cc/test/data/mask_of_replica_of_clipped_layer.png b/cc/test/data/mask_of_replica_of_clipped_layer.png
index 1a3a828..598da07 100644
--- a/cc/test/data/mask_of_replica_of_clipped_layer.png
+++ b/cc/test/data/mask_of_replica_of_clipped_layer.png
Binary files differ
diff --git a/cc/test/data/mask_with_replica.png b/cc/test/data/mask_with_replica.png
index aa765c3..a330b08 100644
--- a/cc/test/data/mask_with_replica.png
+++ b/cc/test/data/mask_with_replica.png
Binary files differ
diff --git a/cc/test/data/mask_with_replica_of_clipped_layer.png b/cc/test/data/mask_with_replica_of_clipped_layer.png
index 922ad73..2b786a7 100644
--- a/cc/test/data/mask_with_replica_of_clipped_layer.png
+++ b/cc/test/data/mask_with_replica_of_clipped_layer.png
Binary files differ
diff --git a/cc/test/data/yuv_stripes_clipped.png b/cc/test/data/yuv_stripes_clipped.png
new file mode 100644
index 0000000..58b69ef
--- /dev/null
+++ b/cc/test/data/yuv_stripes_clipped.png
Binary files differ
diff --git a/cc/test/fake_ui_resource_layer_tree_host_impl.cc b/cc/test/fake_ui_resource_layer_tree_host_impl.cc
index c95ad89..9e7adde 100644
--- a/cc/test/fake_ui_resource_layer_tree_host_impl.cc
+++ b/cc/test/fake_ui_resource_layer_tree_host_impl.cc
@@ -4,6 +4,7 @@
 
 #include "cc/test/fake_ui_resource_layer_tree_host_impl.h"
 
+#include "cc/resources/ui_resource_bitmap.h"
 #include "cc/test/fake_layer_tree_host_impl.h"
 
 namespace cc {
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
index 3562699..08bad36 100644
--- a/cc/test/pixel_test.h
+++ b/cc/test/pixel_test.h
@@ -7,6 +7,7 @@
 #include "cc/output/software_renderer.h"
 #include "cc/quads/render_pass.h"
 #include "cc/test/pixel_comparator.h"
+#include "cc/trees/layer_tree_settings.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_implementation.h"
diff --git a/cc/base/latency_info_swap_promise_monitor.cc b/cc/trees/latency_info_swap_promise_monitor.cc
similarity index 87%
rename from cc/base/latency_info_swap_promise_monitor.cc
rename to cc/trees/latency_info_swap_promise_monitor.cc
index de065d1..10d9380 100644
--- a/cc/base/latency_info_swap_promise_monitor.cc
+++ b/cc/trees/latency_info_swap_promise_monitor.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cc/base/latency_info_swap_promise_monitor.h"
+#include "cc/trees/latency_info_swap_promise_monitor.h"
 
 #include "base/threading/platform_thread.h"
-#include "cc/base/latency_info_swap_promise.h"
+#include "cc/output/latency_info_swap_promise.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_host_impl.h"
 #include "cc/trees/layer_tree_impl.h"
@@ -14,9 +14,9 @@
 
 bool AddRenderingScheduledComponent(ui::LatencyInfo* latency_info,
                                     bool on_main) {
-  ui::LatencyComponentType type = on_main ?
-      ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN_COMPONENT :
-      ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT;
+  ui::LatencyComponentType type =
+      on_main ? ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN_COMPONENT
+              : ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT;
   if (latency_info->FindLatency(type, 0, nullptr))
     return false;
   latency_info->AddLatencyNumber(type, 0, 0);
@@ -25,13 +25,11 @@
 
 bool AddForwardingScrollUpdateToMainComponent(ui::LatencyInfo* latency_info) {
   if (latency_info->FindLatency(
-          ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT,
-          0,
+          ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT, 0,
           nullptr))
     return false;
   latency_info->AddLatencyNumber(
-      ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT,
-      0,
+      ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT, 0,
       latency_info->trace_id);
   return true;
 }
@@ -45,9 +43,11 @@
     LayerTreeHost* layer_tree_host,
     LayerTreeHostImpl* layer_tree_host_impl)
     : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl),
-      latency_(latency) {}
+      latency_(latency) {
+}
 
-LatencyInfoSwapPromiseMonitor::~LatencyInfoSwapPromiseMonitor() {}
+LatencyInfoSwapPromiseMonitor::~LatencyInfoSwapPromiseMonitor() {
+}
 
 void LatencyInfoSwapPromiseMonitor::OnSetNeedsCommitOnMain() {
   if (AddRenderingScheduledComponent(latency_, true /* on_main */)) {
@@ -68,8 +68,7 @@
     int64 new_sequence_number = 0;
     for (ui::LatencyInfo::LatencyMap::const_iterator it =
              latency_->latency_components.begin();
-         it != latency_->latency_components.end();
-         ++it) {
+         it != latency_->latency_components.end(); ++it) {
       if (it->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT) {
         new_sequence_number =
             (static_cast<int64>(base::PlatformThread::CurrentId()) << 32) |
@@ -82,8 +81,7 @@
       return;
     ui::LatencyInfo new_latency;
     new_latency.AddLatencyNumber(
-        ui::INPUT_EVENT_LATENCY_BEGIN_SCROLL_UPDATE_MAIN_COMPONENT,
-        0,
+        ui::INPUT_EVENT_LATENCY_BEGIN_SCROLL_UPDATE_MAIN_COMPONENT, 0,
         new_sequence_number);
     new_latency.TraceEventType("ScrollUpdate");
     new_latency.CopyLatencyFrom(
diff --git a/cc/base/latency_info_swap_promise_monitor.h b/cc/trees/latency_info_swap_promise_monitor.h
similarity index 82%
rename from cc/base/latency_info_swap_promise_monitor.h
rename to cc/trees/latency_info_swap_promise_monitor.h
index d9e71fb..c1d9973 100644
--- a/cc/base/latency_info_swap_promise_monitor.h
+++ b/cc/trees/latency_info_swap_promise_monitor.h
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 #include "base/compiler_specific.h"
-#include "cc/base/swap_promise_monitor.h"
+#include "cc/trees/swap_promise_monitor.h"
 
-#ifndef CC_BASE_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
-#define CC_BASE_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
+#ifndef CC_TREES_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
+#define CC_TREES_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
 
 namespace ui {
 struct LatencyInfo;
@@ -34,4 +34,4 @@
 
 }  // namespace cc
 
-#endif  // CC_BASE_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
+#endif  // CC_TREES_LATENCY_INFO_SWAP_PROMISE_MONITOR_H_
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 2ac7ebe..8a3e644 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -51,23 +51,6 @@
 
 namespace cc {
 
-RendererCapabilities::RendererCapabilities(ResourceFormat best_texture_format,
-                                           bool allow_partial_texture_updates,
-                                           int max_texture_size,
-                                           bool using_shared_memory_resources)
-    : best_texture_format(best_texture_format),
-      allow_partial_texture_updates(allow_partial_texture_updates),
-      max_texture_size(max_texture_size),
-      using_shared_memory_resources(using_shared_memory_resources) {}
-
-RendererCapabilities::RendererCapabilities()
-    : best_texture_format(RGBA_8888),
-      allow_partial_texture_updates(false),
-      max_texture_size(0),
-      using_shared_memory_resources(false) {}
-
-RendererCapabilities::~RendererCapabilities() {}
-
 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded(
     LayerTreeHostClient* client,
     SharedBitmapManager* shared_bitmap_manager,
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 840a4fa..1379d08 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -21,8 +21,6 @@
 #include "cc/animation/animation_events.h"
 #include "cc/base/cc_export.h"
 #include "cc/base/scoped_ptr_vector.h"
-#include "cc/base/swap_promise.h"
-#include "cc/base/swap_promise_monitor.h"
 #include "cc/debug/micro_benchmark.h"
 #include "cc/debug/micro_benchmark_controller.h"
 #include "cc/input/input_handler.h"
@@ -31,6 +29,8 @@
 #include "cc/input/top_controls_state.h"
 #include "cc/layers/layer_lists.h"
 #include "cc/output/output_surface.h"
+#include "cc/output/renderer_capabilities.h"
+#include "cc/output/swap_promise.h"
 #include "cc/resources/resource_format.h"
 #include "cc/resources/scoped_ui_resource.h"
 #include "cc/surfaces/surface_sequence.h"
@@ -38,6 +38,7 @@
 #include "cc/trees/layer_tree_host_common.h"
 #include "cc/trees/layer_tree_settings.h"
 #include "cc/trees/proxy.h"
+#include "cc/trees/swap_promise_monitor.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -67,24 +68,6 @@
 struct ScrollAndScaleSet;
 enum class GpuRasterizationStatus;
 
-// Provides information on an Impl's rendering capabilities back to the
-// LayerTreeHost.
-struct CC_EXPORT RendererCapabilities {
-  RendererCapabilities(ResourceFormat best_texture_format,
-                       bool allow_partial_texture_updates,
-                       int max_texture_size,
-                       bool using_shared_memory_resources);
-
-  RendererCapabilities();
-  ~RendererCapabilities();
-
-  // Duplicate any modification to this list to RendererCapabilitiesImpl.
-  ResourceFormat best_texture_format;
-  bool allow_partial_texture_updates;
-  int max_texture_size;
-  bool using_shared_memory_resources;
-};
-
 class CC_EXPORT LayerTreeHost {
  public:
   // The SharedBitmapManager will be used on the compositor thread.
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 064e91e..aa115f7 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -681,9 +681,10 @@
 // This function returns a translation matrix that can be applied on a vector
 // that's in the layer's target surface coordinate, while the position offset is
 // specified in some ancestor layer's coordinate.
+template <typename LayerType>
 gfx::Transform ComputeSizeDeltaCompensation(
-    LayerImpl* layer,
-    LayerImpl* container,
+    LayerType* layer,
+    LayerType* container,
     const gfx::Vector2dF& position_offset) {
   gfx::Transform result_transform;
 
@@ -698,8 +699,8 @@
 
   gfx::Transform target_surface_space_to_container_layer_space;
   // Calculate step 1a
-  LayerImpl* container_target_surface = container->render_target();
-  for (LayerImpl* current_target_surface = NextTargetSurface(layer);
+  LayerType* container_target_surface = container->render_target();
+  for (LayerType* current_target_surface = NextTargetSurface(layer);
       current_target_surface &&
           current_target_surface != container_target_surface;
       current_target_surface = NextTargetSurface(current_target_surface)) {
@@ -746,14 +747,10 @@
   return result_transform;
 }
 
+template <typename LayerType>
 void ApplyPositionAdjustment(
-    Layer* layer,
-    Layer* container,
-    const gfx::Transform& scroll_compensation,
-    gfx::Transform* combined_transform) {}
-void ApplyPositionAdjustment(
-    LayerImpl* layer,
-    LayerImpl* container,
+    LayerType* layer,
+    LayerType* container,
     const gfx::Transform& scroll_compensation,
     gfx::Transform* combined_transform) {
   if (!layer->position_constraint().is_fixed_position())
@@ -784,8 +781,9 @@
       ComputeSizeDeltaCompensation(layer, container, position_offset));
 }
 
+template <typename LayerType>
 gfx::Transform ComputeScrollCompensationForThisLayer(
-    LayerImpl* scrolling_layer,
+    LayerType* scrolling_layer,
     const gfx::Transform& parent_matrix,
     const gfx::Vector2dF& scroll_delta) {
   // For every layer that has non-zero scroll_delta, we have to compute a
@@ -823,18 +821,9 @@
   return scroll_compensation_for_this_layer;
 }
 
+template <typename LayerType>
 gfx::Transform ComputeScrollCompensationMatrixForChildren(
-    Layer* current_layer,
-    const gfx::Transform& current_parent_matrix,
-    const gfx::Transform& current_scroll_compensation,
-    const gfx::Vector2dF& scroll_delta) {
-  // The main thread (i.e. Layer) does not need to worry about scroll
-  // compensation.  So we can just return an identity matrix here.
-  return gfx::Transform();
-}
-
-gfx::Transform ComputeScrollCompensationMatrixForChildren(
-    LayerImpl* layer,
+    LayerType* layer,
     const gfx::Transform& parent_matrix,
     const gfx::Transform& current_scroll_compensation_matrix,
     const gfx::Vector2dF& scroll_delta) {
diff --git a/cc/trees/layer_tree_host_common.h b/cc/trees/layer_tree_host_common.h
index 6c03511..88197da 100644
--- a/cc/trees/layer_tree_host_common.h
+++ b/cc/trees/layer_tree_host_common.h
@@ -172,12 +172,14 @@
   // A layer will either contribute its own content, or its render surface's
   // content, to the target surface. The layer contributes its surface's content
   // when both the following are true:
-  //  (1) The layer actually has a render surface, and
+  //  (1) The layer actually has a render surface and rendering into that
+  //      surface, and
   //  (2) The layer's render surface is not the same as the target surface.
   //
   // Otherwise, the layer just contributes itself to the target surface.
 
-  return layer->render_surface() && layer->id() != target_surface_layer_id;
+  return layer->render_target() == layer &&
+         layer->id() != target_surface_layer_id;
 }
 
 template <typename LayerType>
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index d2c473e..dd797d5 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -1006,6 +1006,8 @@
   scoped_refptr<Layer> child = Layer::Create();
   scoped_refptr<LayerWithForcedDrawsContent> grand_child =
       make_scoped_refptr(new LayerWithForcedDrawsContent());
+  scoped_refptr<LayerWithForcedDrawsContent> great_grand_child =
+      make_scoped_refptr(new LayerWithForcedDrawsContent());
 
   gfx::Transform rotation_about_y_axis;
   rotation_about_y_axis.RotateAboutYAxis(30.0);
@@ -1032,9 +1034,13 @@
                                gfx::Size(10, 10),
                                true,
                                false);
+  SetLayerPropertiesForTesting(great_grand_child.get(), identity_matrix,
+                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
+                               true, false);
 
   root->AddChild(child);
   child->AddChild(grand_child);
+  grand_child->AddChild(great_grand_child);
   child->SetForceRenderSurface(true);
 
   scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
@@ -1044,6 +1050,7 @@
   ASSERT_TRUE(root->should_flatten_transform());
   ASSERT_TRUE(child->should_flatten_transform());
   ASSERT_TRUE(grand_child->should_flatten_transform());
+  ASSERT_TRUE(great_grand_child->should_flatten_transform());
 
   gfx::Transform expected_child_draw_transform = rotation_about_y_axis;
   gfx::Transform expected_child_screen_space_transform = rotation_about_y_axis;
@@ -1053,6 +1060,10 @@
   flattened_rotation_about_y.FlattenTo2d();
   gfx::Transform expected_grand_child_screen_space_transform =
       flattened_rotation_about_y * rotation_about_y_axis;
+  gfx::Transform expected_great_grand_child_draw_transform =
+      flattened_rotation_about_y;
+  gfx::Transform expected_great_grand_child_screen_space_transform =
+      flattened_rotation_about_y * flattened_rotation_about_y;
 
   ExecuteCalculateDrawProperties(root.get());
 
@@ -1070,6 +1081,11 @@
                                   grand_child->draw_transform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_screen_space_transform,
                                   grand_child->screen_space_transform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_draw_transform,
+                                  great_grand_child->draw_transform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(
+      expected_great_grand_child_screen_space_transform,
+      great_grand_child->screen_space_transform());
 }
 
 TEST_F(LayerTreeHostCommonTest, TransformsForDegenerateIntermediateLayer) {
@@ -7015,6 +7031,27 @@
     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
 
     EXPECT_EQ(2u, render_surface_layer_list.size());
+
+    int count_represents_target_render_surface = 0;
+    int count_represents_contributing_render_surface = 0;
+    int count_represents_itself = 0;
+    auto end = LayerIterator<LayerImpl>::End(&render_surface_layer_list);
+    for (auto it = LayerIterator<LayerImpl>::Begin(&render_surface_layer_list);
+         it != end; ++it) {
+      if (it.represents_target_render_surface())
+        count_represents_target_render_surface++;
+      if (it.represents_contributing_render_surface())
+        count_represents_contributing_render_surface++;
+      if (it.represents_itself())
+        count_represents_itself++;
+    }
+
+    // Two render surfaces.
+    EXPECT_EQ(2, count_represents_target_render_surface);
+    // Second render surface contributes to root render surface.
+    EXPECT_EQ(1, count_represents_contributing_render_surface);
+    // All 4 layers represent itself.
+    EXPECT_EQ(4, count_represents_itself);
   }
 
   {
@@ -7025,6 +7062,27 @@
     LayerTreeHostCommon::CalculateDrawProperties(&inputs);
 
     EXPECT_EQ(1u, render_surface_layer_list.size());
+
+    int count_represents_target_render_surface = 0;
+    int count_represents_contributing_render_surface = 0;
+    int count_represents_itself = 0;
+    auto end = LayerIterator<LayerImpl>::End(&render_surface_layer_list);
+    for (auto it = LayerIterator<LayerImpl>::Begin(&render_surface_layer_list);
+         it != end; ++it) {
+      if (it.represents_target_render_surface())
+        count_represents_target_render_surface++;
+      if (it.represents_contributing_render_surface())
+        count_represents_contributing_render_surface++;
+      if (it.represents_itself())
+        count_represents_itself++;
+    }
+
+    // Only root layer has a render surface.
+    EXPECT_EQ(1, count_represents_target_render_surface);
+    // No layer contributes a render surface to root render surface.
+    EXPECT_EQ(0, count_represents_contributing_render_surface);
+    // All 4 layers represent itself.
+    EXPECT_EQ(4, count_represents_itself);
   }
 }
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index f81a3b1..a8d4294 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -18,7 +18,6 @@
 #include "cc/animation/scroll_offset_animation_curve.h"
 #include "cc/animation/scrollbar_animation_controller.h"
 #include "cc/animation/timing_function.h"
-#include "cc/base/latency_info_swap_promise_monitor.h"
 #include "cc/base/math_util.h"
 #include "cc/base/util.h"
 #include "cc/debug/benchmark_instrumentation.h"
@@ -65,15 +64,17 @@
 #include "cc/resources/zero_copy_tile_task_worker_pool.h"
 #include "cc/scheduler/delay_based_time_source.h"
 #include "cc/trees/damage_tracker.h"
+#include "cc/trees/latency_info_swap_promise_monitor.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_host_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/single_thread_proxy.h"
 #include "cc/trees/tree_synchronizer.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/gles2_interface.h"
 #include "ui/gfx/frame_time.h"
 #include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/scroll_offset.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/gfx/geometry/vector2d_conversions.h"
 
@@ -2435,26 +2436,9 @@
     const gfx::Point& viewport_point,
     const gfx::Vector2dF& scroll_delta) {
   if (LayerImpl* layer_impl = CurrentlyScrollingLayer()) {
-    Animation* animation =
-        layer_impl->layer_animation_controller()->GetAnimation(
-            Animation::SCROLL_OFFSET);
-    if (!animation)
-      return SCROLL_IGNORED;
-
-    ScrollOffsetAnimationCurve* curve =
-        animation->curve()->ToScrollOffsetAnimationCurve();
-
-    gfx::ScrollOffset new_target =
-        gfx::ScrollOffsetWithDelta(curve->target_value(), scroll_delta);
-    new_target.SetToMax(gfx::ScrollOffset());
-    new_target.SetToMin(layer_impl->MaxScrollOffset());
-
-    curve->UpdateTarget(
-        animation->TrimTimeToCurrentIteration(
-                       CurrentBeginFrameArgs().frame_time).InSecondsF(),
-        new_target);
-
-    return SCROLL_STARTED;
+    return ScrollAnimationUpdateTarget(layer_impl, scroll_delta)
+               ? SCROLL_STARTED
+               : SCROLL_IGNORED;
   }
   // ScrollAnimated is only used for wheel scrolls. We use the same bubbling
   // behavior as ScrollBy to determine which layer to animate, but we do not
@@ -2486,17 +2470,7 @@
 
       active_tree_->SetCurrentlyScrollingLayer(layer_impl);
 
-      scoped_ptr<ScrollOffsetAnimationCurve> curve =
-          ScrollOffsetAnimationCurve::Create(target_offset,
-                                             EaseInOutTimingFunction::Create());
-      curve->SetInitialValue(current_offset);
-
-      scoped_ptr<Animation> animation = Animation::Create(
-          curve.Pass(), AnimationIdProvider::NextAnimationId(),
-          AnimationIdProvider::NextGroupId(), Animation::SCROLL_OFFSET);
-      animation->set_is_impl_only(true);
-
-      layer_impl->layer_animation_controller()->AddAnimation(animation.Pass());
+      ScrollAnimationCreate(layer_impl, target_offset, current_offset);
 
       SetNeedsAnimate();
       return SCROLL_STARTED;
@@ -3459,4 +3433,47 @@
     (*it)->OnForwardScrollUpdateToMainThreadOnImpl();
 }
 
+void LayerTreeHostImpl::ScrollAnimationCreate(
+    LayerImpl* layer_impl,
+    const gfx::ScrollOffset& target_offset,
+    const gfx::ScrollOffset& current_offset) {
+  scoped_ptr<ScrollOffsetAnimationCurve> curve =
+      ScrollOffsetAnimationCurve::Create(target_offset,
+                                         EaseInOutTimingFunction::Create());
+  curve->SetInitialValue(current_offset);
+
+  scoped_ptr<Animation> animation = Animation::Create(
+      curve.Pass(), AnimationIdProvider::NextAnimationId(),
+      AnimationIdProvider::NextGroupId(), Animation::SCROLL_OFFSET);
+  animation->set_is_impl_only(true);
+
+  layer_impl->layer_animation_controller()->AddAnimation(animation.Pass());
+}
+
+bool LayerTreeHostImpl::ScrollAnimationUpdateTarget(
+    LayerImpl* layer_impl,
+    const gfx::Vector2dF& scroll_delta) {
+  Animation* animation =
+      layer_impl->layer_animation_controller()
+          ? layer_impl->layer_animation_controller()->GetAnimation(
+                Animation::SCROLL_OFFSET)
+          : nullptr;
+  if (!animation)
+    return false;
+
+  ScrollOffsetAnimationCurve* curve =
+      animation->curve()->ToScrollOffsetAnimationCurve();
+
+  gfx::ScrollOffset new_target =
+      gfx::ScrollOffsetWithDelta(curve->target_value(), scroll_delta);
+  new_target.SetToMax(gfx::ScrollOffset());
+  new_target.SetToMin(layer_impl->MaxScrollOffset());
+
+  curve->UpdateTarget(
+      animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time)
+          .InSecondsF(),
+      new_target);
+
+  return true;
+}
 }  // namespace cc
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 94012e0..defe796 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -33,12 +33,19 @@
 #include "cc/resources/rasterizer.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/tile_manager.h"
+#include "cc/resources/ui_resource_client.h"
 #include "cc/scheduler/commit_earlyout_reason.h"
 #include "cc/scheduler/draw_result.h"
+#include "cc/trees/layer_tree_settings.h"
+#include "cc/trees/proxy.h"
 #include "skia/ext/refptr.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 
+namespace gfx {
+class ScrollOffset;
+}
+
 namespace cc {
 
 class CompletionEvent;
@@ -59,11 +66,13 @@
 class ResourcePool;
 class ScrollElasticityHelper;
 class ScrollbarLayerImplBase;
+class SwapPromise;
+class SwapPromiseMonitor;
 class TextureMailboxDeleter;
 class TopControlsManager;
 class UIResourceBitmap;
 class UIResourceRequest;
-struct RendererCapabilitiesImpl;
+struct ScrollAndScaleSet;
 
 enum class GpuRasterizationStatus {
   ON,
@@ -593,6 +602,12 @@
   void NotifySwapPromiseMonitorsOfSetNeedsRedraw();
   void NotifySwapPromiseMonitorsOfForwardingToMainThread();
 
+  void ScrollAnimationCreate(LayerImpl* layer_impl,
+                             const gfx::ScrollOffset& target_offset,
+                             const gfx::ScrollOffset& current_offset);
+  bool ScrollAnimationUpdateTarget(LayerImpl* layer_impl,
+                                   const gfx::Vector2dF& scroll_delta);
+
   typedef base::hash_map<UIResourceId, UIResourceData>
       UIResourceMap;
   UIResourceMap ui_resource_map_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 4e3230b..e8471e2 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/containers/hash_tables.h"
 #include "base/containers/scoped_ptr_hash_map.h"
 #include "cc/animation/scrollbar_animation_controller_thinning.h"
-#include "cc/base/latency_info_swap_promise.h"
 #include "cc/base/math_util.h"
 #include "cc/input/page_scale_animation.h"
 #include "cc/input/top_controls_manager.h"
@@ -33,6 +32,7 @@
 #include "cc/output/copy_output_request.h"
 #include "cc/output/copy_output_result.h"
 #include "cc/output/gl_renderer.h"
+#include "cc/output/latency_info_swap_promise.h"
 #include "cc/quads/render_pass_draw_quad.h"
 #include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index b9491bb..97765bd 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -12,9 +12,6 @@
 
 #if !defined(OS_ANDROID)
 
-// TODO(enne): these time out on Windows.  http://crbug.com/435632
-#if !defined(OS_WIN)
-
 namespace cc {
 namespace {
 
@@ -62,13 +59,13 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskOfLayer) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(25, 25, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   background->AddChild(green);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -82,9 +79,9 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, ImageMaskOfLayer) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
 
   scoped_refptr<PictureImageLayer> mask = PictureImageLayer::Create();
   mask->SetIsDrawable(true);
@@ -92,7 +89,7 @@
   mask->SetBounds(mask_bounds);
 
   SkBitmap bitmap;
-  bitmap.allocN32Pixels(400, 400);
+  bitmap.allocN32Pixels(200, 200);
   SkCanvas canvas(bitmap);
   canvas.scale(SkIntToScalar(4), SkIntToScalar(4));
   MaskContentLayerClient client(mask_bounds);
@@ -101,7 +98,7 @@
   mask->SetBitmap(bitmap);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(25, 25, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   green->SetMaskLayer(mask.get());
   background->AddChild(green);
 
@@ -111,20 +108,20 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskOfClippedLayer) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
   // Clip to the top half of the green layer.
   scoped_refptr<Layer> clip = Layer::Create();
   clip->SetPosition(gfx::Point(0, 0));
-  clip->SetBounds(gfx::Size(200, 100));
+  clip->SetBounds(gfx::Size(100, 50));
   clip->SetMasksToBounds(true);
   background->AddChild(clip);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(50, 50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(25, 25, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   clip->AddChild(green);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -139,9 +136,9 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskWithReplica) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -149,7 +146,7 @@
   mask->SetIsMask(true);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(0, 0, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(0, 0, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   background->AddChild(green);
   green->SetMaskLayer(mask.get());
 
@@ -157,8 +154,8 @@
   replica_transform.Rotate(-90.0);
 
   scoped_refptr<Layer> replica = Layer::Create();
-  replica->SetTransformOrigin(gfx::Point3F(50.f, 50.f, 0.f));
-  replica->SetPosition(gfx::Point(100, 100));
+  replica->SetTransformOrigin(gfx::Point3F(25.f, 25.f, 0.f));
+  replica->SetPosition(gfx::Point(50, 50));
   replica->SetTransform(replica_transform);
   green->SetReplicaLayer(replica.get());
 
@@ -168,9 +165,9 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskWithReplicaOfClippedLayer) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -180,13 +177,13 @@
   // Clip to the bottom half of the green layer, and the left half of the
   // replica.
   scoped_refptr<Layer> clip = Layer::Create();
-  clip->SetPosition(gfx::Point(0, 50));
-  clip->SetBounds(gfx::Size(150, 150));
+  clip->SetPosition(gfx::Point(0, 25));
+  clip->SetBounds(gfx::Size(75, 75));
   clip->SetMasksToBounds(true);
   background->AddChild(clip);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(0, -50, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(0, -25, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   clip->AddChild(green);
   green->SetMaskLayer(mask.get());
 
@@ -194,8 +191,8 @@
   replica_transform.Rotate(-90.0);
 
   scoped_refptr<Layer> replica = Layer::Create();
-  replica->SetTransformOrigin(gfx::Point3F(50.f, 50.f, 0.f));
-  replica->SetPosition(gfx::Point(100, 100));
+  replica->SetTransformOrigin(gfx::Point3F(25.f, 25.f, 0.f));
+  replica->SetPosition(gfx::Point(50, 50));
   replica->SetTransform(replica_transform);
   green->SetReplicaLayer(replica.get());
 
@@ -206,9 +203,9 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskOfReplica) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -216,19 +213,19 @@
   mask->SetIsMask(true);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(50, 0, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(25, 0, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   background->AddChild(green);
 
   scoped_refptr<SolidColorLayer> orange = CreateSolidColorLayer(
-      gfx::Rect(-50, 50, 50, 50), kCSSOrange);
+      gfx::Rect(-25, 25, 25, 25), kCSSOrange);
   green->AddChild(orange);
 
   gfx::Transform replica_transform;
   replica_transform.Rotate(180.0);
-  replica_transform.Translate(100.0, 0.0);
+  replica_transform.Translate(50.0, 0.0);
 
   scoped_refptr<Layer> replica = Layer::Create();
-  replica->SetTransformOrigin(gfx::Point3F(100.f, 100.f, 0.f));
+  replica->SetTransformOrigin(gfx::Point3F(50.f, 50.f, 0.f));
   replica->SetPosition(gfx::Point());
   replica->SetTransform(replica_transform);
   replica->SetMaskLayer(mask.get());
@@ -240,9 +237,9 @@
 
 TEST_P(LayerTreeHostMasksPixelTest, MaskOfReplicaOfClippedLayer) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(200, 200), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size mask_bounds(100, 100);
+  gfx::Size mask_bounds(50, 50);
   MaskContentLayerClient client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&client);
   mask->SetBounds(mask_bounds);
@@ -251,25 +248,25 @@
 
   // Clip to the bottom 3/4 of the green layer, and the top 3/4 of the replica.
   scoped_refptr<Layer> clip = Layer::Create();
-  clip->SetPosition(gfx::Point(0, 25));
-  clip->SetBounds(gfx::Size(200, 150));
+  clip->SetPosition(gfx::Point(0, 12));
+  clip->SetBounds(gfx::Size(100, 75));
   clip->SetMasksToBounds(true);
   background->AddChild(clip);
 
   scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder(
-      gfx::Rect(50, -25, 100, 100), kCSSGreen, 1, SK_ColorBLACK);
+      gfx::Rect(25, -12, 50, 50), kCSSGreen, 1, SK_ColorBLACK);
   clip->AddChild(green);
 
   scoped_refptr<SolidColorLayer> orange = CreateSolidColorLayer(
-      gfx::Rect(-50, 50, 50, 50), kCSSOrange);
+      gfx::Rect(-25, 25, 25, 25), kCSSOrange);
   green->AddChild(orange);
 
   gfx::Transform replica_transform;
   replica_transform.Rotate(180.0);
-  replica_transform.Translate(100.0, 0.0);
+  replica_transform.Translate(50.0, 0.0);
 
   scoped_refptr<Layer> replica = Layer::Create();
-  replica->SetTransformOrigin(gfx::Point3F(100.f, 100.f, 0.f));
+  replica->SetTransformOrigin(gfx::Point3F(50.f, 50.f, 0.f));
   replica->SetPosition(gfx::Point());
   replica->SetTransform(replica_transform);
   replica->SetMaskLayer(mask.get());
@@ -368,24 +365,24 @@
 TEST_P(LayerTreeHostMasksForBackgroundFiltersPixelTest,
        MaskOfLayerWithBackgroundFilter) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(256, 256), SK_ColorWHITE);
+      gfx::Rect(100, 100), SK_ColorWHITE);
 
-  gfx::Size picture_bounds(256, 256);
+  gfx::Size picture_bounds(100, 100);
   CheckerContentLayerClient picture_client(picture_bounds, SK_ColorGREEN, true);
   scoped_refptr<PictureLayer> picture = PictureLayer::Create(&picture_client);
   picture->SetBounds(picture_bounds);
   picture->SetIsDrawable(true);
 
   scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer(
-      gfx::Rect(256, 256), SK_ColorTRANSPARENT);
+      gfx::Rect(100, 100), SK_ColorTRANSPARENT);
   background->AddChild(picture);
   background->AddChild(blur);
 
   FilterOperations filters;
-  filters.Append(FilterOperation::CreateBlurFilter(2.f));
+  filters.Append(FilterOperation::CreateBlurFilter(1.5f));
   blur->SetBackgroundFilters(filters);
 
-  gfx::Size mask_bounds(256, 256);
+  gfx::Size mask_bounds(100, 100);
   CircleContentLayerClient mask_client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&mask_client);
   mask->SetBounds(mask_bounds);
@@ -393,7 +390,7 @@
   mask->SetIsMask(true);
   blur->SetMaskLayer(mask.get());
 
-  float percentage_pixels_large_error = 2.5f;  // 2.5%, ~1600px / (256*256)
+  float percentage_pixels_large_error = 2.5f;  // 2.5%, ~250px / (100*100)
   float percentage_pixels_small_error = 0.0f;
   float average_error_allowed_in_bad_pixels = 100.0f;
   int large_error_allowed = 256;
@@ -414,9 +411,9 @@
 TEST_P(LayerTreeHostMasksForBackgroundFiltersPixelTest,
        MaskOfLayerWithBlend) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
-      gfx::Rect(256, 256), SK_ColorWHITE);
+      gfx::Rect(128, 128), SK_ColorWHITE);
 
-  gfx::Size picture_bounds(256, 256);
+  gfx::Size picture_bounds(128, 128);
   CheckerContentLayerClient picture_client_vertical(
       picture_bounds, SK_ColorGREEN, true);
   scoped_refptr<PictureLayer> picture_vertical =
@@ -436,7 +433,7 @@
   background->AddChild(picture_vertical);
   background->AddChild(picture_horizontal);
 
-  gfx::Size mask_bounds(256, 256);
+  gfx::Size mask_bounds(128, 128);
   CircleContentLayerClient mask_client(mask_bounds);
   scoped_refptr<PictureLayer> mask = PictureLayer::Create(&mask_client);
   mask->SetBounds(mask_bounds);
@@ -444,7 +441,7 @@
   mask->SetIsMask(true);
   picture_horizontal->SetMaskLayer(mask.get());
 
-  float percentage_pixels_large_error = 0.01f;  // 0.01%, ~6px / (256*256)
+  float percentage_pixels_large_error = 0.04f;  // 0.04%, ~6px / (128*128)
   float percentage_pixels_small_error = 0.0f;
   float average_error_allowed_in_bad_pixels = 256.0f;
   int large_error_allowed = 256;
@@ -465,5 +462,4 @@
 }  // namespace
 }  // namespace cc
 
-#endif  // !defined(OS_WIN)
 #endif  // !defined(OS_ANDROID)
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 2ec6e66..9416474 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/auto_reset.h"
 #include "base/synchronization/lock.h"
 #include "cc/animation/timing_function.h"
-#include "cc/base/swap_promise.h"
 #include "cc/debug/frame_rate_counter.h"
 #include "cc/layers/content_layer.h"
 #include "cc/layers/content_layer_client.h"
@@ -23,6 +22,7 @@
 #include "cc/output/copy_output_request.h"
 #include "cc/output/copy_output_result.h"
 #include "cc/output/output_surface.h"
+#include "cc/output/swap_promise.h"
 #include "cc/quads/draw_quad.h"
 #include "cc/quads/io_surface_draw_quad.h"
 #include "cc/quads/tile_draw_quad.h"
@@ -2958,6 +2958,92 @@
 
 MULTI_THREAD_TEST_F(LayerTreeHostTestDeferredInitialize);
 
+class LayerTreeHostTestResourcelessSoftwareDraw : public LayerTreeHostTest {
+ public:
+  void SetupTree() override {
+    root_layer_ = FakePictureLayer::Create(&client_);
+    root_layer_->SetIsDrawable(true);
+    root_layer_->SetBounds(gfx::Size(50, 50));
+
+    parent_layer_ = FakePictureLayer::Create(&client_);
+    parent_layer_->SetIsDrawable(true);
+    parent_layer_->SetBounds(gfx::Size(50, 50));
+    parent_layer_->SetForceRenderSurface(true);
+
+    child_layer_ = FakePictureLayer::Create(&client_);
+    child_layer_->SetIsDrawable(true);
+    child_layer_->SetBounds(gfx::Size(50, 50));
+
+    root_layer_->AddChild(parent_layer_);
+    parent_layer_->AddChild(child_layer_);
+    layer_tree_host()->SetRootLayer(root_layer_);
+
+    LayerTreeHostTest::SetupTree();
+  }
+
+  scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface() override {
+    return FakeOutputSurface::CreateDeferredGL(
+        make_scoped_ptr(new SoftwareOutputDevice), delegating_renderer());
+  }
+
+  void BeginTest() override {
+    PostSetNeedsCommitToMainThread();
+    swap_count_ = 0;
+  }
+
+  DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
+                                   LayerTreeHostImpl::FrameData* frame_data,
+                                   DrawResult draw_result) override {
+    if (host_impl->GetDrawMode() == DRAW_MODE_RESOURCELESS_SOFTWARE) {
+      EXPECT_EQ(1u, frame_data->render_passes.size());
+      // Has at least 3 quads for each layer.
+      RenderPass* render_pass = frame_data->render_passes[0];
+      EXPECT_GE(render_pass->quad_list.size(), 3u);
+    } else {
+      EXPECT_EQ(2u, frame_data->render_passes.size());
+
+      // At least root layer quad in root render pass.
+      EXPECT_GE(frame_data->render_passes[0]->quad_list.size(), 1u);
+      // At least parent and child layer quads in parent render pass.
+      EXPECT_GE(frame_data->render_passes[1]->quad_list.size(), 2u);
+    }
+    return draw_result;
+  }
+
+  void SwapBuffersCompleteOnThread(LayerTreeHostImpl* host_impl) override {
+    swap_count_++;
+    switch (swap_count_) {
+      case 1: {
+        gfx::Transform identity;
+        gfx::Rect empty_rect;
+        bool resourceless_software_draw = true;
+        host_impl->SetExternalDrawConstraints(identity, empty_rect, empty_rect,
+                                              empty_rect, identity,
+                                              resourceless_software_draw);
+        host_impl->SetFullRootLayerDamage();
+        host_impl->SetNeedsRedraw();
+        break;
+      }
+      case 2:
+        EndTest();
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+
+  void AfterTest() override {}
+
+ private:
+  FakeContentLayerClient client_;
+  scoped_refptr<Layer> root_layer_;
+  scoped_refptr<Layer> parent_layer_;
+  scoped_refptr<Layer> child_layer_;
+  int swap_count_;
+};
+
+MULTI_THREAD_IMPL_TEST_F(LayerTreeHostTestResourcelessSoftwareDraw);
+
 class LayerTreeHostTestDeferredInitializeWithGpuRasterization
     : public LayerTreeHostTestDeferredInitialize {
   void InitializeSettings(LayerTreeSettings* settings) override {
@@ -5262,10 +5348,6 @@
       : begin_frame_sent_to_children_(false) {
   }
 
-  void InitializeSettings(LayerTreeSettings* settings) override {
-    settings->forward_begin_frames_to_children = true;
-  }
-
   void BeginTest() override {
     // Kick off the test with a commit.
     PostSetNeedsCommitToMainThread();
@@ -5302,7 +5384,6 @@
 
   void InitializeSettings(LayerTreeSettings* settings) override {
     settings->use_external_begin_frame_source = true;
-    settings->forward_begin_frames_to_children = true;
   }
 
   void BeginTest() override {
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 3105e6f..15e0f0c 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -12,11 +12,14 @@
 #include "base/containers/hash_tables.h"
 #include "base/values.h"
 #include "cc/base/scoped_ptr_vector.h"
-#include "cc/base/swap_promise.h"
 #include "cc/base/synced_property.h"
+#include "cc/input/layer_selection_bound.h"
 #include "cc/layers/layer_impl.h"
+#include "cc/output/begin_frame_args.h"
 #include "cc/output/renderer.h"
+#include "cc/output/swap_promise.h"
 #include "cc/resources/ui_resource_client.h"
+#include "cc/trees/layer_tree_host_impl.h"
 
 namespace base {
 namespace trace_event {
@@ -32,7 +35,6 @@
 class HeadsUpDisplayLayerImpl;
 class LayerScrollOffsetDelegateProxy;
 class LayerTreeDebugState;
-class LayerTreeHostImpl;
 class LayerTreeImpl;
 class LayerTreeSettings;
 class MemoryHistory;
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 213ad28..96c9d16 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -19,10 +19,8 @@
       throttle_frame_production(true),
       single_thread_proxy_scheduler(true),
       use_external_begin_frame_source(false),
-      forward_begin_frames_to_children(false),
       main_frame_before_activation_enabled(false),
       using_synchronous_renderer_compositor(false),
-      disable_hi_res_timer_tasks_on_battery(false),
       report_overscroll_only_for_scrollable_axes(false),
       per_tile_painting_enabled(false),
       accelerated_animation_enabled(true),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 373f704..4554362 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -25,10 +25,8 @@
   bool throttle_frame_production;
   bool single_thread_proxy_scheduler;
   bool use_external_begin_frame_source;
-  bool forward_begin_frames_to_children;
   bool main_frame_before_activation_enabled;
   bool using_synchronous_renderer_compositor;
-  bool disable_hi_res_timer_tasks_on_battery;
   bool report_overscroll_only_for_scrollable_axes;
   bool per_tile_painting_enabled;
   bool accelerated_animation_enabled;
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 8e8ef50..544755b 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <set>
+#include <vector>
 
 #include "base/logging.h"
 #include "cc/base/math_util.h"
@@ -44,7 +45,7 @@
       is_animated(false),
       to_screen_is_animated(false),
       flattens_inherited_transform(false),
-      flattens_local_transform(false),
+      node_and_ancestors_are_flat(true),
       scrolls(false),
       needs_sublayer_scale(false),
       layer_scale_factor(1.0f) {
@@ -135,7 +136,18 @@
                                              gfx::Transform* transform) const {
   const TransformNode* current = Node(source_id);
   const TransformNode* dest = Node(dest_id);
-  if (!dest || dest->data.ancestors_are_invertible) {
+  // Combine transforms to and from the screen when possible. Since flattening
+  // is a non-linear operation, we cannot use this approach when there is
+  // non-trivial flattening between the source and destination nodes. For
+  // example, consider the tree R->A->B->C, where B flattens its inherited
+  // transform, and A has a non-flat transform. Suppose C is the source and A is
+  // the destination. The expected result is C * B. But C's to_screen
+  // transform is C * B * flattened(A * R), and A's from_screen transform is
+  // R^{-1} * A^{-1}. If at least one of A and R isn't flat, the inverse of
+  // flattened(A * R) won't be R^{-1} * A{-1}, so multiplying C's to_screen and
+  // A's from_screen will not produce the correct result.
+  if (!dest || (dest->data.ancestors_are_invertible &&
+                current->data.node_and_ancestors_are_flat)) {
     transform->ConcatTransform(current->data.to_screen);
     if (dest)
       transform->ConcatTransform(dest->data.from_screen);
@@ -143,12 +155,43 @@
   }
 
   bool all_are_invertible = true;
+
+  // Flattening is defined in a way that requires it to be applied while
+  // traversing downward in the tree. We first identify nodes that are on the
+  // path from the source to the destination (this is traversing upward), and
+  // then we visit these nodes in reverse order, flattening as needed. We
+  // early-out if we get to a node whose target node is the destination, since
+  // we can then re-use the target space transform stored at that node.
+  std::vector<int> source_to_destination;
+  source_to_destination.push_back(current->id);
+  current = parent(current);
   for (; current && current->id > dest_id; current = parent(current)) {
-    transform->ConcatTransform(current->data.to_parent);
-    if (!current->data.is_invertible)
+    if (current->data.target_id == dest_id &&
+        current->data.content_target_id == dest_id)
+      break;
+    source_to_destination.push_back(current->id);
+  }
+
+  gfx::Transform combined_transform;
+  if (current->id > dest_id) {
+    combined_transform = current->data.to_target;
+    // The stored target space transform has sublayer scale baked in, but we
+    // need the unscaled transform.
+    combined_transform.Scale(1.0f / dest->data.sublayer_scale.x(),
+                             1.0f / dest->data.sublayer_scale.y());
+  }
+
+  for (int i = source_to_destination.size() - 1; i >= 0; i--) {
+    const TransformNode* node = Node(source_to_destination[i]);
+    if (node->data.flattens_inherited_transform)
+      combined_transform.FlattenTo2d();
+    combined_transform.PreconcatTransform(node->data.to_parent);
+
+    if (!node->data.is_invertible)
       all_are_invertible = false;
   }
 
+  transform->ConcatTransform(combined_transform);
   return all_are_invertible;
 }
 
@@ -157,20 +200,27 @@
                                            gfx::Transform* transform) const {
   const TransformNode* current = Node(dest_id);
   const TransformNode* dest = Node(source_id);
-  if (current->data.ancestors_are_invertible) {
+  // Just as in CombineTransformsBetween, we can use screen space transforms in
+  // this computation only when there isn't any non-trivial flattening
+  // involved.
+  if (current->data.ancestors_are_invertible &&
+      current->data.node_and_ancestors_are_flat) {
     transform->PreconcatTransform(current->data.from_screen);
     if (dest)
       transform->PreconcatTransform(dest->data.to_screen);
     return true;
   }
 
-  bool all_are_invertible = true;
-  for (; current && current->id > source_id; current = parent(current)) {
-    transform->PreconcatTransform(current->data.from_parent);
-    if (!current->data.is_invertible)
-      all_are_invertible = false;
-  }
-
+  // Inverting a flattening is not equivalent to flattening an inverse. This
+  // means we cannot, for example, use the inverse of each node's to_parent
+  // transform, flattening where needed. Instead, we must compute the transform
+  // from the destination to the source, with flattening, and then invert the
+  // result.
+  gfx::Transform dest_to_source;
+  CombineTransformsBetween(dest_id, source_id, &dest_to_source);
+  gfx::Transform source_to_dest;
+  bool all_are_invertible = dest_to_source.GetInverse(&source_to_dest);
+  transform->PreconcatTransform(source_to_dest);
   return all_are_invertible;
 }
 
@@ -191,28 +241,17 @@
     node->data.to_screen = node->data.to_parent;
     node->data.ancestors_are_invertible = true;
     node->data.to_screen_is_animated = false;
-  } else if (parent_node->data.flattens_local_transform ||
-             node->data.flattens_inherited_transform) {
-    // Flattening is tricky. Once a layer is drawn into its render target, it
-    // cannot escape, so we only need to consider transforms between the layer
-    // and its target when flattening (i.e., its draw transform). To compute the
-    // screen space transform when flattening is involved we combine three
-    // transforms, A * B * C, where A is the screen space transform of the
-    // target, B is the flattened draw transform of the layer's parent, and C is
-    // the local transform.
-    node->data.to_screen = target_node->data.to_screen;
-    gfx::Transform flattened;
-    ComputeTransform(parent_node->id, target_node->id, &flattened);
-    flattened.FlattenTo2d();
-    node->data.to_screen.PreconcatTransform(flattened);
-    node->data.to_screen.PreconcatTransform(node->data.to_parent);
-    node->data.ancestors_are_invertible =
-        parent_node->data.ancestors_are_invertible;
+    node->data.node_and_ancestors_are_flat = node->data.to_parent.IsFlat();
   } else {
     node->data.to_screen = parent_node->data.to_screen;
+    if (node->data.flattens_inherited_transform)
+      node->data.to_screen.FlattenTo2d();
     node->data.to_screen.PreconcatTransform(node->data.to_parent);
     node->data.ancestors_are_invertible =
         parent_node->data.ancestors_are_invertible;
+    node->data.node_and_ancestors_are_flat =
+        parent_node->data.node_and_ancestors_are_flat &&
+        node->data.to_parent.IsFlat();
   }
 
   if (!node->data.to_screen.GetInverse(&node->data.from_screen))
@@ -287,7 +326,6 @@
   // Now that we have our scroll delta, we must apply it to each of our
   // combined, to/from matrices.
   node->data.to_parent.PreconcatTransform(delta);
-  node->data.from_parent.ConcatTransform(inverse_delta);
   node->data.to_target.PreconcatTransform(delta);
   node->data.from_target.ConcatTransform(inverse_delta);
   node->data.to_screen.PreconcatTransform(delta);
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index cb00e8a..a79ce55 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -47,7 +47,6 @@
   gfx::Transform post_local;
 
   gfx::Transform to_parent;
-  gfx::Transform from_parent;
 
   gfx::Transform to_target;
   gfx::Transform from_target;
@@ -69,13 +68,14 @@
   bool is_animated;
   bool to_screen_is_animated;
 
-  // We don't necessarily create a transform node to apply flattening. If we've
-  // skipped flattening for an ancestor, we must flatten the transform we
-  // inherit, but we don't necessarily need to flatten our local transform. We
-  // must therefore use two values to describe the flattening required for the
-  // local and inherited transforms.
+  // Flattening, when needed, is only applied to a node's inherited transform,
+  // never to its local transform.
   bool flattens_inherited_transform;
-  bool flattens_local_transform;
+
+  // This is true if the to_parent transform at every node on the path to the
+  // root is flat.
+  bool node_and_ancestors_are_flat;
+
   bool scrolls;
 
   bool needs_sublayer_scale;
@@ -89,7 +89,7 @@
 
   void set_to_parent(const gfx::Transform& transform) {
     to_parent = transform;
-    is_invertible = to_parent.GetInverse(&from_parent);
+    is_invertible = to_parent.IsInvertible();
   }
 };
 
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 8352ab8..0db2ad7 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -173,6 +173,8 @@
     gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() +
                                   layer->transform().To2dTranslation();
     layer->set_offset_to_transform_parent(parent_offset + local_offset);
+    layer->set_should_flatten_transform_from_property_tree(
+        data_from_ancestor.should_flatten);
     layer->set_transform_tree_index(transform_parent->transform_tree_index());
     return;
   }
@@ -188,8 +190,10 @@
 
   node->data.scrolls = is_scrollable;
   node->data.flattens_inherited_transform = data_for_children->should_flatten;
-  node->data.flattens_local_transform = layer->should_flatten_transform();
-  data_for_children->should_flatten = false;
+
+  // Surfaces inherently flatten transforms.
+  data_for_children->should_flatten =
+      layer->should_flatten_transform() || has_surface;
   node->data.target_id =
       data_from_ancestor.render_target->transform_tree_index();
   node->data.content_target_id =
@@ -233,6 +237,9 @@
   data_from_ancestor.transform_tree->UpdateTransforms(node->id);
 
   layer->set_offset_to_transform_parent(gfx::Vector2dF());
+
+  // Flattening (if needed) will be handled by |node|.
+  layer->set_should_flatten_transform_from_property_tree(false);
 }
 
 void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor,
diff --git a/cc/trees/property_tree_unittest.cc b/cc/trees/property_tree_unittest.cc
index 014bfcb..4b64050 100644
--- a/cc/trees/property_tree_unittest.cc
+++ b/cc/trees/property_tree_unittest.cc
@@ -5,6 +5,7 @@
 #include "cc/trees/property_tree.h"
 
 #include "cc/test/geometry_test_utils.h"
+#include "cc/trees/draw_property_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cc {
@@ -168,6 +169,75 @@
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
 }
 
+TEST(PropertyTreeTest, TransformsWithFlattening) {
+  TransformTree tree;
+
+  int grand_parent = tree.Insert(TransformNode(), 0);
+  tree.Node(grand_parent)->data.content_target_id = grand_parent;
+  tree.Node(grand_parent)->data.target_id = grand_parent;
+
+  gfx::Transform rotation_about_x;
+  rotation_about_x.RotateAboutXAxis(15);
+
+  int parent = tree.Insert(TransformNode(), grand_parent);
+  tree.Node(parent)->data.needs_sublayer_scale = true;
+  tree.Node(parent)->data.target_id = grand_parent;
+  tree.Node(parent)->data.content_target_id = parent;
+  tree.Node(parent)->data.local = rotation_about_x;
+
+  int child = tree.Insert(TransformNode(), parent);
+  tree.Node(child)->data.target_id = parent;
+  tree.Node(child)->data.content_target_id = parent;
+  tree.Node(child)->data.flattens_inherited_transform = true;
+  tree.Node(child)->data.local = rotation_about_x;
+
+  int grand_child = tree.Insert(TransformNode(), child);
+  tree.Node(grand_child)->data.target_id = parent;
+  tree.Node(grand_child)->data.content_target_id = parent;
+  tree.Node(grand_child)->data.flattens_inherited_transform = true;
+  tree.Node(grand_child)->data.local = rotation_about_x;
+
+  ComputeTransforms(&tree);
+
+  gfx::Transform flattened_rotation_about_x = rotation_about_x;
+  flattened_rotation_about_x.FlattenTo2d();
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x,
+                                  tree.Node(child)->data.to_target);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x * rotation_about_x,
+                                  tree.Node(child)->data.to_screen);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x * rotation_about_x,
+                                  tree.Node(grand_child)->data.to_target);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x *
+                                      flattened_rotation_about_x *
+                                      rotation_about_x,
+                                  tree.Node(grand_child)->data.to_screen);
+
+  gfx::Transform grand_child_to_child;
+  bool success =
+      tree.ComputeTransform(grand_child, child, &grand_child_to_child);
+  EXPECT_TRUE(success);
+  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x, grand_child_to_child);
+
+  // Remove flattening at grand_child, and recompute transforms.
+  tree.Node(grand_child)->data.flattens_inherited_transform = false;
+  ComputeTransforms(&tree);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x * rotation_about_x,
+                                  tree.Node(grand_child)->data.to_target);
+
+  EXPECT_TRANSFORMATION_MATRIX_EQ(
+      flattened_rotation_about_x * rotation_about_x * rotation_about_x,
+      tree.Node(grand_child)->data.to_screen);
+
+  success = tree.ComputeTransform(grand_child, child, &grand_child_to_child);
+  EXPECT_TRUE(success);
+  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x, grand_child_to_child);
+}
+
 TEST(PropertyTreeTest, MultiplicationOrder) {
   TransformTree tree;
   TransformNode& root = *tree.Node(0);
diff --git a/cc/trees/scoped_abort_remaining_swap_promises.h b/cc/trees/scoped_abort_remaining_swap_promises.h
index f8dfc01..e35fbf9 100644
--- a/cc/trees/scoped_abort_remaining_swap_promises.h
+++ b/cc/trees/scoped_abort_remaining_swap_promises.h
@@ -5,7 +5,7 @@
 #ifndef CC_TREES_SCOPED_ABORT_REMAINING_SWAP_PROMISES_H_
 #define CC_TREES_SCOPED_ABORT_REMAINING_SWAP_PROMISES_H_
 
-#include "cc/base/swap_promise.h"
+#include "cc/output/swap_promise.h"
 #include "cc/trees/layer_tree_host.h"
 
 namespace cc {
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 81c70f0..1ecce4d 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -488,6 +488,11 @@
     scheduler_on_impl_thread_->CommitVSyncParameters(timebase, interval);
 }
 
+void SingleThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) {
+  if (scheduler_on_impl_thread_)
+    scheduler_on_impl_thread_->SetEstimatedParentDrawTime(draw_time);
+}
+
 void SingleThreadProxy::DidSwapBuffersOnImplThread() {
   TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersOnImplThread");
   if (scheduler_on_impl_thread_)
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index 5bc6d3d..cfc746a 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -23,6 +23,7 @@
 class ContextProvider;
 class LayerTreeHost;
 class LayerTreeHostSingleThreadClient;
+class ResourceUpdateQueue;
 
 class CC_EXPORT SingleThreadProxy : public Proxy,
                                     NON_EXPORTED_BASE(LayerTreeHostImplClient),
@@ -85,7 +86,7 @@
   void DidLoseOutputSurfaceOnImplThread() override;
   void CommitVSyncParameters(base::TimeTicks timebase,
                              base::TimeDelta interval) override;
-  void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {}
+  void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override;
   void SetMaxSwapsPendingOnImplThread(int max) override {}
   void DidSwapBuffersOnImplThread() override;
   void DidSwapBuffersCompleteOnImplThread() override;
diff --git a/cc/base/swap_promise_monitor.cc b/cc/trees/swap_promise_monitor.cc
similarity index 95%
rename from cc/base/swap_promise_monitor.cc
rename to cc/trees/swap_promise_monitor.cc
index 0c04f35..84d8a9f 100644
--- a/cc/base/swap_promise_monitor.cc
+++ b/cc/trees/swap_promise_monitor.cc
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 #include "base/logging.h"
-#include "cc/base/swap_promise_monitor.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_host_impl.h"
+#include "cc/trees/swap_promise_monitor.h"
 
 namespace cc {
 
diff --git a/cc/base/swap_promise_monitor.h b/cc/trees/swap_promise_monitor.h
similarity index 92%
rename from cc/base/swap_promise_monitor.h
rename to cc/trees/swap_promise_monitor.h
index cf06bee..d163af5 100644
--- a/cc/base/swap_promise_monitor.h
+++ b/cc/trees/swap_promise_monitor.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CC_BASE_SWAP_PROMISE_MONITOR_H_
-#define CC_BASE_SWAP_PROMISE_MONITOR_H_
+#ifndef CC_TREES_SWAP_PROMISE_MONITOR_H_
+#define CC_TREES_SWAP_PROMISE_MONITOR_H_
 
 #include "cc/base/cc_export.h"
 
@@ -42,4 +42,4 @@
 
 }  // namespace cc
 
-#endif  // CC_BASE_SWAP_PROMISE_MONITOR_H_
+#endif  // CC_TREES_SWAP_PROMISE_MONITOR_H_
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index 7452520..6e1a0d9 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -12,12 +12,12 @@
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_argument.h"
 #include "base/trace_event/trace_event_synthetic_delay.h"
-#include "cc/base/swap_promise.h"
 #include "cc/debug/benchmark_instrumentation.h"
 #include "cc/debug/devtools_instrumentation.h"
 #include "cc/input/input_handler.h"
 #include "cc/output/context_provider.h"
 #include "cc/output/output_surface.h"
+#include "cc/output/swap_promise.h"
 #include "cc/quads/draw_quad.h"
 #include "cc/resources/prioritized_resource_manager.h"
 #include "cc/scheduler/commit_earlyout_reason.h"
diff --git a/cc/trees/thread_proxy.h b/cc/trees/thread_proxy.h
index 927caab..51cc18c 100644
--- a/cc/trees/thread_proxy.h
+++ b/cc/trees/thread_proxy.h
@@ -30,6 +30,7 @@
 class ContextProvider;
 class InputHandlerClient;
 class LayerTreeHost;
+class PrioritizedResourceManager;
 class ResourceUpdateQueue;
 class Scheduler;
 class ScopedThreadProxy;
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 502bc0a..79919df 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -35,6 +35,10 @@
 import("//testing/test.gni")
 import("//build/config/ui.gni")
 
+config("gpu_implementation") {
+  defines = [ "GPU_IMPLEMENTATION" ]
+}
+
 component("gpu") {
   public_deps = [
     "//gpu/command_buffer/client",
@@ -54,6 +58,8 @@
     "command_buffer/service/gles2_cmd_decoder_mock.cc",
   ]
 
+  configs += [ ":gpu_implementation" ]
+
   public_deps = [
     ":gpu",
     "//gpu/command_buffer/client:gles2_interface",
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index bf5b19e..d5b799e 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -547,6 +547,8 @@
 # valid_es3: The list of values that are valid in OpenGL ES 3, but not ES 2.
 # invalid: Examples of invalid values for the type. At least these values
 #          should be tested to be invalid.
+# deprecated_es3: The list of values that are valid in OpenGL ES 2, but
+#                 deprecated in ES 3.
 # is_complete: The list of valid values of type are final and will not be
 #              modified during runtime.
 _NAMED_TYPE_INFO = {
@@ -776,6 +778,10 @@
       'GL_TEXTURE_2D',
       'GL_TEXTURE_CUBE_MAP',
     ],
+    'valid_es3': [
+      'GL_TEXTURE_3D',
+      'GL_TEXTURE_2D_ARRAY',
+    ],
     'invalid': [
       'GL_TEXTURE_1D',
       'GL_TEXTURE_3D',
@@ -1223,9 +1229,22 @@
       'GL_UNSIGNED_SHORT_4_4_4_4',
       'GL_UNSIGNED_SHORT_5_5_5_1',
     ],
-    'invalid': [
+    'valid_es3': [
+      'GL_BYTE',
+      'GL_UNSIGNED_SHORT',
       'GL_SHORT',
+      'GL_UNSIGNED_INT',
       'GL_INT',
+      'GL_HALF_FLOAT',
+      'GL_FLOAT',
+      'GL_UNSIGNED_INT_2_10_10_10_REV',
+      'GL_UNSIGNED_INT_10F_11F_11F_REV',
+      'GL_UNSIGNED_INT_5_9_9_9_REV',
+      'GL_UNSIGNED_INT_24_8',
+      'GL_FLOAT_32_UNSIGNED_INT_24_8_REV',
+    ],
+    'invalid': [
+      'GL_UNSIGNED_BYTE_3_3_2',
     ],
   },
   'ReadPixelType': {
@@ -1278,6 +1297,16 @@
       'GL_RGB',
       'GL_RGBA',
     ],
+    'valid_es3': [
+      'GL_RED',
+      'GL_RED_INTEGER',
+      'GL_RG',
+      'GL_RG_INTEGER',
+      'GL_RGB_INTEGER',
+      'GL_RGBA_INTEGER',
+      'GL_DEPTH_COMPONENT',
+      'GL_DEPTH_STENCIL',
+    ],
     'invalid': [
       'GL_BGRA',
       'GL_BGR',
@@ -1292,6 +1321,64 @@
       'GL_RGB',
       'GL_RGBA',
     ],
+    'valid_es3': [
+      'GL_R8',
+      'GL_R8_SNORM',
+      'GL_R16F',
+      'GL_R32F',
+      'GL_R8UI',
+      'GL_R8I',
+      'GL_R16UI',
+      'GL_R16I',
+      'GL_R32UI',
+      'GL_R32I',
+      'GL_RG8',
+      'GL_RG8_SNORM',
+      'GL_RG16F',
+      'GL_RG32F',
+      'GL_RG8UI',
+      'GL_RG8I',
+      'GL_RG16UI',
+      'GL_RG16I',
+      'GL_RG32UI',
+      'GL_RG32I',
+      'GL_RGB8',
+      'GL_SRGB8',
+      'GL_RGB565',
+      'GL_RGB8_SNORM',
+      'GL_R11F_G11F_B10F',
+      'GL_RGB9_E5',
+      'GL_RGB16F',
+      'GL_RGB32F',
+      'GL_RGB8UI',
+      'GL_RGB8I',
+      'GL_RGB16UI',
+      'GL_RGB16I',
+      'GL_RGB32UI',
+      'GL_RGB32I',
+      'GL_RGBA8',
+      'GL_SRGB8_ALPHA8',
+      'GL_RGBA8_SNORM',
+      'GL_RGB5_A1',
+      'GL_RGBA4',
+      'GL_RGB10_A2',
+      'GL_RGBA16F',
+      'GL_RGBA32F',
+      'GL_RGBA8UI',
+      'GL_RGBA8I',
+      'GL_RGB10_A2UI',
+      'GL_RGBA16UI',
+      'GL_RGBA16I',
+      'GL_RGBA32UI',
+      'GL_RGBA32I',
+      # The DEPTH/STENCIL formats are not supported in CopyTexImage2D.
+      # We will reject them dynamically in GPU command buffer.
+      'GL_DEPTH_COMPONENT16',
+      'GL_DEPTH_COMPONENT24',
+      'GL_DEPTH_COMPONENT32F',
+      'GL_DEPTH24_STENCIL8',
+      'GL_DEPTH32F_STENCIL8',
+    ],
     'invalid': [
       'GL_BGRA',
       'GL_BGR',
@@ -1309,6 +1396,78 @@
       'GL_RGB8_OES',
       'GL_RGBA8_OES',
     ],
+    'valid_es3': [
+      'GL_R8',
+      'GL_R8_SNORM',
+      'GL_R16F',
+      'GL_R32F',
+      'GL_R8UI',
+      'GL_R8I',
+      'GL_R16UI',
+      'GL_R16I',
+      'GL_R32UI',
+      'GL_R32I',
+      'GL_RG8',
+      'GL_RG8_SNORM',
+      'GL_RG16F',
+      'GL_RG32F',
+      'GL_RG8UI',
+      'GL_RG8I',
+      'GL_RG16UI',
+      'GL_RG16I',
+      'GL_RG32UI',
+      'GL_RG32I',
+      'GL_SRGB8',
+      'GL_RGB8_SNORM',
+      'GL_R11F_G11F_B10F',
+      'GL_RGB9_E5',
+      'GL_RGB16F',
+      'GL_RGB32F',
+      'GL_RGB8UI',
+      'GL_RGB8I',
+      'GL_RGB16UI',
+      'GL_RGB16I',
+      'GL_RGB32UI',
+      'GL_RGB32I',
+      'GL_SRGB8_ALPHA8',
+      'GL_RGBA8_SNORM',
+      'GL_RGB10_A2',
+      'GL_RGBA16F',
+      'GL_RGBA32F',
+      'GL_RGBA8UI',
+      'GL_RGBA8I',
+      'GL_RGB10_A2UI',
+      'GL_RGBA16UI',
+      'GL_RGBA16I',
+      'GL_RGBA32UI',
+      'GL_RGBA32I',
+      'GL_DEPTH_COMPONENT16',
+      'GL_DEPTH_COMPONENT24',
+      'GL_DEPTH_COMPONENT32F',
+      'GL_DEPTH24_STENCIL8',
+      'GL_DEPTH32F_STENCIL8',
+      'GL_COMPRESSED_R11_EAC',
+      'GL_COMPRESSED_SIGNED_R11_EAC',
+      'GL_COMPRESSED_RG11_EAC',
+      'GL_COMPRESSED_SIGNED_RG11_EAC',
+      'GL_COMPRESSED_RGB8_ETC2',
+      'GL_COMPRESSED_SRGB8_ETC2',
+      'GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2',
+      'GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2',
+      'GL_COMPRESSED_RGBA8_ETC2_EAC',
+      'GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC',
+    ],
+    'deprecated_es3': [
+      'GL_ALPHA8_EXT',
+      'GL_LUMINANCE8_EXT',
+      'GL_LUMINANCE8_ALPHA8_EXT',
+      'GL_ALPHA16F_EXT',
+      'GL_LUMINANCE16F_EXT',
+      'GL_LUMINANCE_ALPHA16F_EXT',
+      'GL_ALPHA32F_EXT',
+      'GL_LUMINANCE32F_EXT',
+      'GL_LUMINANCE_ALPHA32F_EXT',
+    ],
   },
   'ImageInternalFormat': {
     'type': 'GLenum',
@@ -7553,6 +7712,10 @@
       self.valid_es3 = info['valid_es3']
     else:
       self.valid_es3 = []
+    if 'deprecated_es3' in info:
+      self.deprecated_es3 = info['deprecated_es3']
+    else:
+      self.deprecated_es3 = []
 
   def GetType(self):
     return self.info['type']
@@ -7566,6 +7729,9 @@
   def GetValidValuesES3(self):
     return self.valid_es3
 
+  def GetDeprecatedValuesES3(self):
+    return self.deprecated_es3
+
   def IsConstant(self):
     if not 'is_complete' in self.info:
       return False
@@ -9872,6 +10038,13 @@
           file.Write("  %s,\n" % value)
         file.Write("};\n")
         file.Write("\n")
+      if named_type.GetDeprecatedValuesES3():
+        file.Write("static const %s deprecated_%s_table_es3[] = {\n" %
+                   (named_type.GetType(), ToUnderscore(name)))
+        for value in named_type.GetDeprecatedValuesES3():
+          file.Write("  %s,\n" % value)
+        file.Write("};\n")
+        file.Write("\n")
     file.Write("Validators::Validators()")
     pre = '    : '
     for count, name in enumerate(names):
@@ -9891,9 +10064,16 @@
     file.Write(" {\n");
     file.Write("}\n\n");
 
-    file.Write("void Validators::AddES3Values() {\n")
+    file.Write("void Validators::UpdateValuesES3() {\n")
     for name in names:
       named_type = NamedType(_NAMED_TYPE_INFO[name])
+      if named_type.GetDeprecatedValuesES3():
+        code = """  %(name)s.RemoveValues(
+      deprecated_%(name)s_table_es3, arraysize(deprecated_%(name)s_table_es3));
+"""
+        file.Write(code % {
+          'name': ToUnderscore(name),
+        })
       if named_type.GetValidValuesES3():
         code = """  %(name)s.AddValues(
       valid_%(name)s_table_es3, arraysize(valid_%(name)s_table_es3));
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn
index 23d5a8c..d86edd4 100644
--- a/gpu/command_buffer/client/BUILD.gn
+++ b/gpu/command_buffer/client/BUILD.gn
@@ -17,10 +17,11 @@
     "transfer_buffer.h",
   ]
 
-  defines = [ "GPU_IMPLEMENTATION" ]
-
-  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+  configs += [
+    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+    "//build/config/compiler:no_size_t_to_int_warning",
+    "//gpu:gpu_implementation",
+  ]
 
   all_dependent_configs = [ "//third_party/khronos:khronos_headers" ]
 
@@ -52,10 +53,11 @@
     "gles2_cmd_helper_autogen.h",
   ]
 
-  defines = [ "GPU_IMPLEMENTATION" ]
-
-  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+  configs += [
+    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+    "//build/config/compiler:no_size_t_to_int_warning",
+    "//gpu:gpu_implementation",
+  ]
 
   deps = [
     ":client",
@@ -116,6 +118,7 @@
     "gpu_memory_buffer_manager.cc",
     "gpu_memory_buffer_manager.h",
   ]
+  configs += [ "//gpu:gpu_implementation" ]
   deps = [
     "//ui/gfx",
   ]
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index 1dd35fd..87eed68 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -133,7 +133,7 @@
 GL_APICALL void         GL_APIENTRY glPixelStorei (GLenumPixelStore pname, GLintPixelStoreAlignment param);
 GL_APICALL void         GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
 GL_APICALL void         GL_APIENTRY glReadBuffer (GLenum src);
-GL_APICALL void         GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenumReadPixelFormat format, GLenumPixelType type, void* pixels);
+GL_APICALL void         GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenumReadPixelFormat format, GLenumReadPixelType type, void* pixels);
 GL_APICALL void         GL_APIENTRY glReleaseShaderCompiler (void);
 GL_APICALL void         GL_APIENTRY glRenderbufferStorage (GLenumRenderBufferTarget target, GLenumRenderBufferFormat internalformat, GLsizei width, GLsizei height);
 GL_APICALL void         GL_APIENTRY glResumeTransformFeedback (void);
diff --git a/gpu/command_buffer/common/BUILD.gn b/gpu/command_buffer/common/BUILD.gn
index 68c3c84..57935ac 100644
--- a/gpu/command_buffer/common/BUILD.gn
+++ b/gpu/command_buffer/common/BUILD.gn
@@ -32,7 +32,7 @@
     "value_state.h",
   ]
 
-  defines = [ "GPU_IMPLEMENTATION" ]
+  configs += [ "//gpu:gpu_implementation" ]
 
   deps = [
     ":gles2_utils",
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index 14d6a21..22f826f 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -711,6 +711,16 @@
     case GL_RGB16F_EXT:
     case GL_RGB32F_EXT:
     case GL_SRGB_EXT:
+    case GL_SRGB8:
+    case GL_RGB8_SNORM:
+    case GL_R11F_G11F_B10F:
+    case GL_RGB9_E5:
+    case GL_RGB8UI:
+    case GL_RGB8I:
+    case GL_RGB16UI:
+    case GL_RGB16I:
+    case GL_RGB32UI:
+    case GL_RGB32I:
       return kRGB;
     case GL_BGRA_EXT:
     case GL_BGRA8_EXT:
@@ -722,20 +732,51 @@
     case GL_RGB5_A1:
     case GL_SRGB_ALPHA_EXT:
     case GL_SRGB8_ALPHA8_EXT:
+    case GL_RGBA8_SNORM:
+    case GL_RGB10_A2:
+    case GL_RGBA8UI:
+    case GL_RGBA8I:
+    case GL_RGB10_A2UI:
+    case GL_RGBA16UI:
+    case GL_RGBA16I:
+    case GL_RGBA32UI:
+    case GL_RGBA32I:
       return kRGBA;
     case GL_DEPTH_COMPONENT32_OES:
     case GL_DEPTH_COMPONENT24_OES:
     case GL_DEPTH_COMPONENT16:
     case GL_DEPTH_COMPONENT:
+    case GL_DEPTH_COMPONENT32F:
       return kDepth;
     case GL_STENCIL_INDEX8:
       return kStencil;
     case GL_DEPTH_STENCIL_OES:
     case GL_DEPTH24_STENCIL8_OES:
+    case GL_DEPTH32F_STENCIL8:
       return kDepth | kStencil;
     case GL_RED_EXT:
+    case GL_R8:
+    case GL_R8_SNORM:
+    case GL_R16F:
+    case GL_R32F:
+    case GL_R8UI:
+    case GL_R8I:
+    case GL_R16UI:
+    case GL_R16I:
+    case GL_R32UI:
+    case GL_R32I:
       return kRed;
     case GL_RG_EXT:
+    case GL_RG8:
+    case GL_RG8_SNORM:
+    case GL_RG16F:
+    case GL_RG32F:
+    case GL_RG8UI:
+    case GL_RG8I:
+    case GL_RG16UI:
+    case GL_RG16I:
+    case GL_RG32UI:
+    case GL_RG32I:
       return kRed | kGreen;
     default:
       return 0x0000;
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
index 52511ed..fade8fa 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -4887,6 +4887,18 @@
       {GL_UNSIGNED_SHORT_5_6_5, "GL_UNSIGNED_SHORT_5_6_5"},
       {GL_UNSIGNED_SHORT_4_4_4_4, "GL_UNSIGNED_SHORT_4_4_4_4"},
       {GL_UNSIGNED_SHORT_5_5_5_1, "GL_UNSIGNED_SHORT_5_5_5_1"},
+      {GL_BYTE, "GL_BYTE"},
+      {GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT"},
+      {GL_SHORT, "GL_SHORT"},
+      {GL_UNSIGNED_INT, "GL_UNSIGNED_INT"},
+      {GL_INT, "GL_INT"},
+      {GL_HALF_FLOAT, "GL_HALF_FLOAT"},
+      {GL_FLOAT, "GL_FLOAT"},
+      {GL_UNSIGNED_INT_2_10_10_10_REV, "GL_UNSIGNED_INT_2_10_10_10_REV"},
+      {GL_UNSIGNED_INT_10F_11F_11F_REV, "GL_UNSIGNED_INT_10F_11F_11F_REV"},
+      {GL_UNSIGNED_INT_5_9_9_9_REV, "GL_UNSIGNED_INT_5_9_9_9_REV"},
+      {GL_UNSIGNED_INT_24_8, "GL_UNSIGNED_INT_24_8"},
+      {GL_FLOAT_32_UNSIGNED_INT_24_8_REV, "GL_FLOAT_32_UNSIGNED_INT_24_8_REV"},
   };
   return GLES2Util::GetQualifiedEnumString(string_table,
                                            arraysize(string_table), value);
@@ -5152,6 +5164,8 @@
   static const EnumToString string_table[] = {
       {GL_TEXTURE_2D, "GL_TEXTURE_2D"},
       {GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP"},
+      {GL_TEXTURE_3D, "GL_TEXTURE_3D"},
+      {GL_TEXTURE_2D_ARRAY, "GL_TEXTURE_2D_ARRAY"},
   };
   return GLES2Util::GetQualifiedEnumString(string_table,
                                            arraysize(string_table), value);
@@ -5164,6 +5178,14 @@
       {GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA"},
       {GL_RGB, "GL_RGB"},
       {GL_RGBA, "GL_RGBA"},
+      {GL_RED, "GL_RED"},
+      {GL_RED_INTEGER, "GL_RED_INTEGER"},
+      {GL_RG, "GL_RG"},
+      {GL_RG_INTEGER, "GL_RG_INTEGER"},
+      {GL_RGB_INTEGER, "GL_RGB_INTEGER"},
+      {GL_RGBA_INTEGER, "GL_RGBA_INTEGER"},
+      {GL_DEPTH_COMPONENT, "GL_DEPTH_COMPONENT"},
+      {GL_DEPTH_STENCIL, "GL_DEPTH_STENCIL"},
   };
   return GLES2Util::GetQualifiedEnumString(string_table,
                                            arraysize(string_table), value);
@@ -5176,6 +5198,60 @@
       {GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA"},
       {GL_RGB, "GL_RGB"},
       {GL_RGBA, "GL_RGBA"},
+      {GL_R8, "GL_R8"},
+      {GL_R8_SNORM, "GL_R8_SNORM"},
+      {GL_R16F, "GL_R16F"},
+      {GL_R32F, "GL_R32F"},
+      {GL_R8UI, "GL_R8UI"},
+      {GL_R8I, "GL_R8I"},
+      {GL_R16UI, "GL_R16UI"},
+      {GL_R16I, "GL_R16I"},
+      {GL_R32UI, "GL_R32UI"},
+      {GL_R32I, "GL_R32I"},
+      {GL_RG8, "GL_RG8"},
+      {GL_RG8_SNORM, "GL_RG8_SNORM"},
+      {GL_RG16F, "GL_RG16F"},
+      {GL_RG32F, "GL_RG32F"},
+      {GL_RG8UI, "GL_RG8UI"},
+      {GL_RG8I, "GL_RG8I"},
+      {GL_RG16UI, "GL_RG16UI"},
+      {GL_RG16I, "GL_RG16I"},
+      {GL_RG32UI, "GL_RG32UI"},
+      {GL_RG32I, "GL_RG32I"},
+      {GL_RGB8, "GL_RGB8"},
+      {GL_SRGB8, "GL_SRGB8"},
+      {GL_RGB565, "GL_RGB565"},
+      {GL_RGB8_SNORM, "GL_RGB8_SNORM"},
+      {GL_R11F_G11F_B10F, "GL_R11F_G11F_B10F"},
+      {GL_RGB9_E5, "GL_RGB9_E5"},
+      {GL_RGB16F, "GL_RGB16F"},
+      {GL_RGB32F, "GL_RGB32F"},
+      {GL_RGB8UI, "GL_RGB8UI"},
+      {GL_RGB8I, "GL_RGB8I"},
+      {GL_RGB16UI, "GL_RGB16UI"},
+      {GL_RGB16I, "GL_RGB16I"},
+      {GL_RGB32UI, "GL_RGB32UI"},
+      {GL_RGB32I, "GL_RGB32I"},
+      {GL_RGBA8, "GL_RGBA8"},
+      {GL_SRGB8_ALPHA8, "GL_SRGB8_ALPHA8"},
+      {GL_RGBA8_SNORM, "GL_RGBA8_SNORM"},
+      {GL_RGB5_A1, "GL_RGB5_A1"},
+      {GL_RGBA4, "GL_RGBA4"},
+      {GL_RGB10_A2, "GL_RGB10_A2"},
+      {GL_RGBA16F, "GL_RGBA16F"},
+      {GL_RGBA32F, "GL_RGBA32F"},
+      {GL_RGBA8UI, "GL_RGBA8UI"},
+      {GL_RGBA8I, "GL_RGBA8I"},
+      {GL_RGB10_A2UI, "GL_RGB10_A2UI"},
+      {GL_RGBA16UI, "GL_RGBA16UI"},
+      {GL_RGBA16I, "GL_RGBA16I"},
+      {GL_RGBA32UI, "GL_RGBA32UI"},
+      {GL_RGBA32I, "GL_RGBA32I"},
+      {GL_DEPTH_COMPONENT16, "GL_DEPTH_COMPONENT16"},
+      {GL_DEPTH_COMPONENT24, "GL_DEPTH_COMPONENT24"},
+      {GL_DEPTH_COMPONENT32F, "GL_DEPTH_COMPONENT32F"},
+      {GL_DEPTH24_STENCIL8, "GL_DEPTH24_STENCIL8"},
+      {GL_DEPTH32F_STENCIL8, "GL_DEPTH32F_STENCIL8"},
   };
   return GLES2Util::GetQualifiedEnumString(string_table,
                                            arraysize(string_table), value);
@@ -5191,6 +5267,68 @@
       {GL_LUMINANCE8_ALPHA8_EXT, "GL_LUMINANCE8_ALPHA8_EXT"},
       {GL_RGB8_OES, "GL_RGB8_OES"},
       {GL_RGBA8_OES, "GL_RGBA8_OES"},
+      {GL_R8, "GL_R8"},
+      {GL_R8_SNORM, "GL_R8_SNORM"},
+      {GL_R16F, "GL_R16F"},
+      {GL_R32F, "GL_R32F"},
+      {GL_R8UI, "GL_R8UI"},
+      {GL_R8I, "GL_R8I"},
+      {GL_R16UI, "GL_R16UI"},
+      {GL_R16I, "GL_R16I"},
+      {GL_R32UI, "GL_R32UI"},
+      {GL_R32I, "GL_R32I"},
+      {GL_RG8, "GL_RG8"},
+      {GL_RG8_SNORM, "GL_RG8_SNORM"},
+      {GL_RG16F, "GL_RG16F"},
+      {GL_RG32F, "GL_RG32F"},
+      {GL_RG8UI, "GL_RG8UI"},
+      {GL_RG8I, "GL_RG8I"},
+      {GL_RG16UI, "GL_RG16UI"},
+      {GL_RG16I, "GL_RG16I"},
+      {GL_RG32UI, "GL_RG32UI"},
+      {GL_RG32I, "GL_RG32I"},
+      {GL_SRGB8, "GL_SRGB8"},
+      {GL_RGB8_SNORM, "GL_RGB8_SNORM"},
+      {GL_R11F_G11F_B10F, "GL_R11F_G11F_B10F"},
+      {GL_RGB9_E5, "GL_RGB9_E5"},
+      {GL_RGB16F, "GL_RGB16F"},
+      {GL_RGB32F, "GL_RGB32F"},
+      {GL_RGB8UI, "GL_RGB8UI"},
+      {GL_RGB8I, "GL_RGB8I"},
+      {GL_RGB16UI, "GL_RGB16UI"},
+      {GL_RGB16I, "GL_RGB16I"},
+      {GL_RGB32UI, "GL_RGB32UI"},
+      {GL_RGB32I, "GL_RGB32I"},
+      {GL_SRGB8_ALPHA8, "GL_SRGB8_ALPHA8"},
+      {GL_RGBA8_SNORM, "GL_RGBA8_SNORM"},
+      {GL_RGB10_A2, "GL_RGB10_A2"},
+      {GL_RGBA16F, "GL_RGBA16F"},
+      {GL_RGBA32F, "GL_RGBA32F"},
+      {GL_RGBA8UI, "GL_RGBA8UI"},
+      {GL_RGBA8I, "GL_RGBA8I"},
+      {GL_RGB10_A2UI, "GL_RGB10_A2UI"},
+      {GL_RGBA16UI, "GL_RGBA16UI"},
+      {GL_RGBA16I, "GL_RGBA16I"},
+      {GL_RGBA32UI, "GL_RGBA32UI"},
+      {GL_RGBA32I, "GL_RGBA32I"},
+      {GL_DEPTH_COMPONENT16, "GL_DEPTH_COMPONENT16"},
+      {GL_DEPTH_COMPONENT24, "GL_DEPTH_COMPONENT24"},
+      {GL_DEPTH_COMPONENT32F, "GL_DEPTH_COMPONENT32F"},
+      {GL_DEPTH24_STENCIL8, "GL_DEPTH24_STENCIL8"},
+      {GL_DEPTH32F_STENCIL8, "GL_DEPTH32F_STENCIL8"},
+      {GL_COMPRESSED_R11_EAC, "GL_COMPRESSED_R11_EAC"},
+      {GL_COMPRESSED_SIGNED_R11_EAC, "GL_COMPRESSED_SIGNED_R11_EAC"},
+      {GL_COMPRESSED_RG11_EAC, "GL_COMPRESSED_RG11_EAC"},
+      {GL_COMPRESSED_SIGNED_RG11_EAC, "GL_COMPRESSED_SIGNED_RG11_EAC"},
+      {GL_COMPRESSED_RGB8_ETC2, "GL_COMPRESSED_RGB8_ETC2"},
+      {GL_COMPRESSED_SRGB8_ETC2, "GL_COMPRESSED_SRGB8_ETC2"},
+      {GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+       "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"},
+      {GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+       "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"},
+      {GL_COMPRESSED_RGBA8_ETC2_EAC, "GL_COMPRESSED_RGBA8_ETC2_EAC"},
+      {GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
+       "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"},
   };
   return GLES2Util::GetQualifiedEnumString(string_table,
                                            arraysize(string_table), value);
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index ee92509..44b0909 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -119,9 +119,10 @@
     "vertex_attrib_manager.h",
   ]
 
-  defines = [ "GPU_IMPLEMENTATION" ]
-
-  configs += [ "//third_party/khronos:khronos_headers" ]
+  configs += [
+    "//gpu:gpu_implementation",
+    "//third_party/khronos:khronos_headers",
+  ]
 
   # Prefer mesa GL headers to system headers, which cause problems on Win.
   include_dirs = [ "//third_party/mesa/src/include" ]
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 2452954..6675ba7 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -1070,7 +1070,7 @@
 
 void FeatureInfo::EnableES3Validators() {
   DCHECK(IsES3Capable());
-  validators_.AddES3Values();
+  validators_.UpdateValuesES3();
 }
 
 void FeatureInfo::AddExtensionString(const char* s) {
diff --git a/gpu/command_buffer/service/gl_context_virtual.cc b/gpu/command_buffer/service/gl_context_virtual.cc
index 7747407..0857a52 100644
--- a/gpu/command_buffer/service/gl_context_virtual.cc
+++ b/gpu/command_buffer/service/gl_context_virtual.cc
@@ -6,6 +6,7 @@
 
 #include "gpu/command_buffer/service/gl_state_restorer_impl.h"
 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+#include "ui/gl/gl_gl_api_implementation.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gpu_timing.h"
 
@@ -114,6 +115,21 @@
   shared_context_->SetUnbindFboOnMakeCurrent();
 }
 
+base::Closure GLContextVirtual::GetStateWasDirtiedExternallyCallback() {
+  return shared_context_->GetStateWasDirtiedExternallyCallback();
+}
+
+void GLContextVirtual::RestoreStateIfDirtiedExternally() {
+  // The dirty bit should only be cleared after the state has been restored,
+  // which should be done only when the context is current.
+  DCHECK(IsCurrent(NULL));
+  if (!shared_context_->GetStateWasDirtiedExternally())
+    return;
+  gfx::ScopedSetGLToRealGLApi scoped_set_gl_api;
+  GetGLStateRestorer()->RestoreState(NULL);
+  shared_context_->SetStateWasDirtiedExternally(false);
+}
+
 GLContextVirtual::~GLContextVirtual() {
   Destroy();
 }
diff --git a/gpu/command_buffer/service/gl_context_virtual.h b/gpu/command_buffer/service/gl_context_virtual.h
index 42c6d42..d8cf77f 100644
--- a/gpu/command_buffer/service/gl_context_virtual.h
+++ b/gpu/command_buffer/service/gl_context_virtual.h
@@ -48,6 +48,8 @@
   void SetSafeToForceGpuSwitch() override;
   bool WasAllocatedUsingRobustnessExtension() override;
   void SetUnbindFboOnMakeCurrent() override;
+  base::Closure GetStateWasDirtiedExternallyCallback() override;
+  void RestoreStateIfDirtiedExternally() override;
 
  protected:
   ~GLContextVirtual() override;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 3e568e3..319e37d 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -7116,6 +7116,7 @@
   if (!program) {
     return;
   }
+  program->TransformFeedbackVaryings(count, varyings, buffer_mode);
   glTransformFeedbackVaryings(
       program->service_id(), count, varyings, buffer_mode);
 }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index e07a8ee..cae6c00 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -443,10 +443,10 @@
   GenHelper<GenQueriesEXTImmediate>(kNewClientId);
 
   // Test valid parameters work.
-  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
+  EXPECT_CALL(*gl_, GenQueries(1, _))
       .WillOnce(SetArgumentPointee<1>(kNewServiceId))
       .RetiresOnSaturation();
-  EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
+  EXPECT_CALL(*gl_, BeginQuery(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
       .Times(1)
       .RetiresOnSaturation();
 
@@ -486,7 +486,7 @@
   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
 
   // Test end succeeds
-  EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
+  EXPECT_CALL(*gl_, EndQuery(GL_ANY_SAMPLES_PASSED_EXT))
       .Times(1)
       .RetiresOnSaturation();
   end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
@@ -494,7 +494,7 @@
   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   EXPECT_TRUE(query->pending());
 
-  EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
+  EXPECT_CALL(*gl_, DeleteQueries(1, _)).Times(1).RetiresOnSaturation();
 }
 
 struct QueryType {
@@ -534,10 +534,10 @@
   test->GenHelper<GenQueriesEXTImmediate>(client_id);
 
   if (query_type.is_gl) {
-    EXPECT_CALL(*gl, GenQueriesARB(1, _))
+    EXPECT_CALL(*gl, GenQueries(1, _))
         .WillOnce(SetArgumentPointee<1>(service_id))
         .RetiresOnSaturation();
-    EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id))
+    EXPECT_CALL(*gl, BeginQuery(query_type.type, service_id))
         .Times(1)
         .RetiresOnSaturation();
   }
@@ -547,7 +547,7 @@
   error::Error error1 = test->ExecuteCmd(begin_cmd);
 
   if (query_type.is_gl) {
-    EXPECT_CALL(*gl, EndQueryARB(query_type.type))
+    EXPECT_CALL(*gl, EndQuery(query_type.type))
         .Times(1)
         .RetiresOnSaturation();
   }
@@ -575,10 +575,10 @@
 
   if (query_type.is_gl) {
     EXPECT_CALL(
-        *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+        *gl, GetQueryObjectuiv(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
         .WillOnce(SetArgumentPointee<2>(1))
         .RetiresOnSaturation();
-    EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _))
+    EXPECT_CALL(*gl, GetQueryObjectuiv(service_id, GL_QUERY_RESULT_EXT, _))
         .WillOnce(SetArgumentPointee<2>(1))
         .RetiresOnSaturation();
   }
@@ -601,7 +601,7 @@
               !process_success);
 
   if (query_type.is_gl) {
-    EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
+    EXPECT_CALL(*gl, DeleteQueries(1, _)).Times(1).RetiresOnSaturation();
   }
   if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
 #if DCHECK_IS_ON()
diff --git a/gpu/command_buffer/service/gles2_cmd_validation.h b/gpu/command_buffer/service/gles2_cmd_validation.h
index 8ca9861..f4059ed 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation.h
@@ -37,6 +37,17 @@
     }
   }
 
+  void RemoveValues(const T* invalid_values, int num_values) {
+    for (int ii = 0; ii < num_values; ++ii) {
+      auto iter = std::find(
+          valid_values_.begin(), valid_values_.end(), invalid_values[ii]);
+      if (iter != valid_values_.end()) {
+        valid_values_.erase(iter);
+        DCHECK(!IsValid(invalid_values[ii]));
+      }
+    }
+  }
+
   bool IsValid(const T value) const {
     return std::find(valid_values_.begin(), valid_values_.end(), value) !=
            valid_values_.end();
@@ -53,7 +64,7 @@
 struct Validators {
   Validators();
 
-  void AddES3Values();
+  void UpdateValuesES3();
 
 #include "gpu/command_buffer/service/gles2_cmd_validation_autogen.h"
 };
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
index 2f83240..ee63b3a 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -325,6 +325,21 @@
     GL_UNSIGNED_SHORT_5_5_5_1,
 };
 
+static const GLenum valid_pixel_type_table_es3[] = {
+    GL_BYTE,
+    GL_UNSIGNED_SHORT,
+    GL_SHORT,
+    GL_UNSIGNED_INT,
+    GL_INT,
+    GL_HALF_FLOAT,
+    GL_FLOAT,
+    GL_UNSIGNED_INT_2_10_10_10_REV,
+    GL_UNSIGNED_INT_10F_11F_11F_REV,
+    GL_UNSIGNED_INT_5_9_9_9_REV,
+    GL_UNSIGNED_INT_24_8,
+    GL_FLOAT_32_UNSIGNED_INT_24_8_REV,
+};
+
 static const GLenum valid_program_parameter_table[] = {
     GL_DELETE_STATUS,
     GL_LINK_STATUS,
@@ -497,6 +512,11 @@
     GL_TEXTURE_CUBE_MAP,
 };
 
+static const GLenum valid_texture_bind_target_table_es3[] = {
+    GL_TEXTURE_3D,
+    GL_TEXTURE_2D_ARRAY,
+};
+
 static const GLenum valid_texture_format_table[] = {
     GL_ALPHA,
     GL_LUMINANCE,
@@ -505,6 +525,17 @@
     GL_RGBA,
 };
 
+static const GLenum valid_texture_format_table_es3[] = {
+    GL_RED,
+    GL_RED_INTEGER,
+    GL_RG,
+    GL_RG_INTEGER,
+    GL_RGB_INTEGER,
+    GL_RGBA_INTEGER,
+    GL_DEPTH_COMPONENT,
+    GL_DEPTH_STENCIL,
+};
+
 static const GLenum valid_texture_internal_format_table[] = {
     GL_ALPHA,
     GL_LUMINANCE,
@@ -513,6 +544,63 @@
     GL_RGBA,
 };
 
+static const GLenum valid_texture_internal_format_table_es3[] = {
+    GL_R8,
+    GL_R8_SNORM,
+    GL_R16F,
+    GL_R32F,
+    GL_R8UI,
+    GL_R8I,
+    GL_R16UI,
+    GL_R16I,
+    GL_R32UI,
+    GL_R32I,
+    GL_RG8,
+    GL_RG8_SNORM,
+    GL_RG16F,
+    GL_RG32F,
+    GL_RG8UI,
+    GL_RG8I,
+    GL_RG16UI,
+    GL_RG16I,
+    GL_RG32UI,
+    GL_RG32I,
+    GL_RGB8,
+    GL_SRGB8,
+    GL_RGB565,
+    GL_RGB8_SNORM,
+    GL_R11F_G11F_B10F,
+    GL_RGB9_E5,
+    GL_RGB16F,
+    GL_RGB32F,
+    GL_RGB8UI,
+    GL_RGB8I,
+    GL_RGB16UI,
+    GL_RGB16I,
+    GL_RGB32UI,
+    GL_RGB32I,
+    GL_RGBA8,
+    GL_SRGB8_ALPHA8,
+    GL_RGBA8_SNORM,
+    GL_RGB5_A1,
+    GL_RGBA4,
+    GL_RGB10_A2,
+    GL_RGBA16F,
+    GL_RGBA32F,
+    GL_RGBA8UI,
+    GL_RGBA8I,
+    GL_RGB10_A2UI,
+    GL_RGBA16UI,
+    GL_RGBA16I,
+    GL_RGBA32UI,
+    GL_RGBA32I,
+    GL_DEPTH_COMPONENT16,
+    GL_DEPTH_COMPONENT24,
+    GL_DEPTH_COMPONENT32F,
+    GL_DEPTH24_STENCIL8,
+    GL_DEPTH32F_STENCIL8,
+};
+
 static const GLenum valid_texture_internal_format_storage_table[] = {
     GL_RGB565,
     GL_RGBA4,
@@ -524,6 +612,80 @@
     GL_RGBA8_OES,
 };
 
+static const GLenum valid_texture_internal_format_storage_table_es3[] = {
+    GL_R8,
+    GL_R8_SNORM,
+    GL_R16F,
+    GL_R32F,
+    GL_R8UI,
+    GL_R8I,
+    GL_R16UI,
+    GL_R16I,
+    GL_R32UI,
+    GL_R32I,
+    GL_RG8,
+    GL_RG8_SNORM,
+    GL_RG16F,
+    GL_RG32F,
+    GL_RG8UI,
+    GL_RG8I,
+    GL_RG16UI,
+    GL_RG16I,
+    GL_RG32UI,
+    GL_RG32I,
+    GL_SRGB8,
+    GL_RGB8_SNORM,
+    GL_R11F_G11F_B10F,
+    GL_RGB9_E5,
+    GL_RGB16F,
+    GL_RGB32F,
+    GL_RGB8UI,
+    GL_RGB8I,
+    GL_RGB16UI,
+    GL_RGB16I,
+    GL_RGB32UI,
+    GL_RGB32I,
+    GL_SRGB8_ALPHA8,
+    GL_RGBA8_SNORM,
+    GL_RGB10_A2,
+    GL_RGBA16F,
+    GL_RGBA32F,
+    GL_RGBA8UI,
+    GL_RGBA8I,
+    GL_RGB10_A2UI,
+    GL_RGBA16UI,
+    GL_RGBA16I,
+    GL_RGBA32UI,
+    GL_RGBA32I,
+    GL_DEPTH_COMPONENT16,
+    GL_DEPTH_COMPONENT24,
+    GL_DEPTH_COMPONENT32F,
+    GL_DEPTH24_STENCIL8,
+    GL_DEPTH32F_STENCIL8,
+    GL_COMPRESSED_R11_EAC,
+    GL_COMPRESSED_SIGNED_R11_EAC,
+    GL_COMPRESSED_RG11_EAC,
+    GL_COMPRESSED_SIGNED_RG11_EAC,
+    GL_COMPRESSED_RGB8_ETC2,
+    GL_COMPRESSED_SRGB8_ETC2,
+    GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+    GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+    GL_COMPRESSED_RGBA8_ETC2_EAC,
+    GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
+};
+
+static const GLenum deprecated_texture_internal_format_storage_table_es3[] = {
+    GL_ALPHA8_EXT,
+    GL_LUMINANCE8_EXT,
+    GL_LUMINANCE8_ALPHA8_EXT,
+    GL_ALPHA16F_EXT,
+    GL_LUMINANCE16F_EXT,
+    GL_LUMINANCE_ALPHA16F_EXT,
+    GL_ALPHA32F_EXT,
+    GL_LUMINANCE32F_EXT,
+    GL_LUMINANCE_ALPHA32F_EXT,
+};
+
 static const GLenum valid_texture_mag_filter_mode_table[] = {
     GL_NEAREST,
     GL_LINEAR,
@@ -771,9 +933,24 @@
                      arraysize(valid_vertex_pointer_table)) {
 }
 
-void Validators::AddES3Values() {
+void Validators::UpdateValuesES3() {
   buffer_target.AddValues(valid_buffer_target_table_es3,
                           arraysize(valid_buffer_target_table_es3));
+  pixel_type.AddValues(valid_pixel_type_table_es3,
+                       arraysize(valid_pixel_type_table_es3));
+  texture_bind_target.AddValues(valid_texture_bind_target_table_es3,
+                                arraysize(valid_texture_bind_target_table_es3));
+  texture_format.AddValues(valid_texture_format_table_es3,
+                           arraysize(valid_texture_format_table_es3));
+  texture_internal_format.AddValues(
+      valid_texture_internal_format_table_es3,
+      arraysize(valid_texture_internal_format_table_es3));
+  texture_internal_format_storage.RemoveValues(
+      deprecated_texture_internal_format_storage_table_es3,
+      arraysize(deprecated_texture_internal_format_storage_table_es3));
+  texture_internal_format_storage.AddValues(
+      valid_texture_internal_format_storage_table_es3,
+      arraysize(valid_texture_internal_format_storage_table_es3));
 }
 
 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
index 48a4db9..8aed1c6 100644
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
@@ -61,21 +61,21 @@
   void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; }
   void SetDisjoint() { disjointed_ = true; }
 
-  void GenQueriesARB(GLsizei n, GLuint* ids) {
+  void GenQueries(GLsizei n, GLuint* ids) {
     for (GLsizei i = 0; i < n; i++) {
       ids[i] = next_query_id_++;
       alloced_queries_.insert(ids[i]);
     }
   }
 
-  void DeleteQueriesARB(GLsizei n, const GLuint* ids) {
+  void DeleteQueries(GLsizei n, const GLuint* ids) {
     for (GLsizei i = 0; i < n; i++) {
       alloced_queries_.erase(ids[i]);
       query_timestamp_.erase(ids[i]);
     }
   }
 
-  void GetQueryObjectivARB(GLuint id, GLenum pname, GLint* params) {
+  void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) {
     switch (pname) {
       case GL_QUERY_RESULT_AVAILABLE: {
         std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id);
@@ -86,7 +86,7 @@
         break;
       }
       default:
-        FAIL() << "Invalid variable passed to GetQueryObjectivARB: " << pname;
+        FAIL() << "Invalid variable passed to GetQueryObjectiv: " << pname;
     }
   }
 
@@ -237,14 +237,14 @@
     if (gpu_timing_client_->IsAvailable() &&
         gpu_timing_client_->IsTimerOffsetAvailable()) {
       // Delegate query APIs used by GPUTrace to a GlFakeQueries
-      EXPECT_CALL(*gl_, GenQueriesARB(2, NotNull())).Times(AtLeast(1))
+      EXPECT_CALL(*gl_, GenQueries(2, NotNull())).Times(AtLeast(1))
           .WillRepeatedly(
-              Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueriesARB));
+              Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueries));
 
-      EXPECT_CALL(*gl_, GetQueryObjectivARB(_, GL_QUERY_RESULT_AVAILABLE,
+      EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE,
                                             NotNull()))
           .WillRepeatedly(
-              Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectivARB));
+              Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv));
 
       EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, _))
           .WillRepeatedly(
@@ -259,9 +259,9 @@
                Invoke(&gl_fake_queries_,
                       &GlFakeQueries::GetQueryObjectui64v));
 
-      EXPECT_CALL(*gl_, DeleteQueriesARB(2, NotNull())).Times(AtLeast(1))
+      EXPECT_CALL(*gl_, DeleteQueries(2, NotNull())).Times(AtLeast(1))
           .WillRepeatedly(
-               Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueriesARB));
+               Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueries));
     }
   }
 
diff --git a/gpu/command_buffer/service/memory_program_cache.cc b/gpu/command_buffer/service/memory_program_cache.cc
index 16509e5..cf3b0ca 100644
--- a/gpu/command_buffer/service/memory_program_cache.cc
+++ b/gpu/command_buffer/service/memory_program_cache.cc
@@ -174,6 +174,8 @@
     Shader* shader_a,
     Shader* shader_b,
     const LocationMap* bind_attrib_location_map,
+    const std::vector<std::string>& transform_feedback_varyings,
+    GLenum transform_feedback_buffer_mode,
     const ShaderCacheCallback& shader_callback) {
   char a_sha[kHashLength];
   char b_sha[kHashLength];
@@ -188,6 +190,8 @@
   ComputeProgramHash(a_sha,
                      b_sha,
                      bind_attrib_location_map,
+                     transform_feedback_varyings,
+                     transform_feedback_buffer_mode,
                      sha);
   const std::string sha_string(sha, kHashLength);
 
@@ -234,6 +238,8 @@
     const Shader* shader_a,
     const Shader* shader_b,
     const LocationMap* bind_attrib_location_map,
+    const std::vector<std::string>& transform_feedback_varyings,
+    GLenum transform_feedback_buffer_mode,
     const ShaderCacheCallback& shader_callback) {
   GLenum format;
   GLsizei length = 0;
@@ -262,6 +268,8 @@
   ComputeProgramHash(a_sha,
                      b_sha,
                      bind_attrib_location_map,
+                     transform_feedback_varyings,
+                     transform_feedback_buffer_mode,
                      sha);
   const std::string sha_string(sha, sizeof(sha));
 
diff --git a/gpu/command_buffer/service/memory_program_cache.h b/gpu/command_buffer/service/memory_program_cache.h
index b5862d2..593625d 100644
--- a/gpu/command_buffer/service/memory_program_cache.h
+++ b/gpu/command_buffer/service/memory_program_cache.h
@@ -30,12 +30,17 @@
       Shader* shader_a,
       Shader* shader_b,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       const ShaderCacheCallback& shader_callback) override;
-  void SaveLinkedProgram(GLuint program,
-                         const Shader* shader_a,
-                         const Shader* shader_b,
-                         const LocationMap* bind_attrib_location_map,
-                         const ShaderCacheCallback& shader_callback) override;
+  void SaveLinkedProgram(
+      GLuint program,
+      const Shader* shader_a,
+      const Shader* shader_b,
+      const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
+      const ShaderCacheCallback& shader_callback) override;
 
   void LoadProgram(const std::string& program) override;
 
diff --git a/gpu/command_buffer/service/memory_program_cache_unittest.cc b/gpu/command_buffer/service/memory_program_cache_unittest.cc
index 795b0af..8dba185 100644
--- a/gpu/command_buffer/service/memory_program_cache_unittest.cc
+++ b/gpu/command_buffer/service/memory_program_cache_unittest.cc
@@ -177,6 +177,7 @@
   Shader* fragment_shader_;
   int32 shader_cache_count_;
   std::string shader_cache_shader_;
+  std::vector<std::string> varyings_;
 };
 
 TEST_F(MemoryProgramCacheTest, CacheSave) {
@@ -191,14 +192,14 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
   EXPECT_EQ(1, shader_cache_count());
 }
 
@@ -214,14 +215,14 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
   EXPECT_EQ(1, shader_cache_count());
 
   cache_->Clear();
@@ -230,7 +231,7 @@
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
 }
 
 TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) {
@@ -245,7 +246,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
   EXPECT_EQ(1, shader_cache_count());
@@ -271,6 +272,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 
@@ -298,7 +301,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
   EXPECT_EQ(1, shader_cache_count());
@@ -327,6 +330,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 
@@ -354,7 +359,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -364,6 +369,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 }
@@ -380,7 +387,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -392,6 +399,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 
@@ -404,6 +413,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 }
@@ -425,6 +436,8 @@
                             vertex_shader_,
                             fragment_shader_,
                             &binding_map,
+                            varyings_,
+                            GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -434,6 +447,8 @@
       vertex_shader_,
       fragment_shader_,
       &binding_map,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
   EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
@@ -441,6 +456,51 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
+      base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
+                 base::Unretained(this))));
+}
+
+TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentTransformFeedbackVaryings) {
+  const GLenum kFormat = 1;
+  const int kProgramId = 10;
+  const int kBinaryLength = 20;
+  char test_binary[kBinaryLength];
+  for (int i = 0; i < kBinaryLength; ++i) {
+    test_binary[i] = i;
+  }
+  ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary);
+
+  SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
+  varyings_.push_back("test");
+  cache_->SaveLinkedProgram(kProgramId,
+                            vertex_shader_,
+                            fragment_shader_,
+                            NULL,
+                            varyings_,
+                            GL_INTERLEAVED_ATTRIBS,
+                            base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
+                                       base::Unretained(this)));
+
+  EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
+      kProgramId,
+      vertex_shader_,
+      fragment_shader_,
+      NULL,
+      varyings_,
+      GL_SEPARATE_ATTRIBS,
+      base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
+                 base::Unretained(this))));
+
+  varyings_.push_back("different!");
+  EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram(
+      kProgramId,
+      vertex_shader_,
+      fragment_shader_,
+      NULL,
+      varyings_,
+      GL_INTERLEAVED_ATTRIBS,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 }
@@ -458,7 +518,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -484,17 +544,19 @@
                             vertex_shader_,
                             fragment_shader_,
                             NULL,
+                            varyings_,
+                            GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus(
       old_sig,
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
 }
 
 TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) {
@@ -510,14 +572,14 @@
   vertex_shader_->set_source("different!");
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
 }
 
 TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) {
@@ -532,14 +594,14 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus(
       vertex_shader_->last_compiled_signature(),
       fragment_shader_->last_compiled_signature(),
-      NULL));
+      NULL, varyings_, GL_NONE));
 
   SetExpectationsForLoadLinkedProgram(kProgramId, &emulator);
 
@@ -549,6 +611,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 }
@@ -565,7 +629,7 @@
 
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -577,7 +641,7 @@
   ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2);
   SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2);
   cache_->SaveLinkedProgram(kProgramId, vertex_shader_,
-                            fragment_shader_, NULL,
+                            fragment_shader_, NULL, varyings_, GL_NONE,
                             base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                                        base::Unretained(this)));
 
@@ -587,6 +651,8 @@
       vertex_shader_,
       fragment_shader_,
       NULL,
+      varyings_,
+      GL_NONE,
       base::Bind(&MemoryProgramCacheTest::ShaderCacheCb,
                  base::Unretained(this))));
 }
diff --git a/gpu/command_buffer/service/mocks.h b/gpu/command_buffer/service/mocks.h
index d5cff51..9cbc378 100644
--- a/gpu/command_buffer/service/mocks.h
+++ b/gpu/command_buffer/service/mocks.h
@@ -114,18 +114,22 @@
   MockProgramCache();
   virtual ~MockProgramCache();
 
-  MOCK_METHOD5(LoadLinkedProgram, ProgramLoadResult(
+  MOCK_METHOD7(LoadLinkedProgram, ProgramLoadResult(
       GLuint program,
       Shader* shader_a,
       Shader* shader_b,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       const ShaderCacheCallback& callback));
 
-  MOCK_METHOD5(SaveLinkedProgram, void(
+  MOCK_METHOD7(SaveLinkedProgram, void(
       GLuint program,
       const Shader* shader_a,
       const Shader* shader_b,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       const ShaderCacheCallback& callback));
   MOCK_METHOD1(LoadProgram, void(const std::string&));
 
diff --git a/gpu/command_buffer/service/program_cache.cc b/gpu/command_buffer/service/program_cache.cc
index b219086..31802de 100644
--- a/gpu/command_buffer/service/program_cache.cc
+++ b/gpu/command_buffer/service/program_cache.cc
@@ -22,7 +22,9 @@
 ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus(
     const std::string& shader_signature_a,
     const std::string& shader_signature_b,
-    const std::map<std::string, GLint>* bind_attrib_location_map) const {
+    const std::map<std::string, GLint>* bind_attrib_location_map,
+    const std::vector<std::string>& transform_feedback_varyings,
+    GLenum transform_feedback_buffer_mode) const {
   char a_sha[kHashLength];
   char b_sha[kHashLength];
   ComputeShaderHash(shader_signature_a, a_sha);
@@ -32,6 +34,8 @@
   ComputeProgramHash(a_sha,
                      b_sha,
                      bind_attrib_location_map,
+                     transform_feedback_varyings,
+                     transform_feedback_buffer_mode,
                      sha);
   const std::string sha_string(sha, kHashLength);
 
@@ -46,7 +50,9 @@
 void ProgramCache::LinkedProgramCacheSuccess(
     const std::string& shader_signature_a,
     const std::string& shader_signature_b,
-    const LocationMap* bind_attrib_location_map) {
+    const LocationMap* bind_attrib_location_map,
+    const std::vector<std::string>& transform_feedback_varyings,
+    GLenum transform_feedback_buffer_mode) {
   char a_sha[kHashLength];
   char b_sha[kHashLength];
   ComputeShaderHash(shader_signature_a, a_sha);
@@ -55,6 +61,8 @@
   ComputeProgramHash(a_sha,
                      b_sha,
                      bind_attrib_location_map,
+                     transform_feedback_varyings,
+                     transform_feedback_buffer_mode,
                      sha);
   const std::string sha_string(sha, kHashLength);
 
@@ -81,33 +89,43 @@
   if (!map) {
     return 0;
   }
-  std::map<std::string, GLint>::const_iterator it;
   size_t total = 0;
-  for (it = map->begin(); it != map->end(); ++it) {
+  for (auto it = map->begin(); it != map->end(); ++it) {
     total += 4 + it->first.length();
   }
   return total;
 }
+
+size_t CalculateVaryingsSize(const std::vector<std::string>& varyings) {
+  size_t total = 0;
+  for (auto& varying : varyings) {
+    total += 1 + varying.length();
+  }
+  return total;
+}
 }  // anonymous namespace
 
 void ProgramCache::ComputeProgramHash(
     const char* hashed_shader_0,
     const char* hashed_shader_1,
     const std::map<std::string, GLint>* bind_attrib_location_map,
+    const std::vector<std::string>& transform_feedback_varyings,
+    GLenum transform_feedback_buffer_mode,
     char* result) const {
   const size_t shader0_size = kHashLength;
   const size_t shader1_size = kHashLength;
   const size_t map_size = CalculateMapSize(bind_attrib_location_map);
-  const size_t total_size = shader0_size + shader1_size + map_size;
+  const size_t var_size = CalculateVaryingsSize(transform_feedback_varyings);
+  const size_t total_size = shader0_size + shader1_size + map_size + var_size
+      + sizeof(transform_feedback_buffer_mode);
 
   scoped_ptr<unsigned char[]> buffer(new unsigned char[total_size]);
   memcpy(buffer.get(), hashed_shader_0, shader0_size);
   memcpy(&buffer[shader0_size], hashed_shader_1, shader1_size);
+  size_t current_pos = shader0_size + shader1_size;
   if (map_size != 0) {
     // copy our map
-    size_t current_pos = shader0_size + shader1_size;
-    std::map<std::string, GLint>::const_iterator it;
-    for (it = bind_attrib_location_map->begin();
+    for (auto it = bind_attrib_location_map->begin();
          it != bind_attrib_location_map->end();
          ++it) {
       const size_t name_size = it->first.length();
@@ -120,6 +138,18 @@
       buffer[current_pos++] = static_cast<unsigned char>(value);
     }
   }
+
+  if (var_size != 0) {
+    // copy transform feedback varyings
+    for (auto& varying : transform_feedback_varyings) {
+      const size_t name_size = varying.length();
+      memcpy(&buffer.get()[current_pos], varying.c_str(), name_size);
+      current_pos += name_size;
+      buffer[current_pos++] = ' ';
+    }
+  }
+  memcpy(&buffer[current_pos], &transform_feedback_buffer_mode,
+      sizeof(transform_feedback_buffer_mode));
   base::SHA1HashBytes(buffer.get(),
                       total_size, reinterpret_cast<unsigned char*>(result));
 }
diff --git a/gpu/command_buffer/service/program_cache.h b/gpu/command_buffer/service/program_cache.h
index 624c436..44593df 100644
--- a/gpu/command_buffer/service/program_cache.h
+++ b/gpu/command_buffer/service/program_cache.h
@@ -42,7 +42,9 @@
   LinkedProgramStatus GetLinkedProgramStatus(
       const std::string& shader_signature_a,
       const std::string& shader_signature_b,
-      const LocationMap* bind_attrib_location_map) const;
+      const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode) const;
 
   // Loads the linked program from the cache.  If the program is not found or
   // there was an error, PROGRAM_LOAD_FAILURE should be returned.
@@ -51,6 +53,8 @@
       Shader* shader_a,
       Shader* shader_b,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       const ShaderCacheCallback& shader_callback) = 0;
 
   // Saves the program into the cache.  If successful, the implementation should
@@ -60,6 +64,8 @@
       const Shader* shader_a,
       const Shader* shader_b,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       const ShaderCacheCallback& shader_callback) = 0;
 
   virtual void LoadProgram(const std::string& program) = 0;
@@ -69,8 +75,10 @@
 
   // Only for testing
   void LinkedProgramCacheSuccess(const std::string& shader_signature_a,
-                                 const std::string& shader_signature_b,
-                                 const LocationMap* bind_attrib_location_map);
+       const std::string& shader_signature_b,
+       const LocationMap* bind_attrib_location_map,
+       const std::vector<std::string>& transform_feedback_varyings,
+       GLenum transform_feedback_buffer_mode);
 
  protected:
   // called by implementing class after a shader was successfully cached
@@ -86,6 +94,8 @@
       const char* hashed_shader_0,
       const char* hashed_shader_1,
       const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
       char* result) const;
 
   void Evict(const std::string& program_hash);
diff --git a/gpu/command_buffer/service/program_cache_unittest.cc b/gpu/command_buffer/service/program_cache_unittest.cc
index 7a4cbcd..f4949ce 100644
--- a/gpu/command_buffer/service/program_cache_unittest.cc
+++ b/gpu/command_buffer/service/program_cache_unittest.cc
@@ -20,14 +20,19 @@
       Shader* /* shader_a */,
       Shader* /* shader_b */,
       const LocationMap* /* bind_attrib_location_map */,
+      const std::vector<std::string>& /* transform_feedback_varyings */,
+      GLenum /* transform_feedback_buffer_mode */,
       const ShaderCacheCallback& /* callback */) override {
     return PROGRAM_LOAD_SUCCESS;
   }
-  void SaveLinkedProgram(GLuint /* program */,
-                         const Shader* /* shader_a */,
-                         const Shader* /* shader_b */,
-                         const LocationMap* /* bind_attrib_location_map */,
-                         const ShaderCacheCallback& /* callback */) override {}
+  void SaveLinkedProgram(
+      GLuint /* program */,
+      const Shader* /* shader_a */,
+      const Shader* /* shader_b */,
+      const LocationMap* /* bind_attrib_location_map */,
+      const std::vector<std::string>& /* transform_feedback_varyings */,
+      GLenum /* transform_feedback_buffer_mode */,
+      const ShaderCacheCallback& /* callback */) override {}
 
   void LoadProgram(const std::string& /* program */) override {}
 
@@ -35,7 +40,9 @@
 
   void SaySuccessfullyCached(const std::string& shader1,
                              const std::string& shader2,
-                             std::map<std::string, GLint>* attrib_map) {
+                             std::map<std::string, GLint>* attrib_map,
+                             const std::vector<std::string>& varyings,
+                             GLenum buffer_mode) {
     char a_sha[kHashLength];
     char b_sha[kHashLength];
     ComputeShaderHash(shader1, a_sha);
@@ -45,6 +52,8 @@
     ComputeProgramHash(a_sha,
                        b_sha,
                        attrib_map,
+                       varyings,
+                       buffer_mode,
                        sha);
     const std::string shaString(sha, kHashLength);
 
@@ -56,13 +65,18 @@
     ProgramCache::ComputeShaderHash(shader, result);
   }
 
-  void ComputeProgramHash(const char* hashed_shader_0,
-                          const char* hashed_shader_1,
-                          const LocationMap* bind_attrib_location_map,
-                          char* result) const {
+  void ComputeProgramHash(
+      const char* hashed_shader_0,
+      const char* hashed_shader_1,
+      const LocationMap* bind_attrib_location_map,
+      const std::vector<std::string>& transform_feedback_varyings,
+      GLenum transform_feedback_buffer_mode,
+      char* result) const {
     ProgramCache::ComputeProgramHash(hashed_shader_0,
                                      hashed_shader_1,
                                      bind_attrib_location_map,
+                                     transform_feedback_varyings,
+                                     transform_feedback_buffer_mode,
                                      result);
   }
 
@@ -78,6 +92,7 @@
 
  protected:
   scoped_ptr<NoBackendProgramCache> cache_;
+  std::vector<std::string> varyings_;
 };
 
 TEST_F(ProgramCacheTest, LinkStatusSave) {
@@ -88,8 +103,8 @@
     std::string shader_b = shader2;
     EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
               cache_->GetLinkedProgramStatus(
-                  shader_a, shader_b, NULL));
-    cache_->SaySuccessfullyCached(shader_a, shader_b, NULL);
+                  shader_a, shader_b, NULL, varyings_, GL_NONE));
+    cache_->SaySuccessfullyCached(shader_a, shader_b, NULL, varyings_, GL_NONE);
 
     shader_a.clear();
     shader_b.clear();
@@ -97,33 +112,35 @@
   // make sure it was copied
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED,
             cache_->GetLinkedProgramStatus(
-                shader1, shader2, NULL));
+                shader1, shader2, NULL, varyings_, GL_NONE));
 }
 
 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) {
   const std::string shader1 = "abcd1234";
   std::string shader2 = "abcda sda b1~#4 bbbbb1234";
-  cache_->SaySuccessfullyCached(shader1, shader2, NULL);
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_, GL_NONE);
 
   shader2 = "different!";
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
 }
 
 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) {
   std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
-  cache_->SaySuccessfullyCached(shader1, shader2, NULL);
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_, GL_NONE);
 
   shader1 = "different!";
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
 }
 
 TEST_F(ProgramCacheTest, StatusEviction) {
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
-  cache_->SaySuccessfullyCached(shader1, shader2, NULL);
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_, GL_NONE);
   char a_sha[ProgramCache::kHashLength];
   char b_sha[ProgramCache::kHashLength];
   cache_->ComputeShaderHash(shader1, a_sha);
@@ -133,18 +150,21 @@
   cache_->ComputeProgramHash(a_sha,
                              b_sha,
                              NULL,
+                             varyings_,
+                             GL_NONE,
                              sha);
   cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
 }
 
 TEST_F(ProgramCacheTest, EvictionWithReusedShader) {
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
   const std::string shader3 = "asbjbbjj239a";
-  cache_->SaySuccessfullyCached(shader1, shader2, NULL);
-  cache_->SaySuccessfullyCached(shader1, shader3, NULL);
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_, GL_NONE);
+  cache_->SaySuccessfullyCached(shader1, shader3, NULL, varyings_, GL_NONE);
 
   char a_sha[ProgramCache::kHashLength];
   char b_sha[ProgramCache::kHashLength];
@@ -157,36 +177,63 @@
   cache_->ComputeProgramHash(a_sha,
                              b_sha,
                              NULL,
+                             varyings_,
+                             GL_NONE,
                              sha);
   cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
   EXPECT_EQ(ProgramCache::LINK_SUCCEEDED,
-            cache_->GetLinkedProgramStatus(shader1, shader3, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
+            varyings_, GL_NONE));
 
 
   cache_->ComputeProgramHash(a_sha,
                              c_sha,
                              NULL,
+                             varyings_,
+                             GL_NONE,
                              sha);
   cache_->Evict(std::string(sha, ProgramCache::kHashLength));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader3, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
+            varyings_, GL_NONE));
 }
 
 TEST_F(ProgramCacheTest, StatusClear) {
   const std::string shader1 = "abcd1234";
   const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
   const std::string shader3 = "asbjbbjj239a";
-  cache_->SaySuccessfullyCached(shader1, shader2, NULL);
-  cache_->SaySuccessfullyCached(shader1, shader3, NULL);
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_, GL_NONE);
+  cache_->SaySuccessfullyCached(shader1, shader3, NULL, varyings_, GL_NONE);
   cache_->Clear();
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader2, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_NONE));
   EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
-            cache_->GetLinkedProgramStatus(shader1, shader3, NULL));
+            cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
+            varyings_, GL_NONE));
+}
+
+TEST_F(ProgramCacheTest, LinkUnknownOnTransformFeedbackChange) {
+  const std::string shader1 = "abcd1234";
+  std::string shader2 = "abcda sda b1~#4 bbbbb1234";
+  varyings_.push_back("a");
+  cache_->SaySuccessfullyCached(shader1, shader2, NULL, varyings_,
+                                GL_INTERLEAVED_ATTRIBS);
+
+  EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_SEPARATE_ATTRIBS));
+
+  varyings_.push_back("b");
+  EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
+            cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
+            varyings_, GL_INTERLEAVED_ATTRIBS));
 }
 
 }  // namespace gles2
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index aef7e44..9187c88 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -211,7 +211,8 @@
       valid_(false),
       link_status_(false),
       uniforms_cleared_(false),
-      num_uniforms_(0) {
+      num_uniforms_(0),
+      transform_feedback_buffer_mode_(GL_NONE) {
   manager_->StartTracking(this);
 }
 
@@ -532,7 +533,9 @@
     ProgramCache::LinkedProgramStatus status = cache->GetLinkedProgramStatus(
         attached_shaders_[0]->last_compiled_signature(),
         attached_shaders_[1]->last_compiled_signature(),
-        &bind_attrib_location_map_);
+        &bind_attrib_location_map_,
+        transform_feedback_varyings_,
+        transform_feedback_buffer_mode_);
 
     if (status == ProgramCache::LINK_SUCCEEDED) {
       ProgramCache::ProgramLoadResult success =
@@ -540,6 +543,8 @@
                                    attached_shaders_[0].get(),
                                    attached_shaders_[1].get(),
                                    &bind_attrib_location_map_,
+                                   transform_feedback_varyings_,
+                                   transform_feedback_buffer_mode_,
                                    shader_callback);
       link = success != ProgramCache::PROGRAM_LOAD_SUCCESS;
       UMA_HISTOGRAM_BOOLEAN("GPU.ProgramCache.LoadBinarySuccess", !link);
@@ -608,6 +613,8 @@
                                  attached_shaders_[0].get(),
                                  attached_shaders_[1].get(),
                                  &bind_attrib_location_map_,
+                                 transform_feedback_varyings_,
+                                 transform_feedback_buffer_mode_,
                                  shader_callback);
       }
       UMA_HISTOGRAM_CUSTOM_COUNTS(
@@ -1603,6 +1610,16 @@
   return true;
 }
 
+void Program::TransformFeedbackVaryings(GLsizei count,
+                                        const char* const* varyings,
+                                        GLenum buffer_mode) {
+  transform_feedback_varyings_.clear();
+  for (GLsizei i = 0; i < count; ++i) {
+    transform_feedback_varyings_.push_back(std::string(varyings[i]));
+  }
+  transform_feedback_buffer_mode_ = buffer_mode;
+}
+
 Program::~Program() {
   if (manager_) {
     if (manager_->have_context_) {
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h
index b8b2d2d..a3de24b 100644
--- a/gpu/command_buffer/service/program_manager.h
+++ b/gpu/command_buffer/service/program_manager.h
@@ -239,11 +239,22 @@
   // varying registers.
   bool CheckVaryingsPacking(VaryingsPackingOption option) const;
 
+  void TransformFeedbackVaryings(GLsizei count, const char* const* varyings,
+      GLenum buffer_mode);
+
   // Visible for testing
   const LocationMap& bind_attrib_location_map() const {
     return bind_attrib_location_map_;
   }
 
+  const std::vector<std::string>& transform_feedback_varyings() const {
+    return transform_feedback_varyings_;
+  }
+
+  GLenum transform_feedback_buffer_mode() const {
+    return transform_feedback_buffer_mode_;
+  }
+
  private:
   friend class base::RefCounted<Program>;
   friend class ProgramManager;
@@ -373,6 +384,10 @@
 
   // uniform-location binding map from glBindUniformLocationCHROMIUM() calls.
   LocationMap bind_uniform_location_map_;
+
+  std::vector<std::string> transform_feedback_varyings_;
+
+  GLenum transform_feedback_buffer_mode_;
 };
 
 // Tracks the Programs.
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index 99678f4..8e83702 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -1959,7 +1959,9 @@
     cache_->LinkedProgramCacheSuccess(
         vertex_shader_->source(),
         fragment_shader_->source(),
-        &program_->bind_attrib_location_map());
+        &program_->bind_attrib_location_map(),
+        program_->transform_feedback_varyings(),
+        program_->transform_feedback_buffer_mode());
   }
 
   void SetExpectationsForProgramCached() {
@@ -1977,6 +1979,8 @@
         vertex_shader,
         fragment_shader,
         &program->bind_attrib_location_map(),
+        program_->transform_feedback_varyings(),
+        program_->transform_feedback_buffer_mode(),
         _)).Times(1);
   }
 
@@ -1995,6 +1999,8 @@
         vertex_shader,
         fragment_shader,
         &program->bind_attrib_location_map(),
+        program_->transform_feedback_varyings(),
+        program_->transform_feedback_buffer_mode(),
         _)).Times(0);
   }
 
@@ -2017,6 +2023,8 @@
                                   vertex_shader,
                                   fragment_shader,
                                   &program->bind_attrib_location_map(),
+                                  program_->transform_feedback_varyings(),
+                                  program_->transform_feedback_buffer_mode(),
                                   _))
         .WillOnce(Return(result));
   }
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index c0808c4..c74a650 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -171,13 +171,13 @@
 
 bool AllSamplesPassedQuery::Process(bool did_finish) {
   GLuint available = 0;
-  glGetQueryObjectuivARB(
+  glGetQueryObjectuiv(
       service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
   if (!available) {
     return true;
   }
   GLuint result = 0;
-  glGetQueryObjectuivARB(
+  glGetQueryObjectuiv(
       service_id_, GL_QUERY_RESULT_EXT, &result);
 
   return MarkAsCompleted(result != 0);
@@ -185,7 +185,7 @@
 
 void AllSamplesPassedQuery::Destroy(bool have_context) {
   if (have_context && !IsDeleted()) {
-    glDeleteQueriesARB(1, &service_id_);
+    glDeleteQueries(1, &service_id_);
     MarkAsDeleted();
   }
 }
@@ -508,7 +508,7 @@
       break;
     default: {
       GLuint service_id = 0;
-      glGenQueriesARB(1, &service_id);
+      glGenQueries(1, &service_id);
       DCHECK_NE(0u, service_id);
       query = new AllSamplesPassedQuery(
           this, target, shm_id, shm_offset, service_id);
@@ -582,12 +582,12 @@
 
 void QueryManager::BeginQueryHelper(GLenum target, GLuint id) {
   target = AdjustTargetForEmulation(target);
-  glBeginQueryARB(target, id);
+  glBeginQuery(target, id);
 }
 
 void QueryManager::EndQueryHelper(GLenum target) {
   target = AdjustTargetForEmulation(target);
-  glEndQueryARB(target);
+  glEndQuery(target);
 }
 
 QueryManager::Query::Query(
diff --git a/gpu/command_buffer/service/query_manager_unittest.cc b/gpu/command_buffer/service/query_manager_unittest.cc
index 9c3dd10..f6e3682 100644
--- a/gpu/command_buffer/service/query_manager_unittest.cc
+++ b/gpu/command_buffer/service/query_manager_unittest.cc
@@ -61,7 +61,7 @@
   QueryManager::Query* CreateQuery(
       GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset,
       GLuint service_id) {
-    EXPECT_CALL(*gl_, GenQueriesARB(1, _))
+    EXPECT_CALL(*gl_, GenQueries(1, _))
        .WillOnce(SetArgumentPointee<1>(service_id))
        .RetiresOnSaturation();
     return manager_->CreateQuery(target, client_id, shm_id, shm_offset);
@@ -70,10 +70,10 @@
   void QueueQuery(QueryManager::Query* query,
                   GLuint service_id,
                   base::subtle::Atomic32 submit_count) {
-    EXPECT_CALL(*gl_, BeginQueryARB(query->target(), service_id))
+    EXPECT_CALL(*gl_, BeginQuery(query->target(), service_id))
         .Times(1)
         .RetiresOnSaturation();
-    EXPECT_CALL(*gl_, EndQueryARB(query->target()))
+    EXPECT_CALL(*gl_, EndQuery(query->target()))
         .Times(1)
         .RetiresOnSaturation();
     EXPECT_TRUE(manager_->BeginQuery(query));
@@ -177,7 +177,7 @@
       CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id,
                   kSharedMemoryId, kSharedMemoryOffset, kService1Id));
   ASSERT_TRUE(query.get() != NULL);
-  EXPECT_CALL(*gl_, DeleteQueriesARB(1, ::testing::Pointee(kService1Id)))
+  EXPECT_CALL(*gl_, DeleteQueries(1, ::testing::Pointee(kService1Id)))
       .Times(1)
       .RetiresOnSaturation();
   manager_->Destroy(true);
@@ -236,7 +236,7 @@
   // Process with return not available.
   // Expect 1 GL command.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(0))
       .RetiresOnSaturation();
   EXPECT_TRUE(manager_->ProcessPendingQueries(false));
@@ -247,11 +247,11 @@
   // Process with return available.
   // Expect 2 GL commands.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(1))
       .RetiresOnSaturation();
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_EXT, _))
       .WillOnce(SetArgumentPointee<2>(kResult))
       .RetiresOnSaturation();
   EXPECT_TRUE(manager_->ProcessPendingQueries(false));
@@ -323,23 +323,23 @@
   {
     InSequence s;
     EXPECT_CALL(*gl_,
-        GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+        GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
         .WillOnce(SetArgumentPointee<2>(1))
         .RetiresOnSaturation();
     EXPECT_CALL(*gl_,
-        GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
+        GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_EXT, _))
         .WillOnce(SetArgumentPointee<2>(kResult1))
         .RetiresOnSaturation();
     EXPECT_CALL(*gl_,
-        GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+        GetQueryObjectuiv(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
         .WillOnce(SetArgumentPointee<2>(1))
         .RetiresOnSaturation();
     EXPECT_CALL(*gl_,
-        GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_EXT, _))
+        GetQueryObjectuiv(kService2Id, GL_QUERY_RESULT_EXT, _))
         .WillOnce(SetArgumentPointee<2>(kResult2))
         .RetiresOnSaturation();
     EXPECT_CALL(*gl_,
-        GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+        GetQueryObjectuiv(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
         .WillOnce(SetArgumentPointee<2>(0))
         .RetiresOnSaturation();
     EXPECT_TRUE(manager_->ProcessPendingQueries(false));
@@ -358,7 +358,7 @@
   // Process with renaming query. No result.
   // Expect 1 GL commands.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(0))
       .RetiresOnSaturation();
   EXPECT_TRUE(manager_->ProcessPendingQueries(false));
@@ -370,11 +370,11 @@
   // Process with renaming query. With result.
   // Expect 2 GL commands.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(1))
       .RetiresOnSaturation();
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _))
+      GetQueryObjectuiv(kService3Id, GL_QUERY_RESULT_EXT, _))
       .WillOnce(SetArgumentPointee<2>(kResult3))
       .RetiresOnSaturation();
   EXPECT_TRUE(manager_->ProcessPendingQueries(false));
@@ -403,11 +403,11 @@
   // Process with return available.
   // Expect 2 GL commands.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(1))
       .RetiresOnSaturation();
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_EXT, _))
       .WillOnce(SetArgumentPointee<2>(kResult))
       .RetiresOnSaturation();
   EXPECT_FALSE(manager_->ProcessPendingQueries(false));
@@ -432,11 +432,11 @@
   // Process with return available.
   // Expect 2 GL commands.
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
       .WillOnce(SetArgumentPointee<2>(1))
       .RetiresOnSaturation();
   EXPECT_CALL(*gl_,
-      GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _))
+      GetQueryObjectuiv(kService1Id, GL_QUERY_RESULT_EXT, _))
       .WillOnce(SetArgumentPointee<2>(kResult))
       .RetiresOnSaturation();
   EXPECT_FALSE(manager_->ProcessPendingQueries(false));
@@ -474,17 +474,17 @@
   scoped_ptr<QueryManager> manager(
       new QueryManager(decoder_.get(), feature_info.get()));
 
-  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
+  EXPECT_CALL(*gl_, GenQueries(1, _))
      .WillOnce(SetArgumentPointee<1>(kService1Id))
      .RetiresOnSaturation();
   QueryManager::Query* query = manager->CreateQuery(
       kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
   ASSERT_TRUE(query != NULL);
 
-  EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kService1Id))
+  EXPECT_CALL(*gl_, BeginQuery(GL_ANY_SAMPLES_PASSED_EXT, kService1Id))
       .Times(1)
       .RetiresOnSaturation();
-  EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
+  EXPECT_CALL(*gl_, EndQuery(GL_ANY_SAMPLES_PASSED_EXT))
       .Times(1)
       .RetiresOnSaturation();
   EXPECT_TRUE(manager->BeginQuery(query));
@@ -508,17 +508,17 @@
   scoped_ptr<QueryManager> manager(
       new QueryManager(decoder_.get(), feature_info.get()));
 
-  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
+  EXPECT_CALL(*gl_, GenQueries(1, _))
      .WillOnce(SetArgumentPointee<1>(kService1Id))
      .RetiresOnSaturation();
   QueryManager::Query* query = manager->CreateQuery(
       kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset);
   ASSERT_TRUE(query != NULL);
 
-  EXPECT_CALL(*gl_, BeginQueryARB(GL_SAMPLES_PASSED_ARB, kService1Id))
+  EXPECT_CALL(*gl_, BeginQuery(GL_SAMPLES_PASSED_ARB, kService1Id))
       .Times(1)
       .RetiresOnSaturation();
-  EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB))
+  EXPECT_CALL(*gl_, EndQuery(GL_SAMPLES_PASSED_ARB))
       .Times(1)
       .RetiresOnSaturation();
   EXPECT_TRUE(manager->BeginQuery(query));
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn
index 4d068ed..6139153 100644
--- a/gpu/config/BUILD.gn
+++ b/gpu/config/BUILD.gn
@@ -45,10 +45,11 @@
     "software_rendering_list_json.cc",
   ]
 
-  # TODO(jschuh): size_t to int.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  defines = [ "GPU_IMPLEMENTATION" ]
+  configs += [
+    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+    "//build/config/compiler:no_size_t_to_int_warning",
+    "//gpu:gpu_implementation",
+  ]
 
   deps = [
     "//base",
@@ -74,7 +75,7 @@
     }
   }
   if (use_libpci) {
-    defines += [ "USE_LIBPCI=1" ]
+    defines = [ "USE_LIBPCI=1" ]
   }
   if (is_linux && use_libpci && (use_x11 || use_ozone)) {
     deps += [ "//build/config/linux:libpci" ]
diff --git a/gpu/config/gpu_info_collector_win.cc b/gpu/config/gpu_info_collector_win.cc
index 4deee7c..e8c8f2f 100644
--- a/gpu/config/gpu_info_collector_win.cc
+++ b/gpu/config/gpu_info_collector_win.cc
@@ -210,161 +210,6 @@
   return true;
 }
 
-// Determines whether D3D11 won't work, either because it is not supported on
-// the machine or because it is known it is likely to crash.
-bool D3D11ShouldWork(const GPUInfo& gpu_info) {
-  // TODO(apatrick): This is a temporary change to see what impact disabling
-  // D3D11 stats collection has on Canary.
-#if 1
-  return false;
-#else
-  // Windows XP never supports D3D11. It seems to be less stable that D3D9 on
-  // Vista.
-  if (base::win::GetVersion() <= base::win::VERSION_VISTA)
-    return false;
-
-  // http://crbug.com/175525.
-  if (gpu_info.display_link_version.IsValid())
-    return false;
-
-  return true;
-#endif
-}
-
-// Collects information about the level of D3D11 support and records it in
-// the UMA stats. Records no stats when D3D11 in not supported at all.
-void CollectD3D11SupportOnWorkerThread() {
-  TRACE_EVENT0("gpu", "CollectD3D11Support");
-
-  typedef HRESULT (WINAPI *D3D11CreateDeviceFunc)(
-      IDXGIAdapter* adapter,
-      D3D_DRIVER_TYPE driver_type,
-      HMODULE software,
-      UINT flags,
-      const D3D_FEATURE_LEVEL* feature_levels,
-      UINT num_feature_levels,
-      UINT sdk_version,
-      ID3D11Device** device,
-      D3D_FEATURE_LEVEL* feature_level,
-      ID3D11DeviceContext** immediate_context);
-
-  // This enumeration must be kept in sync with histograms.xml. Do not reorder
-  // the members; always add to the end.
-  enum FeatureLevel {
-    FEATURE_LEVEL_UNKNOWN,
-    FEATURE_LEVEL_NO_D3D11_DLL,
-    FEATURE_LEVEL_NO_CREATE_DEVICE_ENTRY_POINT,
-    FEATURE_LEVEL_DEVICE_CREATION_FAILED,
-    FEATURE_LEVEL_9_1,
-    FEATURE_LEVEL_9_2,
-    FEATURE_LEVEL_9_3,
-    FEATURE_LEVEL_10_0,
-    FEATURE_LEVEL_10_1,
-    FEATURE_LEVEL_11_0,
-    NUM_FEATURE_LEVELS
-  };
-
-  FeatureLevel feature_level = FEATURE_LEVEL_UNKNOWN;
-  UINT bgra_support = 0;
-
-  // This module is leaked in case it is hooked by third party software.
-  base::NativeLibrary d3d11_module = base::LoadNativeLibrary(
-      base::FilePath(L"d3d11.dll"),
-      NULL);
-
-  if (!d3d11_module) {
-    feature_level = FEATURE_LEVEL_NO_D3D11_DLL;
-  } else {
-    D3D11CreateDeviceFunc create_func =
-        reinterpret_cast<D3D11CreateDeviceFunc>(
-            base::GetFunctionPointerFromNativeLibrary(d3d11_module,
-                                                      "D3D11CreateDevice"));
-    if (!create_func) {
-      feature_level = FEATURE_LEVEL_NO_CREATE_DEVICE_ENTRY_POINT;
-    } else {
-      static const D3D_FEATURE_LEVEL d3d_feature_levels[] = {
-        D3D_FEATURE_LEVEL_11_0,
-        D3D_FEATURE_LEVEL_10_1,
-        D3D_FEATURE_LEVEL_10_0,
-        D3D_FEATURE_LEVEL_9_3,
-        D3D_FEATURE_LEVEL_9_2,
-        D3D_FEATURE_LEVEL_9_1
-      };
-
-      base::win::ScopedComPtr<ID3D11Device> device;
-      D3D_FEATURE_LEVEL d3d_feature_level;
-      base::win::ScopedComPtr<ID3D11DeviceContext> device_context;
-      HRESULT hr = create_func(NULL,
-                               D3D_DRIVER_TYPE_HARDWARE,
-                               NULL,
-                               0,
-                               d3d_feature_levels,
-                               arraysize(d3d_feature_levels),
-                               D3D11_SDK_VERSION,
-                               device.Receive(),
-                               &d3d_feature_level,
-                               device_context.Receive());
-      if (FAILED(hr)) {
-        feature_level = FEATURE_LEVEL_DEVICE_CREATION_FAILED;
-      } else {
-        switch (d3d_feature_level) {
-          case D3D_FEATURE_LEVEL_11_0:
-            feature_level = FEATURE_LEVEL_11_0;
-            break;
-          case D3D_FEATURE_LEVEL_10_1:
-            feature_level = FEATURE_LEVEL_10_1;
-            break;
-          case D3D_FEATURE_LEVEL_10_0:
-            feature_level = FEATURE_LEVEL_10_0;
-            break;
-          case D3D_FEATURE_LEVEL_9_3:
-            feature_level = FEATURE_LEVEL_9_3;
-            break;
-          case D3D_FEATURE_LEVEL_9_2:
-            feature_level = FEATURE_LEVEL_9_2;
-            break;
-          case D3D_FEATURE_LEVEL_9_1:
-            feature_level = FEATURE_LEVEL_9_1;
-            break;
-          default:
-            NOTREACHED();
-            break;
-        }
-
-        hr = device->CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM,
-                                        &bgra_support);
-        DCHECK(SUCCEEDED(hr));
-      }
-    }
-  }
-
-  UMA_HISTOGRAM_ENUMERATION("GPU.D3D11_FeatureLevel",
-                            feature_level,
-                            NUM_FEATURE_LEVELS);
-
-  // ANGLE requires at least feature level 10.0. Do not record any further
-  // stats if ANGLE would not work anyway.
-  if (feature_level < FEATURE_LEVEL_10_0)
-    return;
-
-  UMA_HISTOGRAM_BOOLEAN(
-      "GPU.D3D11_B8G8R8A8_Texture2DSupport",
-      (bgra_support & D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0);
-  UMA_HISTOGRAM_BOOLEAN(
-      "GPU.D3D11_B8G8R8A8_RenderTargetSupport",
-      (bgra_support & D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0);
-}
-
-// Collects information about the level of D3D11 support and records it in
-// the UMA stats. Records no stats when D3D11 in not supported at all.
-void CollectD3D11Support() {
-  // D3D11 takes about 50ms to initialize so do this on a worker thread.
-  base::WorkerPool::PostTask(
-      FROM_HERE,
-      base::Bind(CollectD3D11SupportOnWorkerThread),
-      false);
-}
-
 void DeviceIDToVendorAndDevice(const std::wstring& id,
                                uint32* vendor_id,
                                uint32* device_id) {
@@ -708,26 +553,6 @@
     return kCollectInfoNonFatalFailure;
   }
 
-  // Collect basic information about supported D3D11 features. Delay for 45
-  // seconds so as not to regress performance tests.
-  if (D3D11ShouldWork(*gpu_info)) {
-    // This is on a field trial so we can turn it off easily if it blows up
-    // again in stable channel.
-    scoped_refptr<base::FieldTrial> trial(
-        base::FieldTrialList::FactoryGetFieldTrial(
-            "D3D11Experiment", 100, "Disabled", 2015, 7, 8,
-            base::FieldTrial::SESSION_RANDOMIZED, NULL));
-    const int enabled_group =
-        trial->AppendGroup("Enabled", 0);
-
-    if (trial->group() == enabled_group) {
-      base::MessageLoop::current()->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&CollectD3D11Support),
-          base::TimeDelta::FromSeconds(45));
-    }
-  }
-
   gpu_info->basic_info_state = kCollectInfoSuccess;
   return kCollectInfoSuccess;
 }
diff --git a/gpu/gles2_conform_support/BUILD.gn b/gpu/gles2_conform_support/BUILD.gn
new file mode 100644
index 0000000..853beea
--- /dev/null
+++ b/gpu/gles2_conform_support/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/allocator.gni")
+
+# GYP version: gpu/gles2_conform_support/gles2_conform_support.gyp:gles2_conform_support
+executable("gles2_conform_support") {
+  sources = [
+    "gles2_conform_support.c",
+    "native/egl_native.cc",
+    "native/egl_native_win.cc",
+    "native/main.cc",
+  ]
+  defines = [
+    "GLES2_CONFORM_SUPPORT_ONLY",
+    "GTF_GLES20",
+    "EGLAPI=",
+    "EGLAPIENTRY=",
+  ]
+  deps = [
+    "//base",
+    "//gpu/gles2_conform_support/egl",
+    "//base/third_party/dynamic_annotations",
+    "//ui/gl",
+    "//gpu/command_buffer/client:gles2_c_lib_nocheck",
+  ]
+  if (is_linux) {
+    sources += [
+      "native/egl_native_aura.cc",
+      "native/egl_native_x11.cc",
+    ]
+  }
+  if (use_allocator != "none") {
+    # See http://crbug.com/162998#c4 for why this is needed.
+    deps += [ "//base/allocator" ]
+  }
+}
diff --git a/gpu/gles2_conform_support/egl/BUILD.gn b/gpu/gles2_conform_support/egl/BUILD.gn
index 0216522..32fb870 100644
--- a/gpu/gles2_conform_support/egl/BUILD.gn
+++ b/gpu/gles2_conform_support/egl/BUILD.gn
@@ -24,7 +24,6 @@
 
   deps = [
     "//base",
-    "//gpu/command_buffer/client:gles2_c_lib",
     "//gpu/command_buffer/client:gles2_implementation_no_check",
     "//gpu/command_buffer/service",
     "//gpu",
diff --git a/gpu/gles2_conform_support/gles2_conform_support.gyp b/gpu/gles2_conform_support/gles2_conform_support.gyp
index 05aa9ac..3835c4b 100644
--- a/gpu/gles2_conform_support/gles2_conform_support.gyp
+++ b/gpu/gles2_conform_support/gles2_conform_support.gyp
@@ -100,6 +100,7 @@
       ],
     },
     {
+      # GN version: //gpu/gles2_conform_support
       'target_name': 'gles2_conform_support',
       'type': 'executable',
       'dependencies': [
diff --git a/gpu/gles2_conform_support/native/BUILD.gn b/gpu/gles2_conform_support/native/BUILD.gn
index aeaa6d2..0d1c0ee 100644
--- a/gpu/gles2_conform_support/native/BUILD.gn
+++ b/gpu/gles2_conform_support/native/BUILD.gn
@@ -7,6 +7,7 @@
   output_name = "egl_main_native"
   sources = [
     "egl_native.cc",
+    "egl_native_win.cc",
     "main.cc",
   ]
   defines = [
@@ -26,9 +27,6 @@
       "egl_native_x11.cc",
     ]
   }
-  if (is_win) {
-    sources += [ "egl_native_win.cc" ]
-  }
 }
 
 # GYP version: gpu/gles2_conform_support/gles2_conform_support.gyp:egl_main_windowless
@@ -36,6 +34,7 @@
   output_name = "egl_main_windowless"
   sources = [
     "egl_native.cc",
+    "egl_native_win.cc",
     "egl_native_windowless.cc",
     "main.cc",
   ]
@@ -56,7 +55,4 @@
       "egl_native_x11.cc",
     ]
   }
-  if (is_win) {
-    sources += [ "egl_native_win.cc" ]
-  }
 }
diff --git a/gpu/gpu_unittests.isolate b/gpu/gpu_unittests.isolate
index 7ad1b79..b12c5cb 100644
--- a/gpu/gpu_unittests.isolate
+++ b/gpu/gpu_unittests.isolate
@@ -59,6 +59,5 @@
   ],
   'includes': [
     '../base/base.isolate',
-    '../third_party/angle/angle.isolate',
   ],
 }
diff --git a/gpu/ipc/BUILD.gn b/gpu/ipc/BUILD.gn
index 8f83ead..d11d685 100644
--- a/gpu/ipc/BUILD.gn
+++ b/gpu/ipc/BUILD.gn
@@ -8,9 +8,10 @@
     "gpu_command_buffer_traits.h",
   ]
 
-  defines = [ "GPU_IMPLEMENTATION" ]
-
-  configs += [ "//third_party/khronos:khronos_headers" ]
+  configs += [
+    "//gpu:gpu_implementation",
+    "//third_party/khronos:khronos_headers",
+  ]
 
   deps = [
     "//gpu/command_buffer/common",
diff --git a/gpu/perftests/measurements.cc b/gpu/perftests/measurements.cc
index db26fb3..0f46390 100644
--- a/gpu/perftests/measurements.cc
+++ b/gpu/perftests/measurements.cc
@@ -25,16 +25,16 @@
     : name(name), wall_time(wall_time), cpu_time(cpu_time), gpu_time(gpu_time) {
 }
 
-void Measurement::PrintResult(const std::string& suffix) const {
-  perf_test::PrintResult(name, "_wall" + suffix, "",
-                         wall_time.InMillisecondsF(), "ms", true);
+void Measurement::PrintResult(const std::string& graph) const {
+  perf_test::PrintResult(graph, "", name + "_wall", wall_time.InMillisecondsF(),
+                         "ms", true);
   if (cpu_time.InMicroseconds() >= 0) {
-    perf_test::PrintResult(name, "_cpu" + suffix, "",
-                           cpu_time.InMillisecondsF(), "ms", true);
+    perf_test::PrintResult(graph, "", name + "_cpu", cpu_time.InMillisecondsF(),
+                           "ms", true);
   }
   if (gpu_time.InMicroseconds() >= 0) {
-    perf_test::PrintResult(name, "_gpu" + suffix, "",
-                           gpu_time.InMillisecondsF(), "ms", true);
+    perf_test::PrintResult(graph, "", name + "_gpu", gpu_time.InMillisecondsF(),
+                           "ms", true);
   }
 }
 
diff --git a/gpu/perftests/measurements.h b/gpu/perftests/measurements.h
index 35ede22..87d0c2a 100644
--- a/gpu/perftests/measurements.h
+++ b/gpu/perftests/measurements.h
@@ -11,8 +11,8 @@
 #include "base/time/time.h"
 
 namespace gfx {
-  class GPUTimingClient;
-  class GPUTimer;
+class GPUTimingClient;
+class GPUTimer;
 }
 
 namespace gpu {
@@ -26,7 +26,7 @@
               const base::TimeDelta gpu_time);
   ~Measurement();
 
-  void PrintResult(const std::string& suffix) const;
+  void PrintResult(const std::string& graph) const;
   Measurement& Increment(const Measurement& m);
   Measurement Divide(int a) const;
 
diff --git a/gpu/perftests/texture_upload_perftest.cc b/gpu/perftests/texture_upload_perftest.cc
index e36fb1b..89e901a 100644
--- a/gpu/perftests/texture_upload_perftest.cc
+++ b/gpu/perftests/texture_upload_perftest.cc
@@ -34,7 +34,7 @@
 // clang-format off
 const char kVertexShader[] =
 SHADER(
-  uniform vec2 translation = vec2(0.0, 0.0);
+  uniform vec2 translation;
   attribute vec2 a_position;
   attribute vec2 a_texCoord;
   varying vec2 v_texCoord;
@@ -46,6 +46,7 @@
 );
 const char kFragmentShader[] =
 SHADER(
+  precision mediump float;
   uniform sampler2D a_texture;
   varying vec2 v_texCoord;
   void main() {
@@ -81,18 +82,24 @@
   return shader;
 }
 
+int GLFormatBytePerPixel(GLenum format) {
+  DCHECK(format == GL_RGBA || format == GL_LUMINANCE || format == GL_RED_EXT);
+  return format == GL_RGBA ? 4 : 1;
+}
+
 void GenerateTextureData(const gfx::Size& size,
                          int bytes_per_pixel,
                          const int seed,
                          std::vector<uint8>* const pixels) {
-  int bytes = size.GetArea() * bytes_per_pixel;
-  pixels->resize(bytes);
-  for (int i = 0; i < bytes; ++i) {
-    int channel = i % bytes_per_pixel;
-    if (channel == 3) {  // Alpha channel.
-      pixels->at(i) = 255;
-    } else {
-      pixels->at(i) = (i + (seed << 2)) % (32 << channel);
+  // Row bytes has to be multiple of 4 (GL_PACK_ALIGNMENT defaults to 4).
+  int stride = ((size.width() * bytes_per_pixel) + 3) & ~0x3;
+  pixels->resize(size.height() * stride);
+  for (int y = 0; y < size.height(); ++y) {
+    for (int x = 0; x < size.width(); ++x) {
+      for (int channel = 0; channel < bytes_per_pixel; ++channel) {
+        int index = y * stride + x * bytes_per_pixel;
+        pixels->at(index) = (index + (seed << 2)) % (0x20 << channel);
+      }
     }
   }
 }
@@ -101,33 +108,34 @@
 // where the former buffer have been uploaded as a texture and drawn on the
 // RGBA buffer.
 bool CompareBufferToRGBABuffer(GLenum format,
+                               const gfx::Size& size,
                                const std::vector<uint8>& pixels,
-                               const std::vector<uint8>& pixels_rgba) {
-  for (size_t i = 0; i < pixels.size(); i += 4) {
-    switch (format) {
-      case GL_RED_EXT:  // (R_t, 0, 0, 1)
-        if (pixels_rgba[i] != pixels[i / 4] || pixels_rgba[i + 1] != 0 ||
-            pixels_rgba[i + 2] != 0 || pixels_rgba[i + 3] != 255) {
-          return false;
-        }
-        break;
-      case GL_LUMINANCE:  // (L_t, L_t, L_t, 1)
-        if (pixels_rgba[i] != pixels[i / 4] ||
-            pixels_rgba[i + 1] != pixels[i / 4] ||
-            pixels_rgba[i + 2] != pixels[i / 4] || pixels_rgba[i + 3] != 255) {
-          return false;
-        }
-        break;
-      case GL_RGBA:  // (R_t, G_t, B_t, A_t)
-        if (pixels_rgba[i] != pixels[i] ||
-            pixels_rgba[i + 1] != pixels[i + 1] ||
-            pixels_rgba[i + 2] != pixels[i + 2] ||
-            pixels_rgba[i + 3] != pixels[i + 3]) {
-          return false;
-        }
-        break;
-      default:
-        NOTREACHED();
+                               const std::vector<uint8>& rgba) {
+  int bytes_per_pixel = GLFormatBytePerPixel(format);
+  int pixels_stride = ((size.width() * bytes_per_pixel) + 3) & ~0x3;
+  int rgba_stride = size.width() * GLFormatBytePerPixel(GL_RGBA);
+  for (int y = 0; y < size.height(); ++y) {
+    for (int x = 0; x < size.width(); ++x) {
+      int rgba_index = y * rgba_stride + x * GLFormatBytePerPixel(GL_RGBA);
+      int pixels_index = y * pixels_stride + x * bytes_per_pixel;
+      uint8 expected[4] = {0};
+      switch (format) {
+        case GL_LUMINANCE:  // (L_t, L_t, L_t, 1)
+          expected[1] = pixels[pixels_index];
+          expected[2] = pixels[pixels_index];
+        case GL_RED_EXT:  // (R_t, 0, 0, 1)n
+          expected[0] = pixels[pixels_index];
+          expected[3] = 255;
+          break;
+        case GL_RGBA:  // (R_t, G_t, B_t, A_t)
+          memcpy(expected, &pixels[pixels_index], 4);
+          break;
+        default:
+          NOTREACHED();
+      }
+      if (memcmp(&rgba[rgba_index], expected, 4)) {
+        return false;
+      }
     }
   }
   return true;
@@ -189,15 +197,15 @@
     glBindAttribLocation(program_object_, 1, "a_texCoord");
     glLinkProgram(program_object_);
 
-    translation_location_ =
-        glGetUniformLocation(program_object_, "translation");
-    DCHECK_NE(-1, translation_location_);
-
     GLint linked = -1;
     glGetProgramiv(program_object_, GL_LINK_STATUS, &linked);
     CHECK_NE(0, linked);
     glUseProgram(program_object_);
     glUniform1i(sampler_location_, 0);
+    translation_location_ =
+        glGetUniformLocation(program_object_, "translation");
+    DCHECK_NE(-1, translation_location_);
+    glUniform2f(translation_location_, 0.0f, 0.0f);
 
     sampler_location_ = glGetUniformLocation(program_object_, "a_texture");
     CHECK_NE(-1, sampler_location_);
@@ -302,7 +310,8 @@
     glReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_BYTE,
                  &pixels_rendered[0]);
     CheckNoGlError();
-    EXPECT_TRUE(CompareBufferToRGBABuffer(format, pixels, pixels_rendered))
+    EXPECT_TRUE(
+        CompareBufferToRGBABuffer(format, size, pixels, pixels_rendered))
         << "Format is: " << gfx::GLEnums::GetStringEnum(format);
 
     std::vector<Measurement> measurements;
@@ -323,9 +332,8 @@
     base::SmallMap<std::map<std::string, Measurement>>
         aggregates;  // indexed by name
     int successful_runs = 0;
-    ASSERT_THAT(format, testing::AnyOf(GL_RGBA, GL_LUMINANCE, GL_RED_EXT));
     for (int i = 0; i < kUploadPerfWarmupRuns + kUploadPerfTestRuns; ++i) {
-      GenerateTextureData(size, format == GL_RGBA ? 4 : 1, i + 1, &pixels);
+      GenerateTextureData(size, GLFormatBytePerPixel(format), i + 1, &pixels);
       auto run = UploadAndDraw(size, pixels, format);
       if (i < kUploadPerfWarmupRuns || !run.size()) {
         continue;
@@ -337,15 +345,15 @@
         aggregate.Increment(measurement);
       }
     }
-    std::string suffix = base::StringPrintf(
-        "_%d_%s", size.width(), gfx::GLEnums::GetStringEnum(format).c_str());
+    std::string graph_name = base::StringPrintf(
+        "%d_%s", size.width(), gfx::GLEnums::GetStringEnum(format).c_str());
     if (successful_runs) {
       for (const auto& entry : aggregates) {
         const auto m = entry.second.Divide(successful_runs);
-        m.PrintResult(suffix);
+        m.PrintResult(graph_name);
       }
     }
-    perf_test::PrintResult("sample_runs", suffix, "",
+    perf_test::PrintResult("sample_runs", "", graph_name,
                            static_cast<size_t>(successful_runs), "laps", true);
   }
 
@@ -367,7 +375,7 @@
 // Perf test that generates, uploads and draws a texture on a surface repeatedly
 // and prints out aggregated measurements for all the runs.
 TEST_F(TextureUploadPerfTest, glTexImage2d) {
-  int sizes[] = {128, 256, 512, 1024};
+  int sizes[] = {21, 128, 256, 512, 1024};
   std::vector<GLenum> formats;
   formats.push_back(GL_RGBA);
   // Used by default for ResourceProvider::yuv_resource_format_.
@@ -379,7 +387,7 @@
 
   if (has_texture_rg) {
     // Used as ResourceProvider::yuv_resource_format_ if
-    // {ARB,EXT}_texture_rg is available.
+    // {ARB,EXT}_texture_rg are available.
     formats.push_back(GL_RED_EXT);
   }
   for (int side : sizes) {
@@ -455,8 +463,9 @@
   bool gpu_timer_errors = gpu_timing_client_->IsAvailable() &&
                           gpu_timing_client_->CheckAndResetTimerErrors();
   if (!gpu_timer_errors) {
-    upload_and_draw_timers.GetAsMeasurement("upload_and_draw").PrintResult("");
-    finish_timers.GetAsMeasurement("finish").PrintResult("");
+    upload_and_draw_timers.GetAsMeasurement("upload_and_draw")
+        .PrintResult("renaming");
+    finish_timers.GetAsMeasurement("finish").PrintResult("renaming");
   }
 }
 
diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
index ebc7495..8d1a3b0 100644
--- a/mojo/tools/roll/cc_strip_video.patch
+++ b/mojo/tools/roll/cc_strip_video.patch
@@ -1,8 +1,8 @@
 diff --git a/cc/BUILD.gn b/cc/BUILD.gn
-index 0411b45..4ee07db 100644
+index bd8bfdd..6e55656 100644
 --- a/cc/BUILD.gn
 +++ b/cc/BUILD.gn
-@@ -222,13 +222,6 @@ component("cc") {
+@@ -189,13 +189,6 @@ component("cc") {
      "layers/ui_resource_layer.h",
      "layers/ui_resource_layer_impl.cc",
      "layers/ui_resource_layer_impl.h",
@@ -16,7 +16,7 @@
      "output/begin_frame_args.cc",
      "output/begin_frame_args.h",
      "output/bsp_tree.cc",
-@@ -486,8 +479,6 @@ component("cc") {
+@@ -458,8 +451,6 @@ component("cc") {
      "resources/ui_resource_client.h",
      "resources/ui_resource_request.cc",
      "resources/ui_resource_request.h",
@@ -25,7 +25,7 @@
      "resources/zero_copy_tile_task_worker_pool.cc",
      "resources/zero_copy_tile_task_worker_pool.h",
      "scheduler/begin_frame_source.cc",
-@@ -628,8 +619,6 @@ source_set("test_support") {
+@@ -606,8 +597,6 @@ source_set("test_support") {
      "test/fake_tile_manager_client.h",
      "test/fake_ui_resource_layer_tree_host_impl.cc",
      "test/fake_ui_resource_layer_tree_host_impl.h",
@@ -34,7 +34,7 @@
      "test/geometry_test_utils.cc",
      "test/geometry_test_utils.h",
      "test/impl_side_painting_settings.h",
-@@ -787,7 +776,6 @@ test("cc_unittests") {
+@@ -766,7 +755,6 @@ test("cc_unittests") {
      "layers/tiled_layer_unittest.cc",
      "layers/ui_resource_layer_impl_unittest.cc",
      "layers/ui_resource_layer_unittest.cc",
@@ -42,7 +42,7 @@
      "output/begin_frame_args_unittest.cc",
      "output/delegating_renderer_unittest.cc",
      "output/filter_operations_unittest.cc",
-@@ -848,7 +836,6 @@ test("cc_unittests") {
+@@ -827,7 +815,6 @@ test("cc_unittests") {
      "trees/layer_tree_host_unittest_picture.cc",
      "trees/layer_tree_host_unittest_proxy.cc",
      "trees/layer_tree_host_unittest_scroll.cc",
@@ -241,23 +241,11 @@
 -}
 -
 -}  // namespace cc
-diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
-index 613ea4b..3813e1d 100644
---- a/cc/output/gl_renderer.cc
-+++ b/cc/output/gl_renderer.cc
-@@ -18,7 +18,6 @@
- #include "build/build_config.h"
- #include "base/trace_event/trace_event.h"
- #include "cc/base/math_util.h"
--#include "cc/layers/video_layer_impl.h"
- #include "cc/output/compositor_frame.h"
- #include "cc/output/compositor_frame_metadata.h"
- #include "cc/output/context_provider.h"
 diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
-index 295fc84..ebda8d6 100644
+index d02df4f..9166ea8 100644
 --- a/cc/output/renderer_pixeltest.cc
 +++ b/cc/output/renderer_pixeltest.cc
-@@ -12,7 +12,6 @@
+@@ -11,7 +11,6 @@
  #include "cc/test/fake_picture_pile_impl.h"
  #include "cc/test/pixel_test.h"
  #include "gpu/command_buffer/client/gles2_interface.h"
@@ -265,7 +253,7 @@
  #include "third_party/skia/include/core/SkColorPriv.h"
  #include "third_party/skia/include/core/SkImageFilter.h"
  #include "third_party/skia/include/core/SkMatrix.h"
-@@ -902,243 +901,6 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
+@@ -907,267 +906,6 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
        FuzzyPixelOffByOneComparator(true)));
  }
  
@@ -300,9 +288,9 @@
 -    // the final image.  Bleeding will appear on all four sides of the video
 -    // if the tex coords are not clamped.
 -    CreateTestYUVVideoDrawQuad_TwoColor(
--        shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0,
--        green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(),
--        resource_provider_.get());
+-        shared_state, format, false, tex_coord_rect, background_size,
+-        gfx::Rect(background_size), 0, 0, 0, green_rect, 149, 43, 21,
+-        pass.get(), video_resource_updater_.get(), resource_provider_.get());
 -    pass_list->push_back(pass.Pass());
 -  }
 -
@@ -327,7 +315,7 @@
 -  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
 -                                     false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
 -                                     pass.get(), video_resource_updater_.get(),
--                                     rect, resource_provider_.get());
+-                                     rect, rect, resource_provider_.get());
 -
 -  RenderPassList pass_list;
 -  pass_list.push_back(pass.Pass());
@@ -338,6 +326,30 @@
 -                         FuzzyPixelOffByOneComparator(true)));
 -}
 -
+-TEST_F(VideoGLRendererPixelTest, ClippedYUVRect) {
+-  gfx::Rect viewport(this->device_viewport_size_);
+-  gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5,
+-                      this->device_viewport_size_.height() * 1.5);
+-
+-  RenderPassId id(1, 1);
+-  scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport);
+-
+-  SharedQuadState* shared_state =
+-      CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get());
+-
+-  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
+-                                     false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
+-                                     pass.get(), video_resource_updater_.get(),
+-                                     draw_rect, viewport,
+-                                     resource_provider_.get());
+-  RenderPassList pass_list;
+-  pass_list.push_back(pass.Pass());
+-
+-  EXPECT_TRUE(this->RunPixelTest(
+-      &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")),
+-      FuzzyPixelOffByOneComparator(true)));
+-}
+-
 -TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
 -  gfx::Rect rect(this->device_viewport_size_);
 -
@@ -351,7 +363,7 @@
 -  CreateTestYUVVideoDrawQuad_Striped(
 -      shared_state, media::VideoFrame::I420, false,
 -      gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(),
--      video_resource_updater_.get(), rect, resource_provider_.get());
+-      video_resource_updater_.get(), rect, rect, resource_provider_.get());
 -
 -  RenderPassList pass_list;
 -  pass_list.push_back(pass.Pass());
@@ -375,7 +387,7 @@
 -  CreateTestYUVVideoDrawQuad_Solid(
 -      shared_state, media::VideoFrame::YV12, false,
 -      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
--      video_resource_updater_.get(), rect, resource_provider_.get());
+-      video_resource_updater_.get(), rect, rect, resource_provider_.get());
 -
 -  RenderPassList pass_list;
 -  pass_list.push_back(pass.Pass());
@@ -400,7 +412,7 @@
 -  CreateTestYUVVideoDrawQuad_Solid(
 -      shared_state, media::VideoFrame::YV12J, false,
 -      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
--      video_resource_updater_.get(), rect, resource_provider_.get());
+-      video_resource_updater_.get(), rect, rect, resource_provider_.get());
 -
 -  RenderPassList pass_list;
 -  pass_list.push_back(pass.Pass());
@@ -441,7 +453,7 @@
 -  CreateTestYUVVideoDrawQuad_Solid(
 -      shared_state, media::VideoFrame::YV12J, false,
 -      gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
--      video_resource_updater_.get(), rect, resource_provider_.get());
+-      video_resource_updater_.get(), rect, rect, resource_provider_.get());
 -
 -  RenderPassList pass_list;
 -  pass_list.push_back(pass.Pass());
@@ -464,7 +476,7 @@
 -  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
 -                                     false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
 -                                     pass.get(), video_resource_updater_.get(),
--                                     rect, resource_provider_.get());
+-                                     rect, rect, resource_provider_.get());
 -
 -  SolidColorDrawQuad* color_quad =
 -      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
@@ -491,7 +503,7 @@
 -  CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
 -                                     true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
 -                                     pass.get(), video_resource_updater_.get(),
--                                     rect, resource_provider_.get());
+-                                     rect, rect, resource_provider_.get());
 -
 -  SolidColorDrawQuad* color_quad =
 -      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
@@ -509,18 +521,6 @@
  TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
    gfx::Rect viewport_rect(this->device_viewport_size_);
  
-diff --git a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h
-index 358929e..15bce98 100644
---- a/cc/quads/yuv_video_draw_quad.h
-+++ b/cc/quads/yuv_video_draw_quad.h
-@@ -8,7 +8,6 @@
- #include "base/basictypes.h"
- #include "base/memory/scoped_ptr.h"
- #include "cc/base/cc_export.h"
--#include "cc/layers/video_layer_impl.h"
- #include "cc/quads/draw_quad.h"
- 
- namespace cc {
 diff --git a/cc/resources/drawing_display_item.cc b/cc/resources/drawing_display_item.cc
 index 648f9de..6dffad9 100644
 --- a/cc/resources/drawing_display_item.cc
@@ -534,10 +534,10 @@
  #include "base/trace_event/trace_event_argument.h"
  #include "cc/debug/picture_debug_util.h"
 diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
-index 4289a99..4e3230b 100644
+index 8056387..e8471e2 100644
 --- a/cc/trees/layer_tree_host_impl_unittest.cc
 +++ b/cc/trees/layer_tree_host_impl_unittest.cc
-@@ -27,7 +27,6 @@
+@@ -26,7 +26,6 @@
  #include "cc/layers/solid_color_scrollbar_layer_impl.h"
  #include "cc/layers/texture_layer_impl.h"
  #include "cc/layers/tiled_layer_impl.h"
@@ -614,10 +614,10 @@
    EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
    host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
 diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
-index 68a1f58..2ec6e66 100644
+index aacabd7..9416474 100644
 --- a/cc/trees/layer_tree_host_unittest.cc
 +++ b/cc/trees/layer_tree_host_unittest.cc
-@@ -18,7 +18,6 @@
+@@ -17,7 +17,6 @@
  #include "cc/layers/painted_scrollbar_layer.h"
  #include "cc/layers/picture_layer.h"
  #include "cc/layers/solid_color_layer.h"
@@ -633,7 +633,7 @@
  #include "cc/test/geometry_test_utils.h"
  #include "cc/test/impl_side_painting_settings.h"
  #include "cc/test/layer_tree_test.h"
-@@ -4170,28 +4168,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
+@@ -4256,28 +4254,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
    int num_draws_;
  };
  
diff --git a/sandbox/linux/BUILD.gn b/sandbox/linux/BUILD.gn
index 3b340bd..211c22b 100644
--- a/sandbox/linux/BUILD.gn
+++ b/sandbox/linux/BUILD.gn
@@ -126,6 +126,9 @@
       "services/namespace_sandbox_unittest.cc",
       "services/namespace_utils_unittest.cc",
     ]
+
+    # For credentials_unittest.cc
+    configs += [ "//build/config/linux:libcap" ]
   }
 }
 
@@ -265,6 +268,10 @@
 
   defines = [ "SANDBOX_IMPLEMENTATION" ]
 
+  deps = [
+    "//base",
+  ]
+
   if (compile_credentials) {
     sources += [
       "services/credentials.cc",
@@ -275,13 +282,8 @@
       "services/namespace_utils.h",
     ]
 
-    # For capabilities.cc.
-    configs += [ "//build/config/linux:libcap" ]
+    deps += [ ":sandbox_services_headers" ]
   }
-
-  deps = [
-    "//base",
-  ]
 }
 
 source_set("sandbox_services_headers") {
diff --git a/sandbox/linux/sandbox_linux.gypi b/sandbox/linux/sandbox_linux.gypi
index 6111fd3..4305b41 100644
--- a/sandbox/linux/sandbox_linux.gypi
+++ b/sandbox/linux/sandbox_linux.gypi
@@ -266,8 +266,8 @@
             'services/namespace_utils.h',
           ],
           'dependencies': [
-            # for capabilities.cc.
-            '../build/linux/system.gyp:libcap',
+            # for capability.h.
+            'sandbox_services_headers',
           ],
         }],
       ],
@@ -286,6 +286,7 @@
         'system_headers/android_ucontext.h',
         'system_headers/arm64_linux_syscalls.h',
         'system_headers/arm_linux_syscalls.h',
+        'system_headers/capability.h',
         'system_headers/linux_seccomp.h',
         'system_headers/linux_syscalls.h',
         'system_headers/mips_linux_syscalls.h',
diff --git a/sandbox/linux/sandbox_linux_test_sources.gypi b/sandbox/linux/sandbox_linux_test_sources.gypi
index db039ed..c558a0d 100644
--- a/sandbox/linux/sandbox_linux_test_sources.gypi
+++ b/sandbox/linux/sandbox_linux_test_sources.gypi
@@ -62,6 +62,9 @@
         'services/namespace_sandbox_unittest.cc',
         'services/namespace_utils_unittest.cc',
       ],
+      'dependencies': [
+        '../build/linux/system.gyp:libcap'
+      ],
     }],
   ],
 }
diff --git a/sandbox/linux/services/credentials.cc b/sandbox/linux/services/credentials.cc
index 6f84a66..2e66d97 100644
--- a/sandbox/linux/services/credentials.cc
+++ b/sandbox/linux/services/credentials.cc
@@ -7,7 +7,6 @@
 #include <errno.h>
 #include <signal.h>
 #include <stdio.h>
-#include <sys/capability.h>
 #include <sys/syscall.h>
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -27,6 +26,7 @@
 #include "sandbox/linux/services/proc_util.h"
 #include "sandbox/linux/services/syscall_wrappers.h"
 #include "sandbox/linux/services/thread_helpers.h"
+#include "sandbox/linux/system_headers/capability.h"
 
 namespace sandbox {
 
@@ -34,26 +34,6 @@
 
 bool IsRunningOnValgrind() { return RUNNING_ON_VALGRIND; }
 
-struct CapFreeDeleter {
-  inline void operator()(cap_t cap) const {
-    int ret = cap_free(cap);
-    CHECK_EQ(0, ret);
-  }
-};
-
-// Wrapper to manage libcap2's cap_t type.
-typedef scoped_ptr<typeof(*((cap_t)0)), CapFreeDeleter> ScopedCap;
-
-struct CapTextFreeDeleter {
-  inline void operator()(char* cap_text) const {
-    int ret = cap_free(cap_text);
-    CHECK_EQ(0, ret);
-  }
-};
-
-// Wrapper to manage the result from libcap2's cap_from_text().
-typedef scoped_ptr<char, CapTextFreeDeleter> ScopedCapText;
-
 // Checks that the set of RES-uids and the set of RES-gids have
 // one element each and return that element in |resuid| and |resgid|
 // respectively. It's ok to pass NULL as one or both of the ids.
@@ -130,21 +110,27 @@
          error == ENOSYS);
 }
 
+// Converts a LinuxCapability to the corresponding Linux CAP_XXX value.
+int LinuxCapabilityToKernelValue(LinuxCapability cap) {
+  switch (cap) {
+    case LinuxCapability::kCapSysChroot:
+      return CAP_SYS_CHROOT;
+    case LinuxCapability::kCapSysAdmin:
+      return CAP_SYS_ADMIN;
+  }
+
+  LOG(FATAL) << "Invalid LinuxCapability: " << static_cast<int>(cap);
+  return 0;
+}
+
 }  // namespace.
 
 bool Credentials::DropAllCapabilities(int proc_fd) {
-  DCHECK_LE(0, proc_fd);
-#if !defined(THREAD_SANITIZER)
-  // With TSAN, accept to break the security model as it is a testing
-  // configuration.
-  CHECK(ThreadHelpers::IsSingleThreaded(proc_fd));
-#endif
+  if (!SetCapabilities(proc_fd, std::vector<LinuxCapability>())) {
+    return false;
+  }
 
-  ScopedCap cap(cap_init());
-  CHECK(cap);
-  PCHECK(0 == cap_set_proc(cap.get()));
   CHECK(!HasAnyCapability());
-  // We never let this function fail.
   return true;
 }
 
@@ -153,20 +139,64 @@
   return Credentials::DropAllCapabilities(proc_fd.get());
 }
 
-bool Credentials::HasAnyCapability() {
-  ScopedCap current_cap(cap_get_proc());
-  CHECK(current_cap);
-  ScopedCap empty_cap(cap_init());
-  CHECK(empty_cap);
-  return cap_compare(current_cap.get(), empty_cap.get()) != 0;
+// static
+bool Credentials::SetCapabilities(int proc_fd,
+                                  const std::vector<LinuxCapability>& caps) {
+  DCHECK_LE(0, proc_fd);
+
+#if !defined(THREAD_SANITIZER)
+  // With TSAN, accept to break the security model as it is a testing
+  // configuration.
+  CHECK(ThreadHelpers::IsSingleThreaded(proc_fd));
+#endif
+
+  struct cap_hdr hdr = {};
+  hdr.version = _LINUX_CAPABILITY_VERSION_3;
+  struct cap_data data[_LINUX_CAPABILITY_U32S_3] = {{}};
+
+  // Initially, cap has no capability flags set. Enable the effective and
+  // permitted flags only for the requested capabilities.
+  for (const LinuxCapability cap : caps) {
+    const int cap_num = LinuxCapabilityToKernelValue(cap);
+    const size_t index = CAP_TO_INDEX(cap_num);
+    const uint32_t mask = CAP_TO_MASK(cap_num);
+    data[index].effective |= mask;
+    data[index].permitted |= mask;
+  }
+
+  return sys_capset(&hdr, data) == 0;
 }
 
-scoped_ptr<std::string> Credentials::GetCurrentCapString() {
-  ScopedCap current_cap(cap_get_proc());
-  CHECK(current_cap);
-  ScopedCapText cap_text(cap_to_text(current_cap.get(), NULL));
-  CHECK(cap_text);
-  return scoped_ptr<std::string> (new std::string(cap_text.get()));
+bool Credentials::HasAnyCapability() {
+  struct cap_hdr hdr = {};
+  hdr.version = _LINUX_CAPABILITY_VERSION_3;
+  struct cap_data data[_LINUX_CAPABILITY_U32S_3] = {{}};
+
+  PCHECK(sys_capget(&hdr, data) == 0);
+
+  for (size_t i = 0; i < arraysize(data); ++i) {
+    if (data[i].effective || data[i].permitted || data[i].inheritable) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+bool Credentials::HasCapability(LinuxCapability cap) {
+  struct cap_hdr hdr = {};
+  hdr.version = _LINUX_CAPABILITY_VERSION_3;
+  struct cap_data data[_LINUX_CAPABILITY_U32S_3] = {{}};
+
+  PCHECK(sys_capget(&hdr, data) == 0);
+
+  const int cap_num = LinuxCapabilityToKernelValue(cap);
+  const size_t index = CAP_TO_INDEX(cap_num);
+  const uint32_t mask = CAP_TO_MASK(cap_num);
+
+  return (data[index].effective | data[index].permitted |
+          data[index].inheritable) &
+         mask;
 }
 
 // static
diff --git a/sandbox/linux/services/credentials.h b/sandbox/linux/services/credentials.h
index 9143561..83f2c70 100644
--- a/sandbox/linux/services/credentials.h
+++ b/sandbox/linux/services/credentials.h
@@ -12,21 +12,30 @@
 #endif  // defined(OS_ANDROID).
 
 #include <string>
+#include <vector>
 
 #include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_ptr.h"
+#include "sandbox/linux/system_headers/capability.h"
 #include "sandbox/sandbox_export.h"
 
 namespace sandbox {
 
+// For brevity, we only expose enums for the subset of capabilities we use.
+// This can be expanded as the need arises.
+enum class LinuxCapability {
+  kCapSysChroot,
+  kCapSysAdmin,
+};
+
 // This class should be used to manipulate the current process' credentials.
 // It is currently a stub used to manipulate POSIX.1e capabilities as
 // implemented by the Linux kernel.
 class SANDBOX_EXPORT Credentials {
  public:
   // Drop all capabilities in the effective, inheritable and permitted sets for
-  // the current process. For security reasons, since capabilities are
+  // the current thread. For security reasons, since capabilities are
   // per-thread, the caller is responsible for ensuring it is single-threaded
   // when calling this API.
   // |proc_fd| must be a file descriptor to /proc/ and remains owned by
@@ -34,14 +43,19 @@
   static bool DropAllCapabilities(int proc_fd) WARN_UNUSED_RESULT;
   // A similar API which assumes that it can open /proc/self/ by itself.
   static bool DropAllCapabilities() WARN_UNUSED_RESULT;
+  // Sets the effective and permitted capability sets for the current thread to
+  // the list of capabiltiies in |caps|. All other capability flags are cleared.
+  static bool SetCapabilities(int proc_fd,
+                              const std::vector<LinuxCapability>& caps)
+      WARN_UNUSED_RESULT;
+
+  // Returns true if the current thread has either the effective, permitted, or
+  // inheritable flag set for the given capability.
+  static bool HasCapability(LinuxCapability cap);
 
   // Return true iff there is any capability in any of the capabilities sets
-  // of the current process.
+  // of the current thread.
   static bool HasAnyCapability();
-  // Returns the capabilities of the current process in textual form, as
-  // documented in libcap2's cap_to_text(3). This is mostly useful for
-  // debugging and tests.
-  static scoped_ptr<std::string> GetCurrentCapString();
 
   // Returns whether the kernel supports CLONE_NEWUSER and whether it would be
   // possible to immediately move to a new user namespace. There is no point
diff --git a/sandbox/linux/services/credentials_unittest.cc b/sandbox/linux/services/credentials_unittest.cc
index 2884e74..db19f6f 100644
--- a/sandbox/linux/services/credentials_unittest.cc
+++ b/sandbox/linux/services/credentials_unittest.cc
@@ -7,16 +7,21 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <sys/capability.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <vector>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "sandbox/linux/services/proc_util.h"
+#include "sandbox/linux/services/syscall_wrappers.h"
+#include "sandbox/linux/system_headers/capability.h"
 #include "sandbox/linux/tests/unit_tests.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -24,6 +29,16 @@
 
 namespace {
 
+struct CapFreeDeleter {
+  inline void operator()(cap_t cap) const {
+    int ret = cap_free(cap);
+    CHECK_EQ(0, ret);
+  }
+};
+
+// Wrapper to manage libcap2's cap_t type.
+typedef scoped_ptr<typeof(*((cap_t)0)), CapFreeDeleter> ScopedCap;
+
 bool WorkingDirectoryIsRoot() {
   char current_dir[PATH_MAX];
   char* cwd = getcwd(current_dir, sizeof(current_dir));
@@ -48,12 +63,6 @@
   CHECK(!Credentials::HasAnyCapability());
 }
 
-SANDBOX_TEST(Credentials, GetCurrentCapString) {
-  CHECK(Credentials::DropAllCapabilities());
-  const char kNoCapabilityText[] = "=";
-  CHECK(*Credentials::GetCurrentCapString() == kNoCapabilityText);
-}
-
 SANDBOX_TEST(Credentials, MoveToNewUserNS) {
   CHECK(Credentials::DropAllCapabilities());
   bool moved_to_new_ns = Credentials::MoveToNewUserNS();
@@ -161,6 +170,70 @@
   CHECK(!Credentials::MoveToNewUserNS());
 }
 
+SANDBOX_TEST(Credentials, SetCapabilities) {
+  // Probably missing kernel support.
+  if (!Credentials::MoveToNewUserNS())
+    return;
+
+  base::ScopedFD proc_fd(ProcUtil::OpenProc());
+
+  CHECK(Credentials::HasCapability(LinuxCapability::kCapSysAdmin));
+  CHECK(Credentials::HasCapability(LinuxCapability::kCapSysChroot));
+
+  const std::vector<LinuxCapability> caps = {LinuxCapability::kCapSysChroot};
+  CHECK(Credentials::SetCapabilities(proc_fd.get(), caps));
+
+  CHECK(!Credentials::HasCapability(LinuxCapability::kCapSysAdmin));
+  CHECK(Credentials::HasCapability(LinuxCapability::kCapSysChroot));
+
+  const std::vector<LinuxCapability> no_caps;
+  CHECK(Credentials::SetCapabilities(proc_fd.get(), no_caps));
+  CHECK(!Credentials::HasAnyCapability());
+}
+
+SANDBOX_TEST(Credentials, SetCapabilitiesAndChroot) {
+  // Probably missing kernel support.
+  if (!Credentials::MoveToNewUserNS())
+    return;
+
+  base::ScopedFD proc_fd(ProcUtil::OpenProc());
+
+  CHECK(Credentials::HasCapability(LinuxCapability::kCapSysChroot));
+  PCHECK(chroot("/") == 0);
+
+  const std::vector<LinuxCapability> caps = {LinuxCapability::kCapSysChroot};
+  CHECK(Credentials::SetCapabilities(proc_fd.get(), caps));
+  PCHECK(chroot("/") == 0);
+
+  CHECK(Credentials::DropAllCapabilities());
+  PCHECK(chroot("/") == -1 && errno == EPERM);
+}
+
+SANDBOX_TEST(Credentials, SetCapabilitiesMatchesLibCap2) {
+  // Probably missing kernel support.
+  if (!Credentials::MoveToNewUserNS())
+    return;
+
+  base::ScopedFD proc_fd(ProcUtil::OpenProc());
+
+  const std::vector<LinuxCapability> caps = {LinuxCapability::kCapSysChroot};
+  CHECK(Credentials::SetCapabilities(proc_fd.get(), caps));
+
+  ScopedCap actual_cap(cap_get_proc());
+  PCHECK(actual_cap != nullptr);
+
+  ScopedCap expected_cap(cap_init());
+  PCHECK(expected_cap != nullptr);
+
+  const cap_value_t allowed_cap = CAP_SYS_CHROOT;
+  for (const cap_flag_t flag : {CAP_EFFECTIVE, CAP_PERMITTED}) {
+    PCHECK(cap_set_flag(expected_cap.get(), flag, 1, &allowed_cap, CAP_SET) ==
+           0);
+  }
+
+  CHECK_EQ(0, cap_compare(expected_cap.get(), actual_cap.get()));
+}
+
 }  // namespace.
 
 }  // namespace sandbox.
diff --git a/sandbox/linux/services/syscall_wrappers.cc b/sandbox/linux/services/syscall_wrappers.cc
index af9dc46..5a4045b 100644
--- a/sandbox/linux/services/syscall_wrappers.cc
+++ b/sandbox/linux/services/syscall_wrappers.cc
@@ -77,4 +77,12 @@
   return syscall(__NR_prlimit64, pid, resource, new_limit, old_limit);
 }
 
+int sys_capget(cap_hdr* hdrp, cap_data* datap) {
+  return syscall(__NR_capget, hdrp, datap);
+}
+
+int sys_capset(cap_hdr* hdrp, const cap_data* datap) {
+  return syscall(__NR_capset, hdrp, datap);
+}
+
 }  // namespace sandbox
diff --git a/sandbox/linux/services/syscall_wrappers.h b/sandbox/linux/services/syscall_wrappers.h
index 7f703e0..28cc3a7 100644
--- a/sandbox/linux/services/syscall_wrappers.h
+++ b/sandbox/linux/services/syscall_wrappers.h
@@ -5,12 +5,15 @@
 #ifndef SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
 #define SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
 
+#include <stdint.h>
 #include <sys/types.h>
 
 #include "sandbox/sandbox_export.h"
 
 struct sock_fprog;
 struct rlimit64;
+struct cap_hdr;
+struct cap_data;
 
 namespace sandbox {
 
@@ -47,6 +50,12 @@
                                  const struct rlimit64* new_limit,
                                  struct rlimit64* old_limit);
 
+// Some libcs do not expose capget/capset wrappers. We want to use these
+// directly in order to avoid pulling in libcap2.
+SANDBOX_EXPORT int sys_capget(struct cap_hdr* hdrp, struct cap_data* datap);
+SANDBOX_EXPORT int sys_capset(struct cap_hdr* hdrp,
+                              const struct cap_data* datap);
+
 }  // namespace sandbox
 
 #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/sandbox/linux/system_headers/capability.h b/sandbox/linux/system_headers/capability.h
new file mode 100644
index 0000000..f91fcf7
--- /dev/null
+++ b/sandbox/linux/system_headers/capability.h
@@ -0,0 +1,42 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_CAPABILITY_H_
+#define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_CAPABILITY_H_
+
+#include <stdint.h>
+
+// The following macros are taken from linux/capability.h.
+// We only support capability version 3, which was introduced in Linux 2.6.26.
+#ifndef _LINUX_CAPABILITY_VERSION_3
+#define _LINUX_CAPABILITY_VERSION_3 0x20080522
+#endif
+#ifndef _LINUX_CAPABILITY_U32S_3
+#define _LINUX_CAPABILITY_U32S_3 2
+#endif
+#ifndef CAP_TO_INDEX
+#define CAP_TO_INDEX(x) ((x) >> 5)  // 1 << 5 == bits in __u32
+#endif
+#ifndef CAP_TO_MASK
+#define CAP_TO_MASK(x) (1 << ((x) & 31))  // mask for indexed __u32
+#endif
+#ifndef CAP_SYS_CHROOT
+#define CAP_SYS_CHROOT 18
+#endif
+#ifndef CAP_SYS_ADMIN
+#define CAP_SYS_ADMIN 21
+#endif
+
+struct cap_hdr {
+  uint32_t version;
+  int pid;
+};
+
+struct cap_data {
+  uint32_t effective;
+  uint32_t permitted;
+  uint32_t inheritable;
+};
+
+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_CAPABILITY_H_
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 6369e34..6db5919 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -245,6 +245,10 @@
 #   define SK_SUPPORT_LEGACY_GETTOPDEVICE
 #endif
 
+#ifndef    SK_LEGACY_DRAWPICTURECALLBACK
+#   define SK_LEGACY_DRAWPICTURECALLBACK
+#endif
+
 #ifndef    SK_SUPPORT_LEGACY_GETDEVICE
 #   define SK_SUPPORT_LEGACY_GETDEVICE
 #endif
diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
index dbe851a..194f382 100644
--- a/skia/ext/benchmarking_canvas.cc
+++ b/skia/ext/benchmarking_canvas.cc
@@ -244,12 +244,13 @@
     val->SetString("Flags", builder.str());
   }
 
-  if (paint.getFilterLevel() != default_paint.getFilterLevel()) {
-    static const char* gFilterLevelStrings[] =
-        { "None", "Low", "Medium", "High" };
-    DCHECK_LT(static_cast<size_t>(paint.getFilterLevel()),
-              SK_ARRAY_COUNT(gFilterLevelStrings));
-    val->SetString("FilterLevel", gFilterLevelStrings[paint.getFilterLevel()]);
+  if (paint.getFilterQuality() != default_paint.getFilterQuality()) {
+    static const char* gFilterQualityStrings[] = {
+        "None", "Low", "Medium", "High"};
+    DCHECK_LT(static_cast<size_t>(paint.getFilterQuality()),
+              SK_ARRAY_COUNT(gFilterQualityStrings));
+    val->SetString("FilterQuality",
+                   gFilterQualityStrings[paint.getFilterQuality()]);
   }
 
   if (paint.getTextSize() != default_paint.getTextSize())
diff --git a/skia/ext/bitmap_platform_device_cairo.cc b/skia/ext/bitmap_platform_device_cairo.cc
index a331bed..246984a 100644
--- a/skia/ext/bitmap_platform_device_cairo.cc
+++ b/skia/ext/bitmap_platform_device_cairo.cc
@@ -167,8 +167,8 @@
   cairo_destroy(cairo_);
 }
 
-SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
-                                                     const CreateInfo& info) {
+SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& info,
+                                                   const SkPaint*) {
   SkASSERT(info.fInfo.colorType() == kN32_SkColorType);
   return BitmapPlatformDevice::Create(info.fInfo.width(), info.fInfo.height(),
                                       info.fInfo.isOpaque());
diff --git a/skia/ext/bitmap_platform_device_cairo.h b/skia/ext/bitmap_platform_device_cairo.h
index 977cdad..96a1e17 100644
--- a/skia/ext/bitmap_platform_device_cairo.h
+++ b/skia/ext/bitmap_platform_device_cairo.h
@@ -92,7 +92,7 @@
   cairo_t* BeginPlatformPaint() override;
 
  protected:
-  SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info) override;
+  SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
 
  private:
   static BitmapPlatformDevice* Create(int width, int height, bool is_opaque,
diff --git a/skia/ext/bitmap_platform_device_mac.cc b/skia/ext/bitmap_platform_device_mac.cc
index 9c7966d..066e93f 100644
--- a/skia/ext/bitmap_platform_device_mac.cc
+++ b/skia/ext/bitmap_platform_device_mac.cc
@@ -272,8 +272,8 @@
   SetMatrixClip(transform, region);
 }
 
-SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
-                                                     const CreateInfo& cinfo) {
+SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& cinfo,
+                                                   const SkPaint*) {
   const SkImageInfo& info = cinfo.fInfo;
   const bool do_clear = !info.isOpaque();
   SkASSERT(info.colorType() == kN32_SkColorType);
diff --git a/skia/ext/bitmap_platform_device_mac.h b/skia/ext/bitmap_platform_device_mac.h
index 6c8dc84..566924b 100644
--- a/skia/ext/bitmap_platform_device_mac.h
+++ b/skia/ext/bitmap_platform_device_mac.h
@@ -57,7 +57,7 @@
   BitmapPlatformDevice(CGContextRef context,
                        const SkBitmap& bitmap);
 
-  SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info) override;
+  SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
 
  private:
   void ReleaseBitmapContext();
diff --git a/skia/ext/bitmap_platform_device_skia.cc b/skia/ext/bitmap_platform_device_skia.cc
index 136706d..04fc950 100644
--- a/skia/ext/bitmap_platform_device_skia.cc
+++ b/skia/ext/bitmap_platform_device_skia.cc
@@ -42,8 +42,8 @@
 BitmapPlatformDevice::~BitmapPlatformDevice() {
 }
 
-SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
-                                                     const CreateInfo& info) {
+SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& info,
+                                                   const SkPaint*) {
   SkASSERT(info.fInfo.colorType() == kN32_SkColorType);
   return BitmapPlatformDevice::Create(info.fInfo.width(), info.fInfo.height(),
                                       info.fInfo.isOpaque());
diff --git a/skia/ext/bitmap_platform_device_skia.h b/skia/ext/bitmap_platform_device_skia.h
index 6a8fe7d..0e21929 100644
--- a/skia/ext/bitmap_platform_device_skia.h
+++ b/skia/ext/bitmap_platform_device_skia.h
@@ -40,7 +40,7 @@
   PlatformSurface BeginPlatformPaint() override;
 
  protected:
-  SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info) override;
+  SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BitmapPlatformDevice);
diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc
index 0f16694..6310820 100644
--- a/skia/ext/bitmap_platform_device_win.cc
+++ b/skia/ext/bitmap_platform_device_win.cc
@@ -274,8 +274,8 @@
   return SkBitmapDevice::onAccessBitmap();
 }
 
-SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
-                                                    const CreateInfo& cinfo) {
+SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& cinfo,
+                                                   const SkPaint*) {
   const SkImageInfo& info = cinfo.fInfo;
   const bool do_clear = !info.isOpaque();
   SkASSERT(info.colorType() == kN32_SkColorType);
diff --git a/skia/ext/bitmap_platform_device_win.h b/skia/ext/bitmap_platform_device_win.h
index 1b60018..4a8ad8f 100644
--- a/skia/ext/bitmap_platform_device_win.h
+++ b/skia/ext/bitmap_platform_device_win.h
@@ -63,8 +63,7 @@
   // starts accessing pixel data.
   virtual const SkBitmap& onAccessBitmap() override;
 
-  virtual SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info)
-    override;
+  SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
 
  private:
   // Private constructor.
diff --git a/skia/ext/opacity_draw_filter.cc b/skia/ext/opacity_draw_filter.cc
index 99736f3..10ed9e8 100644
--- a/skia/ext/opacity_draw_filter.cc
+++ b/skia/ext/opacity_draw_filter.cc
@@ -18,7 +18,7 @@
   if (alpha_ < 255)
     paint->setAlpha(alpha_);
   if (disable_image_filtering_)
-    paint->setFilterLevel(SkPaint::kNone_FilterLevel);
+    paint->setFilterQuality(kNone_SkFilterQuality);
   return true;
 }
 
diff --git a/sky/engine/platform/graphics/GraphicsContext.cpp b/sky/engine/platform/graphics/GraphicsContext.cpp
index 1a8451c..6765a71 100644
--- a/sky/engine/platform/graphics/GraphicsContext.cpp
+++ b/sky/engine/platform/graphics/GraphicsContext.cpp
@@ -980,7 +980,7 @@
     RefPtr<SkPictureImageFilter> pictureFilter = adoptRef(SkPictureImageFilter::Create(picture.get(), sourceBounds));
     SkMatrix layerScale;
     layerScale.setScale(deviceDest.width() / src.width(), deviceDest.height() / src.height());
-    RefPtr<SkMatrixImageFilter> matrixFilter = adoptRef(SkMatrixImageFilter::Create(layerScale, SkPaint::kLow_FilterLevel, pictureFilter.get()));
+    RefPtr<SkMatrixImageFilter> matrixFilter = adoptRef(SkMatrixImageFilter::Create(layerScale, kLow_SkFilterQuality, pictureFilter.get()));
     SkPaint picturePaint;
     picturePaint.setXfermodeMode(WebCoreCompositeToSkiaComposite(op, blendMode));
     picturePaint.setImageFilter(matrixFilter.get());
@@ -1791,7 +1791,7 @@
         resampling = InterpolationLow;
     }
     resampling = limitInterpolationQuality(this, resampling);
-    paint->setFilterLevel(static_cast<SkPaint::FilterLevel>(resampling));
+    paint->setFilterQuality(static_cast<SkFilterQuality>(resampling));
 }
 
 } // namespace blink
diff --git a/sky/engine/platform/graphics/GraphicsContextState.cpp b/sky/engine/platform/graphics/GraphicsContextState.cpp
index bb219e5..8e5307a 100644
--- a/sky/engine/platform/graphics/GraphicsContextState.cpp
+++ b/sky/engine/platform/graphics/GraphicsContextState.cpp
@@ -27,10 +27,10 @@
     m_strokePaint.setStrokeCap(SkPaint::kDefault_Cap);
     m_strokePaint.setStrokeJoin(SkPaint::kDefault_Join);
     m_strokePaint.setStrokeMiter(SkFloatToScalar(m_strokeData.miterLimit()));
-    m_strokePaint.setFilterLevel(WebCoreInterpolationQualityToSkFilterLevel(m_interpolationQuality));
+    m_strokePaint.setFilterQuality(WebCoreInterpolationQualityToSkFilterQuality(m_interpolationQuality));
     m_strokePaint.setAntiAlias(m_shouldAntialias);
     m_fillPaint.setColor(applyAlpha(m_fillColor.rgb()));
-    m_fillPaint.setFilterLevel(WebCoreInterpolationQualityToSkFilterLevel(m_interpolationQuality));
+    m_fillPaint.setFilterQuality(WebCoreInterpolationQualityToSkFilterQuality(m_interpolationQuality));
     m_fillPaint.setAntiAlias(m_shouldAntialias);
 }
 
@@ -237,8 +237,8 @@
 void GraphicsContextState::setInterpolationQuality(InterpolationQuality quality)
 {
     m_interpolationQuality = quality;
-    m_strokePaint.setFilterLevel(WebCoreInterpolationQualityToSkFilterLevel(quality));
-    m_fillPaint.setFilterLevel(WebCoreInterpolationQualityToSkFilterLevel(quality));
+    m_strokePaint.setFilterQuality(WebCoreInterpolationQualityToSkFilterQuality(quality));
+    m_fillPaint.setFilterQuality(WebCoreInterpolationQualityToSkFilterQuality(quality));
 }
 
 void GraphicsContextState::setShouldAntialias(bool shouldAntialias)
diff --git a/sky/engine/platform/graphics/GraphicsTypes.h b/sky/engine/platform/graphics/GraphicsTypes.h
index b155f45..7d2ae22 100644
--- a/sky/engine/platform/graphics/GraphicsTypes.h
+++ b/sky/engine/platform/graphics/GraphicsTypes.h
@@ -44,10 +44,10 @@
 };
 
 enum InterpolationQuality {
-    InterpolationNone = SkPaint::kNone_FilterLevel,
-    InterpolationLow = SkPaint::kLow_FilterLevel,
-    InterpolationMedium = SkPaint::kMedium_FilterLevel,
-    InterpolationHigh = SkPaint::kHigh_FilterLevel,
+    InterpolationNone = kNone_SkFilterQuality,
+    InterpolationLow = kLow_SkFilterQuality,
+    InterpolationMedium = kMedium_SkFilterQuality,
+    InterpolationHigh = kHigh_SkFilterQuality,
 #if USE(LOW_QUALITY_IMAGE_INTERPOLATION)
     InterpolationDefault = InterpolationLow,
 #else
diff --git a/sky/engine/platform/graphics/filters/SkiaImageFilterBuilder.cpp b/sky/engine/platform/graphics/filters/SkiaImageFilterBuilder.cpp
index 286c7a6..3dec62a 100644
--- a/sky/engine/platform/graphics/filters/SkiaImageFilterBuilder.cpp
+++ b/sky/engine/platform/graphics/filters/SkiaImageFilterBuilder.cpp
@@ -88,7 +88,7 @@
 
 PassRefPtr<SkImageFilter> SkiaImageFilterBuilder::buildTransform(const AffineTransform& transform, SkImageFilter* input)
 {
-    return adoptRef(SkMatrixImageFilter::Create(affineTransformToSkMatrix(transform), SkPaint::kHigh_FilterLevel, input));
+    return adoptRef(SkMatrixImageFilter::Create(affineTransformToSkMatrix(transform), kHigh_SkFilterQuality, input));
 }
 
 } // namespace blink
diff --git a/sky/engine/platform/graphics/skia/NativeImageSkia.cpp b/sky/engine/platform/graphics/skia/NativeImageSkia.cpp
index e98f56c..71f3e96 100644
--- a/sky/engine/platform/graphics/skia/NativeImageSkia.cpp
+++ b/sky/engine/platform/graphics/skia/NativeImageSkia.cpp
@@ -239,13 +239,13 @@
     localMatrix.setTranslate(SkFloatToScalar(adjustedX), SkFloatToScalar(adjustedY));
 
     RefPtr<SkShader> shader;
-    SkPaint::FilterLevel filterLevel = static_cast<SkPaint::FilterLevel>(resampling);
+    SkFilterQuality filterLevel = static_cast<SkFilterQuality>(resampling);
 
     // Bicubic filter is only applied to defer-decoded images, see
     // NativeImageSkia::draw for details.
     if (resampling == InterpolationHigh && !isLazyDecoded) {
         // Do nice resampling.
-        filterLevel = SkPaint::kNone_FilterLevel;
+        filterLevel = kNone_SkFilterQuality;
         float scaleX = destBitmapWidth / normSrcRect.width();
         float scaleY = destBitmapHeight / normSrcRect.height();
         SkRect scaledSrcRect;
@@ -291,7 +291,7 @@
     paint.setShader(shader.get());
     paint.setXfermodeMode(WebCoreCompositeToSkiaComposite(compositeOp, blendMode));
     paint.setColorFilter(context->colorFilter());
-    paint.setFilterLevel(filterLevel);
+    paint.setFilterQuality(filterLevel);
     context->drawRect(destRect, paint);
 }
 
diff --git a/sky/engine/platform/graphics/skia/SkiaUtils.h b/sky/engine/platform/graphics/skia/SkiaUtils.h
index 6bdeded..9492dcb 100644
--- a/sky/engine/platform/graphics/skia/SkiaUtils.h
+++ b/sky/engine/platform/graphics/skia/SkiaUtils.h
@@ -53,11 +53,11 @@
 // move this guy into SkColor.h
 SkColor SkPMColorToColor(SkPMColor);
 
-inline SkPaint::FilterLevel WebCoreInterpolationQualityToSkFilterLevel(InterpolationQuality quality)
+inline SkFilterQuality WebCoreInterpolationQualityToSkFilterQuality(InterpolationQuality quality)
 {
     // FIXME: this reflects existing client mappings, but should probably
     // be expanded to map higher level interpolations more accurately.
-    return quality != InterpolationNone ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel;
+    return quality != InterpolationNone ? kLow_SkFilterQuality : kNone_SkFilterQuality;
 }
 
 // Skia has problems when passed infinite, etc floats, filter them to 0.
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index a839c45..a8730fb 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -338,7 +338,7 @@
       { "test": "content_unittests", "args": ["--site-per-process"] },
       { "test": "content_browsertests", "args": ["--site-per-process", "--gtest_filter=-*.AllowTargetedNavigationsAfterSwap:*.SupportCrossProcessPostMessage:*.DisownOpener:*.DontPreemptNavigationWithFrameTreeUpdate:*.ProcessExitWithSwappedOutViews:*.SupportCrossProcessPostMessageWithMessagePort"] },
       { "test": "unit_tests", "args": ["--site-per-process"] },
-      { "test": "browser_tests", "args": ["--site-per-process", "--gtest_filter=-AppApiTest.*:AutofillDialogControllerTest.*:BlockedAppApiTest.*:BookmarkOverrideTest.*:BrowserTest.OtherRedirectsDontForkProcess:ChromeAppAPITest.*:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:DevToolsExperimentalExtensionTest.*:DevToolsExtensionTest.*:DnsProbeBrowserTest.*:ErrorPageTest.*:ExecuteScriptApiTest.ExecuteScriptPermissions:ExtensionApiTest.ContentScriptExtensionIframe:ExtensionApiTest.ContentScriptOtherExtensions:ExtensionApiTest.ContentScriptExtensionProcess:ExtensionApiTest.TabsOnUpdated:ExtensionApiTest.WindowOpenPopupIframe:ExtensionBrowserTest.LoadChromeExtensionsWithOptionsParamWhenEmbedded:ExtensionCrxInstallerTest.InstallDelayedUntilNextUpdate:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:ExtensionSettingsApiTest.SimpleTest:ExtensionWebUITest.CanEmbedExtensionOptions:ExtensionWebUITest.ReceivesExtensionOptionsOnClose:ExternallyConnectableMessagingTest.*:GeolocationBrowserTest.*:HistoryBrowserTest.*:InlineLoginUISafeIframeBrowserTest.*:IsolatedAppTest.*:LaunchWebAuthFlowFunctionTest.*:MimeHandlerViewTest.*:NaClBrowserTestNonSfiMode.*:OptionsUIBrowserTest.*:PhishingClassifierTest.*:PhishingDOMFeatureExtractorTest.*:PlatformAppUrlRedirectorBrowserTest.*:PopupBlockerBrowserTest.*:PortForwardingTest.*:PrerenderBrowserTest.*:ProcessManagementTest.*:ProfileManagerBrowserTest.*:RedirectTest.*:ReferrerPolicyTest.*:SandboxStatusUITest.*:SSLUITest.*:SyncFileSystemApiTest.GetFileStatuses:SyncFileSystemTest.*:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.*:ZoomControllerBrowserTest.*:*.NavigateFromNTPToOptionsInSameTab:*.ProfilesWithoutPagesNotLaunched:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTest*:ExtensionApiTest.ActiveTab:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest.ExecuteScriptCode"] }
+      { "test": "browser_tests", "args": ["--site-per-process", "--gtest_filter=-AppApiTest.*:BlockedAppApiTest.*:BrowserTest.ClearPendingOnFailUnlessNTP:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeAppAPITest.*:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:DevToolsExperimentalExtensionTest.*:DevToolsExtensionTest.*:DnsProbeBrowserTest.*:ErrorPageTest.*:ExecuteScriptApiTest.ExecuteScriptPermissions:ExtensionApiTest.ChromeRuntimeOpenOptionsPage:ExtensionApiTest.ContentScriptExtensionIframe:ExtensionApiTest.ContentScriptOtherExtensions:ExtensionApiTest.ContentScriptExtensionProcess:ExtensionApiTest.TabsOnUpdated:ExtensionApiTest.WindowOpenPopupIframe:ExtensionBrowserTest.LoadChromeExtensionsWithOptionsParamWhenEmbedded:ExtensionCrxInstallerTest.InstallDelayedUntilNextUpdate:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:ExtensionWebUITest.CanEmbedExtensionOptions:ExtensionWebUITest.ReceivesExtensionOptionsOnClose:ExternallyConnectableMessagingTest.*:HistoryBrowserTest.*:InlineLoginUISafeIframeBrowserTest.*:IsolatedAppTest.*:LaunchWebAuthFlowFunctionTest.*:MimeHandlerViewTest.*:*.NewAvatarMenuEnabledInGuestMode:OptionsUIBrowserTest.*:PhishingClassifierTest.*:PhishingDOMFeatureExtractorTest.*:PlatformAppUrlRedirectorBrowserTest.*:PopupBlockerBrowserTest.*:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.*:ReferrerPolicyTest.*:SSLUITest.*:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.*:ZoomControllerBrowserTest.*:*.NavigateFromNTPToOptionsInSameTab:*.ProfilesWithoutPagesNotLaunched:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTest*:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest.ExecuteScriptCode"] }
     ]
   },
   "Site Isolation Win": {
@@ -346,7 +346,7 @@
       { "test": "content_unittests", "args": ["--site-per-process"] },
       { "test": "content_browsertests", "args": ["--site-per-process", "--gtest_filter=-*.AllowTargetedNavigationsAfterSwap:*.SupportCrossProcessPostMessage:*.DisownOpener:*.DontPreemptNavigationWithFrameTreeUpdate:*.ProcessExitWithSwappedOutViews:*.SupportCrossProcessPostMessageWithMessagePort"] },
       { "test": "unit_tests", "args": ["--site-per-process"] },
-      { "test": "browser_tests", "args": ["--site-per-process", "--gtest_filter=-AppApiTest.*:AutofillDialogControllerTest.*:BlockedAppApiTest.*:BookmarkOverrideTest.*:BrowserTest.OtherRedirectsDontForkProcess:ChromeAppAPITest.*:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:DevToolsExperimentalExtensionTest.*:DevToolsExtensionTest.*:DnsProbeBrowserTest.*:ErrorPageTest.*:ExecuteScriptApiTest.ExecuteScriptPermissions:ExtensionApiTest.ContentScriptExtensionIframe:ExtensionApiTest.ContentScriptOtherExtensions:ExtensionApiTest.ContentScriptExtensionProcess:ExtensionApiTest.TabsOnUpdated:ExtensionApiTest.WindowOpenPopupIframe:ExtensionBrowserTest.LoadChromeExtensionsWithOptionsParamWhenEmbedded:ExtensionCrxInstallerTest.InstallDelayedUntilNextUpdate:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:ExtensionSettingsApiTest.SimpleTest:ExtensionWebUITest.CanEmbedExtensionOptions:ExtensionWebUITest.ReceivesExtensionOptionsOnClose:ExternallyConnectableMessagingTest.*:GeolocationBrowserTest.*:HistoryBrowserTest.*:InlineLoginUISafeIframeBrowserTest.*:IsolatedAppTest.*:LaunchWebAuthFlowFunctionTest.*:MimeHandlerViewTest.*:NaClBrowserTestNonSfiMode.*:OptionsUIBrowserTest.*:PhishingClassifierTest.*:PhishingDOMFeatureExtractorTest.*:PlatformAppUrlRedirectorBrowserTest.*:PopupBlockerBrowserTest.*:PortForwardingTest.*:PrerenderBrowserTest.*:ProcessManagementTest.*:ProfileManagerBrowserTest.*:RedirectTest.*:ReferrerPolicyTest.*:SandboxStatusUITest.*:SSLUITest.*:SyncFileSystemApiTest.GetFileStatuses:SyncFileSystemTest.*:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.*:ZoomControllerBrowserTest.*:*.NavigateFromNTPToOptionsInSameTab:*.ProfilesWithoutPagesNotLaunched:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTest*:ExtensionApiTest.ActiveTab:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest.ExecuteScriptCode"] }
+      { "test": "browser_tests", "args": ["--site-per-process", "--gtest_filter=-AppApiTest.*:BlockedAppApiTest.*:BrowserTest.ClearPendingOnFailUnlessNTP:BrowserTest.OtherRedirectsDontForkProcess:BrowserTest.WindowOpenClose:ChromeAppAPITest.*:ChromeRenderProcessHostTest.*:ChromeRenderProcessHostTestWithCommandLine.*:DevToolsExperimentalExtensionTest.*:DevToolsExtensionTest.*:DnsProbeBrowserTest.*:ErrorPageTest.*:ExecuteScriptApiTest.ExecuteScriptPermissions:ExtensionApiTest.ChromeRuntimeOpenOptionsPage:ExtensionApiTest.ContentScriptExtensionIframe:ExtensionApiTest.ContentScriptOtherExtensions:ExtensionApiTest.ContentScriptExtensionProcess:ExtensionApiTest.TabsOnUpdated:ExtensionApiTest.WindowOpenPopupIframe:ExtensionBrowserTest.LoadChromeExtensionsWithOptionsParamWhenEmbedded:ExtensionCrxInstallerTest.InstallDelayedUntilNextUpdate:ExtensionOptionsApiTest.ExtensionCanEmbedOwnOptions:ExtensionWebUITest.CanEmbedExtensionOptions:ExtensionWebUITest.ReceivesExtensionOptionsOnClose:ExternallyConnectableMessagingTest.*:HistoryBrowserTest.*:InlineLoginUISafeIframeBrowserTest.*:IsolatedAppTest.*:LaunchWebAuthFlowFunctionTest.*:MimeHandlerViewTest.*:*.NewAvatarMenuEnabledInGuestMode:OptionsUIBrowserTest.*:PhishingClassifierTest.*:PhishingDOMFeatureExtractorTest.*:PlatformAppUrlRedirectorBrowserTest.*:PopupBlockerBrowserTest.*:PrerenderBrowserTest.*:ProcessManagementTest.*:RedirectTest.*:ReferrerPolicyTest.*:SSLUITest.*:WebNavigationApiTest.CrossProcessFragment:WebNavigationApiTest.ServerRedirectSingleProcess:WebNavigationApiTest.CrossProcessHistory:WebViewDPITest.*:WebViewPluginTest.*:WebViewTest.*:ZoomControllerBrowserTest.*:*.NavigateFromNTPToOptionsInSameTab:*.ProfilesWithoutPagesNotLaunched:*.TabMove:*.WhitelistedExtension:*.NewTabPageURL:*.HomepageLocation:RestoreOnStartupPolicyTest*:PhishingClassifierDelegateTest.*:WebUIWebViewBrowserTest.ExecuteScriptCode"] }
     ]
   },
   "Browser Side Navigation Linux": {
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index e9f616a..2fd07bd 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -1,9 +1,23 @@
 {
+  "Linux Perf (3)": {
+    "scripts": [
+      {
+        "name": "cc_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["cc_perftests", "--test-launcher-print-test-stdio=always"]
+      }
+    ]
+  },
   "Android Nexus4 Perf": {
     "scripts": [
       {
         "name": "host_info",
         "script": "host_info.py"
+      },
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
       }
     ]
   },
@@ -12,6 +26,20 @@
       {
         "name": "host_info",
         "script": "host_info.py"
+      },
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
+      }
+    ]
+  },
+  "Android Nexus6 Perf": {
+    "scripts": [
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
       }
     ]
   },
@@ -20,6 +48,20 @@
       {
         "name": "host_info",
         "script": "host_info.py"
+      },
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
+      }
+    ]
+  },
+  "Android Nexus9 Perf": {
+    "scripts": [
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
       }
     ]
   },
@@ -28,14 +70,28 @@
       {
         "name": "host_info",
         "script": "host_info.py"
+      },
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
       }
     ]
   },
+  "Android One Perf": {
+    "scripts": [
+    ]
+  },
   "Android MotoE Perf": {
     "scripts": [
       {
         "name": "host_info",
         "script": "host_info.py"
+      },
+      {
+        "name": "gpu_perftests",
+        "script": "gtest_perf_test.py",
+        "args": ["gpu_perftests"]
       }
     ]
   },
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index f65c4b0..3f69a8e 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -94,6 +94,7 @@
           "shards": 2
         }
       },
+      "ipc_mojo_unittests",
       "ipc_tests",
       "jingle_unittests",
       {
diff --git a/testing/chromoting/browser_test_commands_linux.txt b/testing/chromoting/browser_test_commands_linux.txt
index 659e4b6..95f076f 100644
--- a/testing/chromoting/browser_test_commands_linux.txt
+++ b/testing/chromoting/browser_test_commands_linux.txt
@@ -9,6 +9,8 @@
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=Me2MeBrowserTest.MANUAL_Me2Me_v2_Alive_OnLostFocus --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --me2me-pin=123456 --override-user-data-dir=/tmp/chromoting_test_profile
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=It2MeBrowserTest.MANUAL_Connect --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --override-user-data-dir=/tmp/chromoting_test_profile
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=It2MeBrowserTest.MANUAL_InvalidAccessCode --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --override-user-data-dir=/tmp/chromoting_test_profile
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=It2MeBrowserTest.MANUAL_CancelShare --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --override-user-data-dir=/tmp/chromoting_test_profile
+/usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=It2MeBrowserTest.MANUAL_VerifyAccessCodeNonReusable --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --override-user-data-dir=/tmp/chromoting_test_profile
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Cancel_PIN --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --me2me-pin=123456 --override-user-data-dir=/tmp/chromoting_test_profile
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Update_PIN --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --me2me-pin=123456 --override-user-data-dir=/tmp/chromoting_test_profile
 /usr/bin/python ../xvfb.py #PROD_DIR# #PROD_DIR#/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Invalid_PIN --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=#PROD_DIR#/remoting/remoting.webapp.v2 --extension-name=Chromoting --accounts-file=../../remoting/tools/internal/test_accounts.json --account-type=gmail --me2me-pin=123457 --override-user-data-dir=/tmp/chromoting_test_profile
diff --git a/testing/legion/tools/legion.py b/testing/legion/tools/legion.py
new file mode 100755
index 0000000..7b67133
--- /dev/null
+++ b/testing/legion/tools/legion.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A helper module to run Legion multi-machine tests.
+
+Example usage with 1 task machine:
+$ testing/legion/tools/legion.py run  \
+  --controller-isolated out/Release/example_test_controller.isolated  \
+  --dimension os Ubuntu-14.04  \
+  --task-name test-task-name  \
+  --task task_machine out/Release/example_task_machine.isolated
+
+Example usage with 2 task machines with the same isolated file:
+$ testing/legion/tools/legion.py run  \
+  --controller-isolated out/Release/example_test_controller.isolated  \
+  --dimension os Ubuntu-14.04  \
+  --task-name test-task-name  \
+  --task task_machine_1 out/Release/example_task_machine.isolated  \
+  --task task_machine_2 out/Release/example_task_machine.isolated
+
+Example usage with 2 task machines with different isolated file:
+$ testing/legion/tools/legion.py run  \
+  --controller-isolated out/Release/example_test_controller.isolated  \
+  --dimension os Ubuntu-14.04  \
+  --task-name test-task-name  \
+  --task task_machine_1 out/Release/example_task_machine_1.isolated  \
+  --task task_machine_2 out/Release/example_task_machine_2.isolated
+"""
+
+import argparse
+import logging
+import os
+import subprocess
+import sys
+
+
+THIS_DIR = os.path.split(__file__)[0]
+SWARMING_DIR = os.path.join(THIS_DIR, '..', '..', '..', 'tools',
+                            'swarming_client')
+ISOLATE_PY = os.path.join(SWARMING_DIR, 'isolate.py')
+SWARMING_PY = os.path.join(SWARMING_DIR, 'swarming.py')
+LOGGING_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR']
+
+
+class Error(Exception):
+  pass
+
+
+def GetArgs():
+  parser = argparse.ArgumentParser(description=__doc__)
+  parser.add_argument('action', choices=['run', 'trigger'],
+                      help='The swarming action to perform.')
+  parser.add_argument('-f', '--format-only', action='store_true',
+                      help='If true the .isolated files are archived but '
+                      'swarming is not called, only the command line is built.')
+  parser.add_argument('--controller-isolated', required=True,
+                      help='The isolated file for the test controller.')
+  parser.add_argument('--isolate-server', help='Optional. The isolated server '
+                      'to use.')
+  parser.add_argument('--swarming-server', help='Optional. The swarming server '
+                      'to use.')
+  parser.add_argument('--task-name', help='Optional. The swarming task name '
+                      'to use.')
+  parser.add_argument('--dimension', action='append', dest='dimensions',
+                      nargs=2, default=[], help='Dimensions to pass to '
+                      'swarming.py. This is in the form of --dimension key '
+                      'value. The minimum required is --dimension os <OS>')
+  parser.add_argument('--task', action='append', dest='tasks',
+                      nargs=2, default=[], help='List of task names used in '
+                      'the test controller. This is in the form of --task name '
+                      '.isolated and is passed to the controller as --name '
+                      '<ISOLATED HASH>.')
+  parser.add_argument('--controller-var', action='append',
+                      dest='controller_vars', nargs=2, default=[],
+                      help='Command line vars to pass to the controller. These '
+                      'are in the form of --controller-var name value and are '
+                      'passed to the controller as --name value.')
+  parser.add_argument('-v', '--verbosity', default=0, action='count')
+  return parser.parse_args()
+
+
+def RunCommand(cmd, stream_stdout=False):
+  """Runs the command line and streams stdout if requested."""
+  kwargs = {
+      'args': cmd,
+      'stderr': subprocess.PIPE,
+      }
+  if not stream_stdout:
+    kwargs['stdout'] = subprocess.PIPE
+
+  p = subprocess.Popen(**kwargs)
+  stdout, stderr = p.communicate()
+  if p.returncode:
+    raise Error(stderr)
+  if not stream_stdout:
+    logging.debug(stdout)
+  return stdout
+
+
+def Archive(isolated, isolate_server=None):
+  """Calls isolate.py archive with the given args."""
+  cmd = [
+      sys.executable,
+      ISOLATE_PY,
+      'archive',
+      '--isolated', isolated,
+      ]
+  if isolate_server:
+    cmd.extend(['--isolate-server', isolate_server])
+  print ' '.join(cmd)
+  return RunCommand(cmd).split()[0] # The isolated hash
+
+
+def GetSwarmingCommandLine(args):
+  """Builds and returns the command line for swarming.py run|trigger."""
+  cmd = [
+      sys.executable,
+      SWARMING_PY,
+      args.action,
+      args.controller_isolated,
+      ]
+  if args.isolate_server:
+    cmd.extend(['--isolate-server', args.isolate_server])
+  if args.swarming_server:
+    cmd.extend(['--swarming', args.swarming_server])
+  if args.task_name:
+    cmd.extend(['--task-name', args.task_name])
+  # swarming.py dimensions
+  for name, value in args.dimensions:
+    cmd.extend(['--dimension', name, value])
+
+  cmd.append('--')
+
+  # Task name/hash values
+  for name, isolated in args.tasks:
+    cmd.extend(['--' + name, Archive(isolated, args.isolate_server)])
+  # Test controller args
+  for name, value in args.controller_vars:
+    cmd.extend(['--' + name, value])
+  print ' '.join(cmd)
+  return cmd
+
+
+def main():
+  args = GetArgs()
+  logging.basicConfig(
+      format='%(asctime)s %(filename)s:%(lineno)s %(levelname)s] %(message)s',
+      datefmt='%H:%M:%S',
+      level=LOGGING_LEVELS[len(LOGGING_LEVELS)-args.verbosity-1])
+  cmd = GetSwarmingCommandLine(args)
+  if not args.format_only:
+    RunCommand(cmd, True)
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/valgrind/drmemory/suppressions.txt b/tools/valgrind/drmemory/suppressions.txt
index c429a9f..4e084a7 100644
--- a/tools/valgrind/drmemory/suppressions.txt
+++ b/tools/valgrind/drmemory/suppressions.txt
@@ -710,7 +710,7 @@
 name=http://crbug.com/449989
 system call NtOpenProcess
 KERNELBASE.dll!OpenProcess
-base.dll!base::Process::OpenWithExtraPriviles
+base.dll!base::Process::OpenWithExtraPrivileges
 content.dll!content::BrowserMessageFilter::Internal::OnChannelConnected
 
 UNADDRESSABLE ACCESS
diff --git a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
index 31474ef..f5dcbb0 100644
--- a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory_win32.txt
@@ -9,6 +9,9 @@
 # http://crbug.com/450221
 ProfileChooserViewExtensionsTest.LockProfileNoBlockOtherProfileExtensions
 
+# http://crbug.com/467514
+AsyncExtensionSettingsWebUITest.testErrorListButtonVisibility
+
 # it takes too long to run all browser_tests with Dr.Memory,
 # and we only select subset to run
 # A*
diff --git a/tools/valgrind/gtest_exclude/cc_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/cc_unittests.gtest-drmemory_win32.txt
index e7f3488..5a76d89 100644
--- a/tools/valgrind/gtest_exclude/cc_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/cc_unittests.gtest-drmemory_win32.txt
@@ -12,20 +12,7 @@
 LayerTreeHostCopyRequestTestMultipleRequests.SoftwareRenderer_RunSingleThread
 
 # http://crbug.com/430400
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfLayer/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfLayer/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.ImageMaskOfLayer/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.ImageMaskOfLayer/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfClippedLayer/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfClippedLayer/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskWithReplica/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskWithReplica/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskWithReplicaOfClippedLayer/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskWithReplicaOfClippedLayer/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfReplica/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfReplica/6
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfReplicaOfClippedLayer/5
-PixelResourceTest/LayerTreeHostMasksPixelTest.MaskOfReplicaOfClippedLayer/6
+PixelResourceTest*
 
 # https://crbug.com/460581
 LayerTreeHostPictureTestRSLLMembershipWithScale.RunMultiThread_DirectRenderer_ImplSidePaint
diff --git a/tools/valgrind/gtest_exclude/components_unittests.gtest.txt b/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
index e6a2b3f..ab9ecfc 100644
--- a/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
+++ b/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
@@ -3,6 +3,3 @@
 
 # Fails under valgrind, see http://crbug.com/444516
 AudioDirectiveListTest.*
-
-# http://crbug.com/462352
-FeedbackUploaderChromeTest.VariationHeaders
diff --git a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
index dc461a9..d804f42 100644
--- a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
@@ -79,3 +79,6 @@
 SafeBrowsingModuleVerifierWinTest.VerifyModuleExportModified
 SafeBrowsingModuleVerifierWinTest.VerifyModuleModified
 SafeBrowsingModuleVerifierWinTest.VerifyModuleUnmodified
+
+# http://crbug.com/467004
+SigninErrorNotifierTest.NoErrorAuthStatusProviders
diff --git a/ui/gfx/transform.cc b/ui/gfx/transform.cc
index c13ae1d..27b5e63 100644
--- a/ui/gfx/transform.cc
+++ b/ui/gfx/transform.cc
@@ -394,6 +394,13 @@
   matrix_.set(2, 3, 0.0);
 }
 
+bool Transform::IsFlat() const {
+  return matrix_.get(2, 0) == 0.0 && matrix_.get(2, 1) == 0.0 &&
+         matrix_.get(0, 2) == 0.0 && matrix_.get(1, 2) == 0.0 &&
+         matrix_.get(2, 2) == 1.0 && matrix_.get(3, 2) == 0.0 &&
+         matrix_.get(2, 3) == 0.0;
+}
+
 Vector2dF Transform::To2dTranslation() const {
   return gfx::Vector2dF(SkMScalarToFloat(matrix_.get(0, 3)),
                         SkMScalarToFloat(matrix_.get(1, 3)));
diff --git a/ui/gfx/transform.h b/ui/gfx/transform.h
index 68a734e..7f2c599 100644
--- a/ui/gfx/transform.h
+++ b/ui/gfx/transform.h
@@ -188,6 +188,9 @@
   //
   void FlattenTo2d();
 
+  // Returns true if the 3rd row and 3rd column are both (0, 0, 1, 0).
+  bool IsFlat() const;
+
   // Returns the x and y translation components of the matrix.
   Vector2dF To2dTranslation() const;
 
diff --git a/ui/gfx/transform_unittest.cc b/ui/gfx/transform_unittest.cc
index ef801ac..aee6d8c 100644
--- a/ui/gfx/transform_unittest.cc
+++ b/ui/gfx/transform_unittest.cc
@@ -2420,6 +2420,29 @@
   EXPECT_ROW4_EQ(13.0f, 17.0f, 0.0f, 25.0f, A);
 }
 
+TEST(XFormTest, IsFlat) {
+  Transform transform;
+  InitializeTestMatrix(&transform);
+
+  // A transform with all entries non-zero isn't flat.
+  EXPECT_FALSE(transform.IsFlat());
+
+  transform.matrix().set(0, 2, 0.f);
+  transform.matrix().set(1, 2, 0.f);
+  transform.matrix().set(2, 2, 1.f);
+  transform.matrix().set(3, 2, 0.f);
+
+  EXPECT_FALSE(transform.IsFlat());
+
+  transform.matrix().set(2, 0, 0.f);
+  transform.matrix().set(2, 1, 0.f);
+  transform.matrix().set(2, 3, 0.f);
+
+  // Since the third column and row are both (0, 0, 1, 0), the transform is
+  // flat.
+  EXPECT_TRUE(transform.IsFlat());
+}
+
 // Another implementation of Preserves2dAxisAlignment that isn't as fast,
 // good for testing the faster implementation.
 static bool EmpiricallyPreserves2dAxisAlignment(const Transform& transform) {
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 88b4c36..12a44cc 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -183,8 +183,6 @@
   }
   if (is_win) {
     sources += [
-      "angle_platform_impl.cc",
-      "angle_platform_impl.h",
       "gl_bindings_autogen_wgl.cc",
       "gl_bindings_autogen_wgl.h",
       "gl_context_wgl.cc",
@@ -197,8 +195,6 @@
       "gl_wgl_api_implementation.h",
     ]
 
-    deps += [ "//third_party/angle:libGLESv2" ]
-
     libs = [ "dwmapi.lib" ]
     ldflags = [ "/DELAYLOAD:dwmapi.dll" ]
   }
diff --git a/ui/gl/DEPS b/ui/gl/DEPS
index e582c0d..862c555 100644
--- a/ui/gl/DEPS
+++ b/ui/gl/DEPS
@@ -12,9 +12,5 @@
 # get access to desktop OpenGL.
   "gl_surface_osmesa.cc": [
     "+third_party/mesa/src/include/GL/osmesa.h",
-  ],
-# Allow us to include ANGLE's base platform implementation.
-  "angle_platform_impl.h": [
-    "+third_party/angle/include/platform/Platform.h",
-  ],
+  ]
 }
diff --git a/ui/gl/angle_platform_impl.cc b/ui/gl/angle_platform_impl.cc
deleted file mode 100644
index 2ce12b8..0000000
--- a/ui/gl/angle_platform_impl.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gl/angle_platform_impl.h"
-
-#include "base/metrics/histogram.h"
-#include "base/metrics/sparse_histogram.h"
-
-namespace gfx {
-
-ANGLEPlatformImpl::ANGLEPlatformImpl() {
-}
-
-ANGLEPlatformImpl::~ANGLEPlatformImpl() {
-}
-
-void ANGLEPlatformImpl::histogramCustomCounts(const char* name,
-                                              int sample,
-                                              int min,
-                                              int max,
-                                              int bucket_count) {
-  // Copied from histogram macro, but without the static variable caching
-  // the histogram because name is dynamic.
-  base::HistogramBase* counter = base::Histogram::FactoryGet(
-      name, min, max, bucket_count,
-      base::HistogramBase::kUmaTargetedHistogramFlag);
-  DCHECK_EQ(name, counter->histogram_name());
-  counter->Add(sample);
-}
-
-void ANGLEPlatformImpl::histogramEnumeration(const char* name,
-                                             int sample,
-                                             int boundary_value) {
-  // Copied from histogram macro, but without the static variable caching
-  // the histogram because name is dynamic.
-  base::HistogramBase* counter = base::LinearHistogram::FactoryGet(
-      name, 1, boundary_value, boundary_value + 1,
-      base::HistogramBase::kUmaTargetedHistogramFlag);
-  DCHECK_EQ(name, counter->histogram_name());
-  counter->Add(sample);
-}
-
-void ANGLEPlatformImpl::histogramSparse(const char* name, int sample) {
-  // For sparse histograms, we can use the macro, as it does not incorporate a
-  // static.
-  UMA_HISTOGRAM_SPARSE_SLOWLY(name, sample);
-}
-
-}  // namespace gfx
diff --git a/ui/gl/angle_platform_impl.h b/ui/gl/angle_platform_impl.h
deleted file mode 100644
index 2d12f60..0000000
--- a/ui/gl/angle_platform_impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GL_ANGLE_PLATFORM_IMPL_H_
-#define UI_GL_ANGLE_PLATFORM_IMPL_H_
-
-// Implements the ANGLE platform interface, for functionality like
-// histograms and trace profiling.
-
-#include "base/macros.h"
-#include "third_party/angle/include/platform/Platform.h"
-
-namespace gfx {
-
-// Derives the base ANGLE platform and provides implementations
-class ANGLEPlatformImpl : public angle::Platform {
- public:
-  ANGLEPlatformImpl();
-  ~ANGLEPlatformImpl() override;
-
-  // angle::Platform:
-  void histogramCustomCounts(const char* name,
-                             int sample,
-                             int min,
-                             int max,
-                             int bucket_count) override;
-  void histogramEnumeration(const char* name,
-                            int sample,
-                            int boundary_value) override;
-  void histogramSparse(const char* name, int sample) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ANGLEPlatformImpl);
-};
-
-}  // namespace gfx
-
-#endif  // UI_GL_ANGLE_PLATFORM_IMPL_H_
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 3b91dd3..fdeb96c 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -46,10 +46,8 @@
   'names': ['glAttachShader'],
   'arguments': 'GLuint program, GLuint shader', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glBeginQuery' }],
-  'arguments': 'GLenum target, GLuint id', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glBeginQueryARB' },
+  'versions': [{ 'name': 'glBeginQuery' },
+               { 'name': 'glBeginQueryARB' },
                { 'name': 'glBeginQueryEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLenum target, GLuint id', },
@@ -264,10 +262,8 @@
   'names': ['glDeleteProgram'],
   'arguments': 'GLuint program', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glDeleteQueries' }],
-  'arguments': 'GLsizei n, const GLuint* ids', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glDeleteQueriesARB'},
+  'versions': [{ 'name': 'glDeleteQueries' },
+               { 'name': 'glDeleteQueriesARB'},
                { 'name': 'glDeleteQueriesEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLsizei n, const GLuint* ids', },
@@ -367,10 +363,8 @@
   'names': ['glEnableVertexAttribArray'],
   'arguments': 'GLuint index', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glEndQuery' }],
-  'arguments': 'GLenum target', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glEndQueryARB' },
+  'versions': [{ 'name': 'glEndQuery' },
+               { 'name': 'glEndQueryARB' },
                { 'name': 'glEndQueryEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLenum target', },
@@ -444,10 +438,8 @@
   'names': ['glGenFramebuffersEXT', 'glGenFramebuffers'],
   'arguments': 'GLsizei n, GLuint* framebuffers', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glGenQueries' }],
-  'arguments': 'GLsizei n, GLuint* ids', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glGenQueriesARB', },
+  'versions': [{ 'name': 'glGenQueries' },
+               { 'name': 'glGenQueriesARB', },
                { 'name' : 'glGenQueriesEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLsizei n, GLuint* ids', },
@@ -566,10 +558,8 @@
   'names': ['glGetProgramResourceLocation'],
   'arguments': 'GLuint program, GLenum programInterface, const char* name', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glGetQueryiv' }],
-  'arguments': 'GLenum target, GLenum pname, GLint* params', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glGetQueryivARB' },
+  'versions': [{ 'name': 'glGetQueryiv' },
+               { 'name': 'glGetQueryivARB' },
                { 'name': 'glGetQueryivEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLenum target, GLenum pname, GLint* params', },
@@ -579,10 +569,9 @@
                { 'name': 'glGetQueryObjecti64vEXT' }],
   'arguments': 'GLuint id, GLenum pname, GLint64* params', },
 { 'return_type': 'void',
-  'names': ['glGetQueryObjectiv'],
-  'arguments': 'GLuint id, GLenum pname, GLint* params', },
-{ 'return_type': 'void',
-  'names': ['glGetQueryObjectivARB', 'glGetQueryObjectivEXT'],
+  'versions': [{ 'name': 'glGetQueryObjectiv' },
+               { 'name': 'glGetQueryObjectivARB' },
+               { 'name': 'glGetQueryObjectivEXT' }],
   'arguments': 'GLuint id, GLenum pname, GLint* params', },
 { 'return_type': 'void',
   'versions': [{ 'name': 'glGetQueryObjectui64v',
@@ -590,10 +579,8 @@
                { 'name': 'glGetQueryObjectui64vEXT' }],
   'arguments': 'GLuint id, GLenum pname, GLuint64* params', },
 { 'return_type': 'void',
-  'versions': [{ 'name': 'glGetQueryObjectuiv' }],
-  'arguments': 'GLuint id, GLenum pname, GLuint* params', },
-{ 'return_type': 'void',
-  'versions': [{ 'name': 'glGetQueryObjectuivARB' },
+  'versions': [{ 'name': 'glGetQueryObjectuiv' },
+               { 'name': 'glGetQueryObjectuivARB' },
                { 'name': 'glGetQueryObjectuivEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLuint id, GLenum pname, GLuint* params', },
@@ -714,10 +701,8 @@
   'names': ['glIsProgram'],
   'arguments': 'GLuint program', },
 { 'return_type': 'GLboolean',
-  'versions': [{ 'name': 'glIsQuery' }],
-  'arguments': 'GLuint query', },
-{ 'return_type': 'GLboolean',
-  'versions': [{ 'name': 'glIsQueryARB' },
+  'versions': [{ 'name': 'glIsQuery' },
+               { 'name': 'glIsQueryARB' },
                { 'name': 'glIsQueryEXT',
                  'extensions': ['GL_EXT_occlusion_query_boolean'] }],
   'arguments': 'GLuint query', },
diff --git a/ui/gl/gl.gyp b/ui/gl/gl.gyp
index d62950a..0538107 100644
--- a/ui/gl/gl.gyp
+++ b/ui/gl/gl.gyp
@@ -186,8 +186,6 @@
         }],
         ['OS=="win"', {
           'sources': [
-            'angle_platform_impl.cc',
-            'angle_platform_impl.h',
             'gl_bindings_autogen_wgl.cc',
             'gl_bindings_autogen_wgl.h',
             'gl_context_wgl.cc',
@@ -199,11 +197,6 @@
             'gl_wgl_api_implementation.cc',
             'gl_wgl_api_implementation.h',
           ],
-          'dependencies': [
-            # TODO(jmadill): Use ANGLE on other platforms.
-            '<(angle_path)/src/angle.gyp:libEGL',
-            '<(angle_path)/src/angle.gyp:libGLESv2',
-          ],
           'msvs_settings': {
             'VCLinkerTool': {
               'DelayLoadDLLs': [
diff --git a/ui/gl/gl_bindings_api_autogen_gl.h b/ui/gl/gl_bindings_api_autogen_gl.h
index 9b0366c..416a8d8 100644
--- a/ui/gl/gl_bindings_api_autogen_gl.h
+++ b/ui/gl/gl_bindings_api_autogen_gl.h
@@ -11,7 +11,6 @@
 void glActiveTextureFn(GLenum texture) override;
 void glAttachShaderFn(GLuint program, GLuint shader) override;
 void glBeginQueryFn(GLenum target, GLuint id) override;
-void glBeginQueryARBFn(GLenum target, GLuint id) override;
 void glBeginTransformFeedbackFn(GLenum primitiveMode) override;
 void glBindAttribLocationFn(GLuint program,
                             GLuint index,
@@ -181,7 +180,6 @@
 void glDeleteFramebuffersEXTFn(GLsizei n, const GLuint* framebuffers) override;
 void glDeleteProgramFn(GLuint program) override;
 void glDeleteQueriesFn(GLsizei n, const GLuint* ids) override;
-void glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) override;
 void glDeleteRenderbuffersEXTFn(GLsizei n,
                                 const GLuint* renderbuffers) override;
 void glDeleteSamplersFn(GLsizei n, const GLuint* samplers) override;
@@ -229,7 +227,6 @@
 void glEnableFn(GLenum cap) override;
 void glEnableVertexAttribArrayFn(GLuint index) override;
 void glEndQueryFn(GLenum target) override;
-void glEndQueryARBFn(GLenum target) override;
 void glEndTransformFeedbackFn(void) override;
 GLsync glFenceSyncFn(GLenum condition, GLbitfield flags) override;
 void glFinishFn(void) override;
@@ -272,7 +269,6 @@
 void glGenFencesNVFn(GLsizei n, GLuint* fences) override;
 void glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) override;
 void glGenQueriesFn(GLsizei n, GLuint* ids) override;
-void glGenQueriesARBFn(GLsizei n, GLuint* ids) override;
 void glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) override;
 void glGenSamplersFn(GLsizei n, GLuint* samplers) override;
 void glGenTexturesFn(GLsizei n, GLuint* textures) override;
@@ -347,15 +343,12 @@
                                      GLenum programInterface,
                                      const char* name) override;
 void glGetQueryivFn(GLenum target, GLenum pname, GLint* params) override;
-void glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) override;
 void glGetQueryObjecti64vFn(GLuint id, GLenum pname, GLint64* params) override;
 void glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) override;
-void glGetQueryObjectivARBFn(GLuint id, GLenum pname, GLint* params) override;
 void glGetQueryObjectui64vFn(GLuint id,
                              GLenum pname,
                              GLuint64* params) override;
 void glGetQueryObjectuivFn(GLuint id, GLenum pname, GLuint* params) override;
-void glGetQueryObjectuivARBFn(GLuint id, GLenum pname, GLuint* params) override;
 void glGetRenderbufferParameterivEXTFn(GLenum target,
                                        GLenum pname,
                                        GLint* params) override;
@@ -443,7 +436,6 @@
 GLboolean glIsFramebufferEXTFn(GLuint framebuffer) override;
 GLboolean glIsProgramFn(GLuint program) override;
 GLboolean glIsQueryFn(GLuint query) override;
-GLboolean glIsQueryARBFn(GLuint query) override;
 GLboolean glIsRenderbufferEXTFn(GLuint renderbuffer) override;
 GLboolean glIsSamplerFn(GLuint sampler) override;
 GLboolean glIsShaderFn(GLuint shader) override;
diff --git a/ui/gl/gl_bindings_autogen_gl.cc b/ui/gl/gl_bindings_autogen_gl.cc
index a655717..726f545 100644
--- a/ui/gl/gl_bindings_autogen_gl.cc
+++ b/ui/gl/gl_bindings_autogen_gl.cc
@@ -29,7 +29,6 @@
   fn.glAttachShaderFn =
       reinterpret_cast<glAttachShaderProc>(GetGLProcAddress("glAttachShader"));
   fn.glBeginQueryFn = 0;
-  fn.glBeginQueryARBFn = 0;
   fn.glBeginTransformFeedbackFn = 0;
   fn.glBindAttribLocationFn = reinterpret_cast<glBindAttribLocationProc>(
       GetGLProcAddress("glBindAttribLocation"));
@@ -108,7 +107,6 @@
   fn.glDeleteProgramFn = reinterpret_cast<glDeleteProgramProc>(
       GetGLProcAddress("glDeleteProgram"));
   fn.glDeleteQueriesFn = 0;
-  fn.glDeleteQueriesARBFn = 0;
   fn.glDeleteRenderbuffersEXTFn = 0;
   fn.glDeleteSamplersFn = 0;
   fn.glDeleteShaderFn =
@@ -149,7 +147,6 @@
       reinterpret_cast<glEnableVertexAttribArrayProc>(
           GetGLProcAddress("glEnableVertexAttribArray"));
   fn.glEndQueryFn = 0;
-  fn.glEndQueryARBFn = 0;
   fn.glEndTransformFeedbackFn = 0;
   fn.glFenceSyncFn = 0;
   fn.glFinishFn = reinterpret_cast<glFinishProc>(GetGLProcAddress("glFinish"));
@@ -171,7 +168,6 @@
   fn.glGenFencesNVFn = 0;
   fn.glGenFramebuffersEXTFn = 0;
   fn.glGenQueriesFn = 0;
-  fn.glGenQueriesARBFn = 0;
   fn.glGenRenderbuffersEXTFn = 0;
   fn.glGenSamplersFn = 0;
   fn.glGenTexturesFn =
@@ -214,13 +210,10 @@
       reinterpret_cast<glGetProgramivProc>(GetGLProcAddress("glGetProgramiv"));
   fn.glGetProgramResourceLocationFn = 0;
   fn.glGetQueryivFn = 0;
-  fn.glGetQueryivARBFn = 0;
   fn.glGetQueryObjecti64vFn = 0;
   fn.glGetQueryObjectivFn = 0;
-  fn.glGetQueryObjectivARBFn = 0;
   fn.glGetQueryObjectui64vFn = 0;
   fn.glGetQueryObjectuivFn = 0;
-  fn.glGetQueryObjectuivARBFn = 0;
   fn.glGetRenderbufferParameterivEXTFn = 0;
   fn.glGetSamplerParameterfvFn = 0;
   fn.glGetSamplerParameterivFn = 0;
@@ -272,7 +265,6 @@
   fn.glIsProgramFn =
       reinterpret_cast<glIsProgramProc>(GetGLProcAddress("glIsProgram"));
   fn.glIsQueryFn = 0;
-  fn.glIsQueryARBFn = 0;
   fn.glIsRenderbufferEXTFn = 0;
   fn.glIsSamplerFn = 0;
   fn.glIsShaderFn =
@@ -540,18 +532,15 @@
     fn.glBeginQueryFn =
         reinterpret_cast<glBeginQueryProc>(GetGLProcAddress("glBeginQuery"));
     DCHECK(fn.glBeginQueryFn);
-  }
-
-  debug_fn.glBeginQueryARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glBeginQueryARBFn = reinterpret_cast<glBeginQueryARBProc>(
-        GetGLProcAddress("glBeginQueryARB"));
-    DCHECK(fn.glBeginQueryARBFn);
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glBeginQueryFn =
+        reinterpret_cast<glBeginQueryProc>(GetGLProcAddress("glBeginQueryARB"));
+    DCHECK(fn.glBeginQueryFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glBeginQueryARBFn = reinterpret_cast<glBeginQueryARBProc>(
-        GetGLProcAddress("glBeginQueryEXT"));
-    DCHECK(fn.glBeginQueryARBFn);
+    fn.glBeginQueryFn =
+        reinterpret_cast<glBeginQueryProc>(GetGLProcAddress("glBeginQueryEXT"));
+    DCHECK(fn.glBeginQueryFn);
   }
 
   debug_fn.glBeginTransformFeedbackFn = 0;
@@ -793,18 +782,15 @@
     fn.glDeleteQueriesFn = reinterpret_cast<glDeleteQueriesProc>(
         GetGLProcAddress("glDeleteQueries"));
     DCHECK(fn.glDeleteQueriesFn);
-  }
-
-  debug_fn.glDeleteQueriesARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glDeleteQueriesARBFn = reinterpret_cast<glDeleteQueriesARBProc>(
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glDeleteQueriesFn = reinterpret_cast<glDeleteQueriesProc>(
         GetGLProcAddress("glDeleteQueriesARB"));
-    DCHECK(fn.glDeleteQueriesARBFn);
+    DCHECK(fn.glDeleteQueriesFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glDeleteQueriesARBFn = reinterpret_cast<glDeleteQueriesARBProc>(
+    fn.glDeleteQueriesFn = reinterpret_cast<glDeleteQueriesProc>(
         GetGLProcAddress("glDeleteQueriesEXT"));
-    DCHECK(fn.glDeleteQueriesARBFn);
+    DCHECK(fn.glDeleteQueriesFn);
   }
 
   debug_fn.glDeleteRenderbuffersEXTFn = 0;
@@ -963,18 +949,15 @@
     fn.glEndQueryFn =
         reinterpret_cast<glEndQueryProc>(GetGLProcAddress("glEndQuery"));
     DCHECK(fn.glEndQueryFn);
-  }
-
-  debug_fn.glEndQueryARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glEndQueryARBFn =
-        reinterpret_cast<glEndQueryARBProc>(GetGLProcAddress("glEndQueryARB"));
-    DCHECK(fn.glEndQueryARBFn);
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glEndQueryFn =
+        reinterpret_cast<glEndQueryProc>(GetGLProcAddress("glEndQueryARB"));
+    DCHECK(fn.glEndQueryFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glEndQueryARBFn =
-        reinterpret_cast<glEndQueryARBProc>(GetGLProcAddress("glEndQueryEXT"));
-    DCHECK(fn.glEndQueryARBFn);
+    fn.glEndQueryFn =
+        reinterpret_cast<glEndQueryProc>(GetGLProcAddress("glEndQueryEXT"));
+    DCHECK(fn.glEndQueryFn);
   }
 
   debug_fn.glEndTransformFeedbackFn = 0;
@@ -1105,18 +1088,15 @@
     fn.glGenQueriesFn =
         reinterpret_cast<glGenQueriesProc>(GetGLProcAddress("glGenQueries"));
     DCHECK(fn.glGenQueriesFn);
-  }
-
-  debug_fn.glGenQueriesARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glGenQueriesARBFn = reinterpret_cast<glGenQueriesARBProc>(
-        GetGLProcAddress("glGenQueriesARB"));
-    DCHECK(fn.glGenQueriesARBFn);
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGenQueriesFn =
+        reinterpret_cast<glGenQueriesProc>(GetGLProcAddress("glGenQueriesARB"));
+    DCHECK(fn.glGenQueriesFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glGenQueriesARBFn = reinterpret_cast<glGenQueriesARBProc>(
-        GetGLProcAddress("glGenQueriesEXT"));
-    DCHECK(fn.glGenQueriesARBFn);
+    fn.glGenQueriesFn =
+        reinterpret_cast<glGenQueriesProc>(GetGLProcAddress("glGenQueriesEXT"));
+    DCHECK(fn.glGenQueriesFn);
   }
 
   debug_fn.glGenRenderbuffersEXTFn = 0;
@@ -1287,18 +1267,15 @@
     fn.glGetQueryivFn =
         reinterpret_cast<glGetQueryivProc>(GetGLProcAddress("glGetQueryiv"));
     DCHECK(fn.glGetQueryivFn);
-  }
-
-  debug_fn.glGetQueryivARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glGetQueryivARBFn = reinterpret_cast<glGetQueryivARBProc>(
-        GetGLProcAddress("glGetQueryivARB"));
-    DCHECK(fn.glGetQueryivARBFn);
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryivFn =
+        reinterpret_cast<glGetQueryivProc>(GetGLProcAddress("glGetQueryivARB"));
+    DCHECK(fn.glGetQueryivFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glGetQueryivARBFn = reinterpret_cast<glGetQueryivARBProc>(
-        GetGLProcAddress("glGetQueryivEXT"));
-    DCHECK(fn.glGetQueryivARBFn);
+    fn.glGetQueryivFn =
+        reinterpret_cast<glGetQueryivProc>(GetGLProcAddress("glGetQueryivEXT"));
+    DCHECK(fn.glGetQueryivFn);
   }
 
   debug_fn.glGetQueryObjecti64vFn = 0;
@@ -1317,17 +1294,14 @@
     fn.glGetQueryObjectivFn = reinterpret_cast<glGetQueryObjectivProc>(
         GetGLProcAddress("glGetQueryObjectiv"));
     DCHECK(fn.glGetQueryObjectivFn);
-  }
-
-  debug_fn.glGetQueryObjectivARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glGetQueryObjectivARBFn = reinterpret_cast<glGetQueryObjectivARBProc>(
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryObjectivFn = reinterpret_cast<glGetQueryObjectivProc>(
         GetGLProcAddress("glGetQueryObjectivARB"));
-    DCHECK(fn.glGetQueryObjectivARBFn);
+    DCHECK(fn.glGetQueryObjectivFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query) {
-    fn.glGetQueryObjectivARBFn = reinterpret_cast<glGetQueryObjectivARBProc>(
+    fn.glGetQueryObjectivFn = reinterpret_cast<glGetQueryObjectivProc>(
         GetGLProcAddress("glGetQueryObjectivEXT"));
-    DCHECK(fn.glGetQueryObjectivARBFn);
+    DCHECK(fn.glGetQueryObjectivFn);
   }
 
   debug_fn.glGetQueryObjectui64vFn = 0;
@@ -1346,18 +1320,15 @@
     fn.glGetQueryObjectuivFn = reinterpret_cast<glGetQueryObjectuivProc>(
         GetGLProcAddress("glGetQueryObjectuiv"));
     DCHECK(fn.glGetQueryObjectuivFn);
-  }
-
-  debug_fn.glGetQueryObjectuivARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glGetQueryObjectuivARBFn = reinterpret_cast<glGetQueryObjectuivARBProc>(
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glGetQueryObjectuivFn = reinterpret_cast<glGetQueryObjectuivProc>(
         GetGLProcAddress("glGetQueryObjectuivARB"));
-    DCHECK(fn.glGetQueryObjectuivARBFn);
+    DCHECK(fn.glGetQueryObjectuivFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glGetQueryObjectuivARBFn = reinterpret_cast<glGetQueryObjectuivARBProc>(
+    fn.glGetQueryObjectuivFn = reinterpret_cast<glGetQueryObjectuivProc>(
         GetGLProcAddress("glGetQueryObjectuivEXT"));
-    DCHECK(fn.glGetQueryObjectuivARBFn);
+    DCHECK(fn.glGetQueryObjectuivFn);
   }
 
   debug_fn.glGetRenderbufferParameterivEXTFn = 0;
@@ -1511,18 +1482,15 @@
     fn.glIsQueryFn =
         reinterpret_cast<glIsQueryProc>(GetGLProcAddress("glIsQuery"));
     DCHECK(fn.glIsQueryFn);
-  }
-
-  debug_fn.glIsQueryARBFn = 0;
-  if (ext.b_GL_ARB_occlusion_query) {
-    fn.glIsQueryARBFn =
-        reinterpret_cast<glIsQueryARBProc>(GetGLProcAddress("glIsQueryARB"));
-    DCHECK(fn.glIsQueryARBFn);
+  } else if (ext.b_GL_ARB_occlusion_query) {
+    fn.glIsQueryFn =
+        reinterpret_cast<glIsQueryProc>(GetGLProcAddress("glIsQueryARB"));
+    DCHECK(fn.glIsQueryFn);
   } else if (ext.b_GL_EXT_disjoint_timer_query ||
              ext.b_GL_EXT_occlusion_query_boolean) {
-    fn.glIsQueryARBFn =
-        reinterpret_cast<glIsQueryARBProc>(GetGLProcAddress("glIsQueryEXT"));
-    DCHECK(fn.glIsQueryARBFn);
+    fn.glIsQueryFn =
+        reinterpret_cast<glIsQueryProc>(GetGLProcAddress("glIsQueryEXT"));
+    DCHECK(fn.glIsQueryFn);
   }
 
   debug_fn.glIsRenderbufferEXTFn = 0;
@@ -2040,12 +2008,6 @@
   g_driver_gl.debug_fn.glBeginQueryFn(target, id);
 }
 
-static void GL_BINDING_CALL Debug_glBeginQueryARB(GLenum target, GLuint id) {
-  GL_SERVICE_LOG("glBeginQueryARB"
-                 << "(" << GLEnums::GetStringEnum(target) << ", " << id << ")");
-  g_driver_gl.debug_fn.glBeginQueryARBFn(target, id);
-}
-
 static void GL_BINDING_CALL
 Debug_glBeginTransformFeedback(GLenum primitiveMode) {
   GL_SERVICE_LOG("glBeginTransformFeedback"
@@ -2572,13 +2534,6 @@
 }
 
 static void GL_BINDING_CALL
-Debug_glDeleteQueriesARB(GLsizei n, const GLuint* ids) {
-  GL_SERVICE_LOG("glDeleteQueriesARB"
-                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
-  g_driver_gl.debug_fn.glDeleteQueriesARBFn(n, ids);
-}
-
-static void GL_BINDING_CALL
 Debug_glDeleteRenderbuffersEXT(GLsizei n, const GLuint* renderbuffers) {
   GL_SERVICE_LOG("glDeleteRenderbuffersEXT"
                  << "(" << n << ", " << static_cast<const void*>(renderbuffers)
@@ -2792,12 +2747,6 @@
   g_driver_gl.debug_fn.glEndQueryFn(target);
 }
 
-static void GL_BINDING_CALL Debug_glEndQueryARB(GLenum target) {
-  GL_SERVICE_LOG("glEndQueryARB"
-                 << "(" << GLEnums::GetStringEnum(target) << ")");
-  g_driver_gl.debug_fn.glEndQueryARBFn(target);
-}
-
 static void GL_BINDING_CALL Debug_glEndTransformFeedback(void) {
   GL_SERVICE_LOG("glEndTransformFeedback"
                  << "("
@@ -2970,12 +2919,6 @@
   g_driver_gl.debug_fn.glGenQueriesFn(n, ids);
 }
 
-static void GL_BINDING_CALL Debug_glGenQueriesARB(GLsizei n, GLuint* ids) {
-  GL_SERVICE_LOG("glGenQueriesARB"
-                 << "(" << n << ", " << static_cast<const void*>(ids) << ")");
-  g_driver_gl.debug_fn.glGenQueriesARBFn(n, ids);
-}
-
 static void GL_BINDING_CALL
 Debug_glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers) {
   GL_SERVICE_LOG("glGenRenderbuffersEXT"
@@ -3287,15 +3230,6 @@
 }
 
 static void GL_BINDING_CALL
-Debug_glGetQueryivARB(GLenum target, GLenum pname, GLint* params) {
-  GL_SERVICE_LOG("glGetQueryivARB"
-                 << "(" << GLEnums::GetStringEnum(target) << ", "
-                 << GLEnums::GetStringEnum(pname) << ", "
-                 << static_cast<const void*>(params) << ")");
-  g_driver_gl.debug_fn.glGetQueryivARBFn(target, pname, params);
-}
-
-static void GL_BINDING_CALL
 Debug_glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params) {
   GL_SERVICE_LOG("glGetQueryObjecti64v"
                  << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
@@ -3312,14 +3246,6 @@
 }
 
 static void GL_BINDING_CALL
-Debug_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint* params) {
-  GL_SERVICE_LOG("glGetQueryObjectivARB"
-                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
-                 << static_cast<const void*>(params) << ")");
-  g_driver_gl.debug_fn.glGetQueryObjectivARBFn(id, pname, params);
-}
-
-static void GL_BINDING_CALL
 Debug_glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) {
   GL_SERVICE_LOG("glGetQueryObjectui64v"
                  << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
@@ -3336,14 +3262,6 @@
 }
 
 static void GL_BINDING_CALL
-Debug_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint* params) {
-  GL_SERVICE_LOG("glGetQueryObjectuivARB"
-                 << "(" << id << ", " << GLEnums::GetStringEnum(pname) << ", "
-                 << static_cast<const void*>(params) << ")");
-  g_driver_gl.debug_fn.glGetQueryObjectuivARBFn(id, pname, params);
-}
-
-static void GL_BINDING_CALL
 Debug_glGetRenderbufferParameterivEXT(GLenum target,
                                       GLenum pname,
                                       GLint* params) {
@@ -3685,14 +3603,6 @@
   return result;
 }
 
-static GLboolean GL_BINDING_CALL Debug_glIsQueryARB(GLuint query) {
-  GL_SERVICE_LOG("glIsQueryARB"
-                 << "(" << query << ")");
-  GLboolean result = g_driver_gl.debug_fn.glIsQueryARBFn(query);
-  GL_SERVICE_LOG("GL_RESULT: " << result);
-  return result;
-}
-
 static GLboolean GL_BINDING_CALL
 Debug_glIsRenderbufferEXT(GLuint renderbuffer) {
   GL_SERVICE_LOG("glIsRenderbufferEXT"
@@ -4751,10 +4661,6 @@
     debug_fn.glBeginQueryFn = fn.glBeginQueryFn;
     fn.glBeginQueryFn = Debug_glBeginQuery;
   }
-  if (!debug_fn.glBeginQueryARBFn) {
-    debug_fn.glBeginQueryARBFn = fn.glBeginQueryARBFn;
-    fn.glBeginQueryARBFn = Debug_glBeginQueryARB;
-  }
   if (!debug_fn.glBeginTransformFeedbackFn) {
     debug_fn.glBeginTransformFeedbackFn = fn.glBeginTransformFeedbackFn;
     fn.glBeginTransformFeedbackFn = Debug_glBeginTransformFeedback;
@@ -4968,10 +4874,6 @@
     debug_fn.glDeleteQueriesFn = fn.glDeleteQueriesFn;
     fn.glDeleteQueriesFn = Debug_glDeleteQueries;
   }
-  if (!debug_fn.glDeleteQueriesARBFn) {
-    debug_fn.glDeleteQueriesARBFn = fn.glDeleteQueriesARBFn;
-    fn.glDeleteQueriesARBFn = Debug_glDeleteQueriesARB;
-  }
   if (!debug_fn.glDeleteRenderbuffersEXTFn) {
     debug_fn.glDeleteRenderbuffersEXTFn = fn.glDeleteRenderbuffersEXTFn;
     fn.glDeleteRenderbuffersEXTFn = Debug_glDeleteRenderbuffersEXT;
@@ -5082,10 +4984,6 @@
     debug_fn.glEndQueryFn = fn.glEndQueryFn;
     fn.glEndQueryFn = Debug_glEndQuery;
   }
-  if (!debug_fn.glEndQueryARBFn) {
-    debug_fn.glEndQueryARBFn = fn.glEndQueryARBFn;
-    fn.glEndQueryARBFn = Debug_glEndQueryARB;
-  }
   if (!debug_fn.glEndTransformFeedbackFn) {
     debug_fn.glEndTransformFeedbackFn = fn.glEndTransformFeedbackFn;
     fn.glEndTransformFeedbackFn = Debug_glEndTransformFeedback;
@@ -5166,10 +5064,6 @@
     debug_fn.glGenQueriesFn = fn.glGenQueriesFn;
     fn.glGenQueriesFn = Debug_glGenQueries;
   }
-  if (!debug_fn.glGenQueriesARBFn) {
-    debug_fn.glGenQueriesARBFn = fn.glGenQueriesARBFn;
-    fn.glGenQueriesARBFn = Debug_glGenQueriesARB;
-  }
   if (!debug_fn.glGenRenderbuffersEXTFn) {
     debug_fn.glGenRenderbuffersEXTFn = fn.glGenRenderbuffersEXTFn;
     fn.glGenRenderbuffersEXTFn = Debug_glGenRenderbuffersEXT;
@@ -5292,10 +5186,6 @@
     debug_fn.glGetQueryivFn = fn.glGetQueryivFn;
     fn.glGetQueryivFn = Debug_glGetQueryiv;
   }
-  if (!debug_fn.glGetQueryivARBFn) {
-    debug_fn.glGetQueryivARBFn = fn.glGetQueryivARBFn;
-    fn.glGetQueryivARBFn = Debug_glGetQueryivARB;
-  }
   if (!debug_fn.glGetQueryObjecti64vFn) {
     debug_fn.glGetQueryObjecti64vFn = fn.glGetQueryObjecti64vFn;
     fn.glGetQueryObjecti64vFn = Debug_glGetQueryObjecti64v;
@@ -5304,10 +5194,6 @@
     debug_fn.glGetQueryObjectivFn = fn.glGetQueryObjectivFn;
     fn.glGetQueryObjectivFn = Debug_glGetQueryObjectiv;
   }
-  if (!debug_fn.glGetQueryObjectivARBFn) {
-    debug_fn.glGetQueryObjectivARBFn = fn.glGetQueryObjectivARBFn;
-    fn.glGetQueryObjectivARBFn = Debug_glGetQueryObjectivARB;
-  }
   if (!debug_fn.glGetQueryObjectui64vFn) {
     debug_fn.glGetQueryObjectui64vFn = fn.glGetQueryObjectui64vFn;
     fn.glGetQueryObjectui64vFn = Debug_glGetQueryObjectui64v;
@@ -5316,10 +5202,6 @@
     debug_fn.glGetQueryObjectuivFn = fn.glGetQueryObjectuivFn;
     fn.glGetQueryObjectuivFn = Debug_glGetQueryObjectuiv;
   }
-  if (!debug_fn.glGetQueryObjectuivARBFn) {
-    debug_fn.glGetQueryObjectuivARBFn = fn.glGetQueryObjectuivARBFn;
-    fn.glGetQueryObjectuivARBFn = Debug_glGetQueryObjectuivARB;
-  }
   if (!debug_fn.glGetRenderbufferParameterivEXTFn) {
     debug_fn.glGetRenderbufferParameterivEXTFn =
         fn.glGetRenderbufferParameterivEXTFn;
@@ -5465,10 +5347,6 @@
     debug_fn.glIsQueryFn = fn.glIsQueryFn;
     fn.glIsQueryFn = Debug_glIsQuery;
   }
-  if (!debug_fn.glIsQueryARBFn) {
-    debug_fn.glIsQueryARBFn = fn.glIsQueryARBFn;
-    fn.glIsQueryARBFn = Debug_glIsQueryARB;
-  }
   if (!debug_fn.glIsRenderbufferEXTFn) {
     debug_fn.glIsRenderbufferEXTFn = fn.glIsRenderbufferEXTFn;
     fn.glIsRenderbufferEXTFn = Debug_glIsRenderbufferEXT;
@@ -5948,10 +5826,6 @@
   driver_->fn.glBeginQueryFn(target, id);
 }
 
-void GLApiBase::glBeginQueryARBFn(GLenum target, GLuint id) {
-  driver_->fn.glBeginQueryARBFn(target, id);
-}
-
 void GLApiBase::glBeginTransformFeedbackFn(GLenum primitiveMode) {
   driver_->fn.glBeginTransformFeedbackFn(primitiveMode);
 }
@@ -6292,10 +6166,6 @@
   driver_->fn.glDeleteQueriesFn(n, ids);
 }
 
-void GLApiBase::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
-  driver_->fn.glDeleteQueriesARBFn(n, ids);
-}
-
 void GLApiBase::glDeleteRenderbuffersEXTFn(GLsizei n,
                                            const GLuint* renderbuffers) {
   driver_->fn.glDeleteRenderbuffersEXTFn(n, renderbuffers);
@@ -6425,10 +6295,6 @@
   driver_->fn.glEndQueryFn(target);
 }
 
-void GLApiBase::glEndQueryARBFn(GLenum target) {
-  driver_->fn.glEndQueryARBFn(target);
-}
-
 void GLApiBase::glEndTransformFeedbackFn(void) {
   driver_->fn.glEndTransformFeedbackFn();
 }
@@ -6533,10 +6399,6 @@
   driver_->fn.glGenQueriesFn(n, ids);
 }
 
-void GLApiBase::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
-  driver_->fn.glGenQueriesARBFn(n, ids);
-}
-
 void GLApiBase::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
   driver_->fn.glGenRenderbuffersEXTFn(n, renderbuffers);
 }
@@ -6712,10 +6574,6 @@
   driver_->fn.glGetQueryivFn(target, pname, params);
 }
 
-void GLApiBase::glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) {
-  driver_->fn.glGetQueryivARBFn(target, pname, params);
-}
-
 void GLApiBase::glGetQueryObjecti64vFn(GLuint id,
                                        GLenum pname,
                                        GLint64* params) {
@@ -6726,12 +6584,6 @@
   driver_->fn.glGetQueryObjectivFn(id, pname, params);
 }
 
-void GLApiBase::glGetQueryObjectivARBFn(GLuint id,
-                                        GLenum pname,
-                                        GLint* params) {
-  driver_->fn.glGetQueryObjectivARBFn(id, pname, params);
-}
-
 void GLApiBase::glGetQueryObjectui64vFn(GLuint id,
                                         GLenum pname,
                                         GLuint64* params) {
@@ -6742,12 +6594,6 @@
   driver_->fn.glGetQueryObjectuivFn(id, pname, params);
 }
 
-void GLApiBase::glGetQueryObjectuivARBFn(GLuint id,
-                                         GLenum pname,
-                                         GLuint* params) {
-  driver_->fn.glGetQueryObjectuivARBFn(id, pname, params);
-}
-
 void GLApiBase::glGetRenderbufferParameterivEXTFn(GLenum target,
                                                   GLenum pname,
                                                   GLint* params) {
@@ -6953,10 +6799,6 @@
   return driver_->fn.glIsQueryFn(query);
 }
 
-GLboolean GLApiBase::glIsQueryARBFn(GLuint query) {
-  return driver_->fn.glIsQueryARBFn(query);
-}
-
 GLboolean GLApiBase::glIsRenderbufferEXTFn(GLuint renderbuffer) {
   return driver_->fn.glIsRenderbufferEXTFn(renderbuffer);
 }
@@ -7617,11 +7459,6 @@
   gl_api_->glBeginQueryFn(target, id);
 }
 
-void TraceGLApi::glBeginQueryARBFn(GLenum target, GLuint id) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBeginQueryARB")
-  gl_api_->glBeginQueryARBFn(target, id);
-}
-
 void TraceGLApi::glBeginTransformFeedbackFn(GLenum primitiveMode) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glBeginTransformFeedback")
   gl_api_->glBeginTransformFeedbackFn(primitiveMode);
@@ -8018,11 +7855,6 @@
   gl_api_->glDeleteQueriesFn(n, ids);
 }
 
-void TraceGLApi::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteQueriesARB")
-  gl_api_->glDeleteQueriesARBFn(n, ids);
-}
-
 void TraceGLApi::glDeleteRenderbuffersEXTFn(GLsizei n,
                                             const GLuint* renderbuffers) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glDeleteRenderbuffersEXT")
@@ -8182,11 +8014,6 @@
   gl_api_->glEndQueryFn(target);
 }
 
-void TraceGLApi::glEndQueryARBFn(GLenum target) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEndQueryARB")
-  gl_api_->glEndQueryARBFn(target);
-}
-
 void TraceGLApi::glEndTransformFeedbackFn(void) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glEndTransformFeedback")
   gl_api_->glEndTransformFeedbackFn();
@@ -8313,11 +8140,6 @@
   gl_api_->glGenQueriesFn(n, ids);
 }
 
-void TraceGLApi::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenQueriesARB")
-  gl_api_->glGenQueriesARBFn(n, ids);
-}
-
 void TraceGLApi::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGenRenderbuffersEXT")
   gl_api_->glGenRenderbuffersEXTFn(n, renderbuffers);
@@ -8526,11 +8348,6 @@
   gl_api_->glGetQueryivFn(target, pname, params);
 }
 
-void TraceGLApi::glGetQueryivARBFn(GLenum target, GLenum pname, GLint* params) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryivARB")
-  gl_api_->glGetQueryivARBFn(target, pname, params);
-}
-
 void TraceGLApi::glGetQueryObjecti64vFn(GLuint id,
                                         GLenum pname,
                                         GLint64* params) {
@@ -8543,13 +8360,6 @@
   gl_api_->glGetQueryObjectivFn(id, pname, params);
 }
 
-void TraceGLApi::glGetQueryObjectivARBFn(GLuint id,
-                                         GLenum pname,
-                                         GLint* params) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectivARB")
-  gl_api_->glGetQueryObjectivARBFn(id, pname, params);
-}
-
 void TraceGLApi::glGetQueryObjectui64vFn(GLuint id,
                                          GLenum pname,
                                          GLuint64* params) {
@@ -8564,13 +8374,6 @@
   gl_api_->glGetQueryObjectuivFn(id, pname, params);
 }
 
-void TraceGLApi::glGetQueryObjectuivARBFn(GLuint id,
-                                          GLenum pname,
-                                          GLuint* params) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glGetQueryObjectuivARB")
-  gl_api_->glGetQueryObjectuivARBFn(id, pname, params);
-}
-
 void TraceGLApi::glGetRenderbufferParameterivEXTFn(GLenum target,
                                                    GLenum pname,
                                                    GLint* params) {
@@ -8813,11 +8616,6 @@
   return gl_api_->glIsQueryFn(query);
 }
 
-GLboolean TraceGLApi::glIsQueryARBFn(GLuint query) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsQueryARB")
-  return gl_api_->glIsQueryARBFn(query);
-}
-
 GLboolean TraceGLApi::glIsRenderbufferEXTFn(GLuint renderbuffer) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glIsRenderbufferEXT")
   return gl_api_->glIsRenderbufferEXTFn(renderbuffer);
@@ -9596,11 +9394,6 @@
   LOG(ERROR) << "Trying to call glBeginQuery() without current GL context";
 }
 
-void NoContextGLApi::glBeginQueryARBFn(GLenum target, GLuint id) {
-  NOTREACHED() << "Trying to call glBeginQueryARB() without current GL context";
-  LOG(ERROR) << "Trying to call glBeginQueryARB() without current GL context";
-}
-
 void NoContextGLApi::glBeginTransformFeedbackFn(GLenum primitiveMode) {
   NOTREACHED()
       << "Trying to call glBeginTransformFeedback() without current GL context";
@@ -10043,13 +9836,6 @@
   LOG(ERROR) << "Trying to call glDeleteQueries() without current GL context";
 }
 
-void NoContextGLApi::glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) {
-  NOTREACHED()
-      << "Trying to call glDeleteQueriesARB() without current GL context";
-  LOG(ERROR)
-      << "Trying to call glDeleteQueriesARB() without current GL context";
-}
-
 void NoContextGLApi::glDeleteRenderbuffersEXTFn(GLsizei n,
                                                 const GLuint* renderbuffers) {
   NOTREACHED()
@@ -10233,11 +10019,6 @@
   LOG(ERROR) << "Trying to call glEndQuery() without current GL context";
 }
 
-void NoContextGLApi::glEndQueryARBFn(GLenum target) {
-  NOTREACHED() << "Trying to call glEndQueryARB() without current GL context";
-  LOG(ERROR) << "Trying to call glEndQueryARB() without current GL context";
-}
-
 void NoContextGLApi::glEndTransformFeedbackFn(void) {
   NOTREACHED()
       << "Trying to call glEndTransformFeedback() without current GL context";
@@ -10378,11 +10159,6 @@
   LOG(ERROR) << "Trying to call glGenQueries() without current GL context";
 }
 
-void NoContextGLApi::glGenQueriesARBFn(GLsizei n, GLuint* ids) {
-  NOTREACHED() << "Trying to call glGenQueriesARB() without current GL context";
-  LOG(ERROR) << "Trying to call glGenQueriesARB() without current GL context";
-}
-
 void NoContextGLApi::glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) {
   NOTREACHED()
       << "Trying to call glGenRenderbuffersEXT() without current GL context";
@@ -10630,13 +10406,6 @@
   LOG(ERROR) << "Trying to call glGetQueryiv() without current GL context";
 }
 
-void NoContextGLApi::glGetQueryivARBFn(GLenum target,
-                                       GLenum pname,
-                                       GLint* params) {
-  NOTREACHED() << "Trying to call glGetQueryivARB() without current GL context";
-  LOG(ERROR) << "Trying to call glGetQueryivARB() without current GL context";
-}
-
 void NoContextGLApi::glGetQueryObjecti64vFn(GLuint id,
                                             GLenum pname,
                                             GLint64* params) {
@@ -10655,15 +10424,6 @@
       << "Trying to call glGetQueryObjectiv() without current GL context";
 }
 
-void NoContextGLApi::glGetQueryObjectivARBFn(GLuint id,
-                                             GLenum pname,
-                                             GLint* params) {
-  NOTREACHED()
-      << "Trying to call glGetQueryObjectivARB() without current GL context";
-  LOG(ERROR)
-      << "Trying to call glGetQueryObjectivARB() without current GL context";
-}
-
 void NoContextGLApi::glGetQueryObjectui64vFn(GLuint id,
                                              GLenum pname,
                                              GLuint64* params) {
@@ -10682,15 +10442,6 @@
       << "Trying to call glGetQueryObjectuiv() without current GL context";
 }
 
-void NoContextGLApi::glGetQueryObjectuivARBFn(GLuint id,
-                                              GLenum pname,
-                                              GLuint* params) {
-  NOTREACHED()
-      << "Trying to call glGetQueryObjectuivARB() without current GL context";
-  LOG(ERROR)
-      << "Trying to call glGetQueryObjectuivARB() without current GL context";
-}
-
 void NoContextGLApi::glGetRenderbufferParameterivEXTFn(GLenum target,
                                                        GLenum pname,
                                                        GLint* params) {
@@ -10983,12 +10734,6 @@
   return GL_FALSE;
 }
 
-GLboolean NoContextGLApi::glIsQueryARBFn(GLuint query) {
-  NOTREACHED() << "Trying to call glIsQueryARB() without current GL context";
-  LOG(ERROR) << "Trying to call glIsQueryARB() without current GL context";
-  return GL_FALSE;
-}
-
 GLboolean NoContextGLApi::glIsRenderbufferEXTFn(GLuint renderbuffer) {
   NOTREACHED()
       << "Trying to call glIsRenderbufferEXT() without current GL context";
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h
index 643a236..4a4acc9 100644
--- a/ui/gl/gl_bindings_autogen_gl.h
+++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -19,7 +19,6 @@
 typedef void(GL_BINDING_CALL* glAttachShaderProc)(GLuint program,
                                                   GLuint shader);
 typedef void(GL_BINDING_CALL* glBeginQueryProc)(GLenum target, GLuint id);
-typedef void(GL_BINDING_CALL* glBeginQueryARBProc)(GLenum target, GLuint id);
 typedef void(GL_BINDING_CALL* glBeginTransformFeedbackProc)(
     GLenum primitiveMode);
 typedef void(GL_BINDING_CALL* glBindAttribLocationProc)(GLuint program,
@@ -203,8 +202,6 @@
 typedef void(GL_BINDING_CALL* glDeleteProgramProc)(GLuint program);
 typedef void(GL_BINDING_CALL* glDeleteQueriesProc)(GLsizei n,
                                                    const GLuint* ids);
-typedef void(GL_BINDING_CALL* glDeleteQueriesARBProc)(GLsizei n,
-                                                      const GLuint* ids);
 typedef void(GL_BINDING_CALL* glDeleteRenderbuffersEXTProc)(
     GLsizei n,
     const GLuint* renderbuffers);
@@ -268,7 +265,6 @@
 typedef void(GL_BINDING_CALL* glEnableProc)(GLenum cap);
 typedef void(GL_BINDING_CALL* glEnableVertexAttribArrayProc)(GLuint index);
 typedef void(GL_BINDING_CALL* glEndQueryProc)(GLenum target);
-typedef void(GL_BINDING_CALL* glEndQueryARBProc)(GLenum target);
 typedef void(GL_BINDING_CALL* glEndTransformFeedbackProc)(void);
 typedef GLsync(GL_BINDING_CALL* glFenceSyncProc)(GLenum condition,
                                                  GLbitfield flags);
@@ -316,7 +312,6 @@
 typedef void(GL_BINDING_CALL* glGenFramebuffersEXTProc)(GLsizei n,
                                                         GLuint* framebuffers);
 typedef void(GL_BINDING_CALL* glGenQueriesProc)(GLsizei n, GLuint* ids);
-typedef void(GL_BINDING_CALL* glGenQueriesARBProc)(GLsizei n, GLuint* ids);
 typedef void(GL_BINDING_CALL* glGenRenderbuffersEXTProc)(GLsizei n,
                                                          GLuint* renderbuffers);
 typedef void(GL_BINDING_CALL* glGenSamplersProc)(GLsizei n, GLuint* samplers);
@@ -413,27 +408,18 @@
 typedef void(GL_BINDING_CALL* glGetQueryivProc)(GLenum target,
                                                 GLenum pname,
                                                 GLint* params);
-typedef void(GL_BINDING_CALL* glGetQueryivARBProc)(GLenum target,
-                                                   GLenum pname,
-                                                   GLint* params);
 typedef void(GL_BINDING_CALL* glGetQueryObjecti64vProc)(GLuint id,
                                                         GLenum pname,
                                                         GLint64* params);
 typedef void(GL_BINDING_CALL* glGetQueryObjectivProc)(GLuint id,
                                                       GLenum pname,
                                                       GLint* params);
-typedef void(GL_BINDING_CALL* glGetQueryObjectivARBProc)(GLuint id,
-                                                         GLenum pname,
-                                                         GLint* params);
 typedef void(GL_BINDING_CALL* glGetQueryObjectui64vProc)(GLuint id,
                                                          GLenum pname,
                                                          GLuint64* params);
 typedef void(GL_BINDING_CALL* glGetQueryObjectuivProc)(GLuint id,
                                                        GLenum pname,
                                                        GLuint* params);
-typedef void(GL_BINDING_CALL* glGetQueryObjectuivARBProc)(GLuint id,
-                                                          GLenum pname,
-                                                          GLuint* params);
 typedef void(GL_BINDING_CALL* glGetRenderbufferParameterivEXTProc)(
     GLenum target,
     GLenum pname,
@@ -542,7 +528,6 @@
 typedef GLboolean(GL_BINDING_CALL* glIsFramebufferEXTProc)(GLuint framebuffer);
 typedef GLboolean(GL_BINDING_CALL* glIsProgramProc)(GLuint program);
 typedef GLboolean(GL_BINDING_CALL* glIsQueryProc)(GLuint query);
-typedef GLboolean(GL_BINDING_CALL* glIsQueryARBProc)(GLuint query);
 typedef GLboolean(GL_BINDING_CALL* glIsRenderbufferEXTProc)(
     GLuint renderbuffer);
 typedef GLboolean(GL_BINDING_CALL* glIsSamplerProc)(GLuint sampler);
@@ -943,7 +928,6 @@
   glActiveTextureProc glActiveTextureFn;
   glAttachShaderProc glAttachShaderFn;
   glBeginQueryProc glBeginQueryFn;
-  glBeginQueryARBProc glBeginQueryARBFn;
   glBeginTransformFeedbackProc glBeginTransformFeedbackFn;
   glBindAttribLocationProc glBindAttribLocationFn;
   glBindBufferProc glBindBufferFn;
@@ -997,7 +981,6 @@
   glDeleteFramebuffersEXTProc glDeleteFramebuffersEXTFn;
   glDeleteProgramProc glDeleteProgramFn;
   glDeleteQueriesProc glDeleteQueriesFn;
-  glDeleteQueriesARBProc glDeleteQueriesARBFn;
   glDeleteRenderbuffersEXTProc glDeleteRenderbuffersEXTFn;
   glDeleteSamplersProc glDeleteSamplersFn;
   glDeleteShaderProc glDeleteShaderFn;
@@ -1026,7 +1009,6 @@
   glEnableProc glEnableFn;
   glEnableVertexAttribArrayProc glEnableVertexAttribArrayFn;
   glEndQueryProc glEndQueryFn;
-  glEndQueryARBProc glEndQueryARBFn;
   glEndTransformFeedbackProc glEndTransformFeedbackFn;
   glFenceSyncProc glFenceSyncFn;
   glFinishProc glFinishFn;
@@ -1048,7 +1030,6 @@
   glGenFencesNVProc glGenFencesNVFn;
   glGenFramebuffersEXTProc glGenFramebuffersEXTFn;
   glGenQueriesProc glGenQueriesFn;
-  glGenQueriesARBProc glGenQueriesARBFn;
   glGenRenderbuffersEXTProc glGenRenderbuffersEXTFn;
   glGenSamplersProc glGenSamplersFn;
   glGenTexturesProc glGenTexturesFn;
@@ -1080,13 +1061,10 @@
   glGetProgramivProc glGetProgramivFn;
   glGetProgramResourceLocationProc glGetProgramResourceLocationFn;
   glGetQueryivProc glGetQueryivFn;
-  glGetQueryivARBProc glGetQueryivARBFn;
   glGetQueryObjecti64vProc glGetQueryObjecti64vFn;
   glGetQueryObjectivProc glGetQueryObjectivFn;
-  glGetQueryObjectivARBProc glGetQueryObjectivARBFn;
   glGetQueryObjectui64vProc glGetQueryObjectui64vFn;
   glGetQueryObjectuivProc glGetQueryObjectuivFn;
-  glGetQueryObjectuivARBProc glGetQueryObjectuivARBFn;
   glGetRenderbufferParameterivEXTProc glGetRenderbufferParameterivEXTFn;
   glGetSamplerParameterfvProc glGetSamplerParameterfvFn;
   glGetSamplerParameterivProc glGetSamplerParameterivFn;
@@ -1122,7 +1100,6 @@
   glIsFramebufferEXTProc glIsFramebufferEXTFn;
   glIsProgramProc glIsProgramFn;
   glIsQueryProc glIsQueryFn;
-  glIsQueryARBProc glIsQueryARBFn;
   glIsRenderbufferEXTProc glIsRenderbufferEXTFn;
   glIsSamplerProc glIsSamplerFn;
   glIsShaderProc glIsShaderFn;
@@ -1247,7 +1224,6 @@
   virtual void glActiveTextureFn(GLenum texture) = 0;
   virtual void glAttachShaderFn(GLuint program, GLuint shader) = 0;
   virtual void glBeginQueryFn(GLenum target, GLuint id) = 0;
-  virtual void glBeginQueryARBFn(GLenum target, GLuint id) = 0;
   virtual void glBeginTransformFeedbackFn(GLenum primitiveMode) = 0;
   virtual void glBindAttribLocationFn(GLuint program,
                                       GLuint index,
@@ -1420,7 +1396,6 @@
                                          const GLuint* framebuffers) = 0;
   virtual void glDeleteProgramFn(GLuint program) = 0;
   virtual void glDeleteQueriesFn(GLsizei n, const GLuint* ids) = 0;
-  virtual void glDeleteQueriesARBFn(GLsizei n, const GLuint* ids) = 0;
   virtual void glDeleteRenderbuffersEXTFn(GLsizei n,
                                           const GLuint* renderbuffers) = 0;
   virtual void glDeleteSamplersFn(GLsizei n, const GLuint* samplers) = 0;
@@ -1469,7 +1444,6 @@
   virtual void glEnableFn(GLenum cap) = 0;
   virtual void glEnableVertexAttribArrayFn(GLuint index) = 0;
   virtual void glEndQueryFn(GLenum target) = 0;
-  virtual void glEndQueryARBFn(GLenum target) = 0;
   virtual void glEndTransformFeedbackFn(void) = 0;
   virtual GLsync glFenceSyncFn(GLenum condition, GLbitfield flags) = 0;
   virtual void glFinishFn(void) = 0;
@@ -1512,7 +1486,6 @@
   virtual void glGenFencesNVFn(GLsizei n, GLuint* fences) = 0;
   virtual void glGenFramebuffersEXTFn(GLsizei n, GLuint* framebuffers) = 0;
   virtual void glGenQueriesFn(GLsizei n, GLuint* ids) = 0;
-  virtual void glGenQueriesARBFn(GLsizei n, GLuint* ids) = 0;
   virtual void glGenRenderbuffersEXTFn(GLsizei n, GLuint* renderbuffers) = 0;
   virtual void glGenSamplersFn(GLsizei n, GLuint* samplers) = 0;
   virtual void glGenTexturesFn(GLsizei n, GLuint* textures) = 0;
@@ -1591,25 +1564,16 @@
                                                GLenum programInterface,
                                                const char* name) = 0;
   virtual void glGetQueryivFn(GLenum target, GLenum pname, GLint* params) = 0;
-  virtual void glGetQueryivARBFn(GLenum target,
-                                 GLenum pname,
-                                 GLint* params) = 0;
   virtual void glGetQueryObjecti64vFn(GLuint id,
                                       GLenum pname,
                                       GLint64* params) = 0;
   virtual void glGetQueryObjectivFn(GLuint id, GLenum pname, GLint* params) = 0;
-  virtual void glGetQueryObjectivARBFn(GLuint id,
-                                       GLenum pname,
-                                       GLint* params) = 0;
   virtual void glGetQueryObjectui64vFn(GLuint id,
                                        GLenum pname,
                                        GLuint64* params) = 0;
   virtual void glGetQueryObjectuivFn(GLuint id,
                                      GLenum pname,
                                      GLuint* params) = 0;
-  virtual void glGetQueryObjectuivARBFn(GLuint id,
-                                        GLenum pname,
-                                        GLuint* params) = 0;
   virtual void glGetRenderbufferParameterivEXTFn(GLenum target,
                                                  GLenum pname,
                                                  GLint* params) = 0;
@@ -1705,7 +1669,6 @@
   virtual GLboolean glIsFramebufferEXTFn(GLuint framebuffer) = 0;
   virtual GLboolean glIsProgramFn(GLuint program) = 0;
   virtual GLboolean glIsQueryFn(GLuint query) = 0;
-  virtual GLboolean glIsQueryARBFn(GLuint query) = 0;
   virtual GLboolean glIsRenderbufferEXTFn(GLuint renderbuffer) = 0;
   virtual GLboolean glIsSamplerFn(GLuint sampler) = 0;
   virtual GLboolean glIsShaderFn(GLuint shader) = 0;
@@ -2023,7 +1986,6 @@
 #define glActiveTexture ::gfx::g_current_gl_context->glActiveTextureFn
 #define glAttachShader ::gfx::g_current_gl_context->glAttachShaderFn
 #define glBeginQuery ::gfx::g_current_gl_context->glBeginQueryFn
-#define glBeginQueryARB ::gfx::g_current_gl_context->glBeginQueryARBFn
 #define glBeginTransformFeedback \
   ::gfx::g_current_gl_context->glBeginTransformFeedbackFn
 #define glBindAttribLocation ::gfx::g_current_gl_context->glBindAttribLocationFn
@@ -2089,7 +2051,6 @@
   ::gfx::g_current_gl_context->glDeleteFramebuffersEXTFn
 #define glDeleteProgram ::gfx::g_current_gl_context->glDeleteProgramFn
 #define glDeleteQueries ::gfx::g_current_gl_context->glDeleteQueriesFn
-#define glDeleteQueriesARB ::gfx::g_current_gl_context->glDeleteQueriesARBFn
 #define glDeleteRenderbuffersEXT \
   ::gfx::g_current_gl_context->glDeleteRenderbuffersEXTFn
 #define glDeleteSamplers ::gfx::g_current_gl_context->glDeleteSamplersFn
@@ -2127,7 +2088,6 @@
 #define glEnableVertexAttribArray \
   ::gfx::g_current_gl_context->glEnableVertexAttribArrayFn
 #define glEndQuery ::gfx::g_current_gl_context->glEndQueryFn
-#define glEndQueryARB ::gfx::g_current_gl_context->glEndQueryARBFn
 #define glEndTransformFeedback \
   ::gfx::g_current_gl_context->glEndTransformFeedbackFn
 #define glFenceSync ::gfx::g_current_gl_context->glFenceSyncFn
@@ -2154,7 +2114,6 @@
 #define glGenFencesNV ::gfx::g_current_gl_context->glGenFencesNVFn
 #define glGenFramebuffersEXT ::gfx::g_current_gl_context->glGenFramebuffersEXTFn
 #define glGenQueries ::gfx::g_current_gl_context->glGenQueriesFn
-#define glGenQueriesARB ::gfx::g_current_gl_context->glGenQueriesARBFn
 #define glGenRenderbuffersEXT \
   ::gfx::g_current_gl_context->glGenRenderbuffersEXTFn
 #define glGenSamplers ::gfx::g_current_gl_context->glGenSamplersFn
@@ -2196,16 +2155,11 @@
 #define glGetProgramResourceLocation \
   ::gfx::g_current_gl_context->glGetProgramResourceLocationFn
 #define glGetQueryiv ::gfx::g_current_gl_context->glGetQueryivFn
-#define glGetQueryivARB ::gfx::g_current_gl_context->glGetQueryivARBFn
 #define glGetQueryObjecti64v ::gfx::g_current_gl_context->glGetQueryObjecti64vFn
 #define glGetQueryObjectiv ::gfx::g_current_gl_context->glGetQueryObjectivFn
-#define glGetQueryObjectivARB \
-  ::gfx::g_current_gl_context->glGetQueryObjectivARBFn
 #define glGetQueryObjectui64v \
   ::gfx::g_current_gl_context->glGetQueryObjectui64vFn
 #define glGetQueryObjectuiv ::gfx::g_current_gl_context->glGetQueryObjectuivFn
-#define glGetQueryObjectuivARB \
-  ::gfx::g_current_gl_context->glGetQueryObjectuivARBFn
 #define glGetRenderbufferParameterivEXT \
   ::gfx::g_current_gl_context->glGetRenderbufferParameterivEXTFn
 #define glGetSamplerParameterfv \
@@ -2254,7 +2208,6 @@
 #define glIsFramebufferEXT ::gfx::g_current_gl_context->glIsFramebufferEXTFn
 #define glIsProgram ::gfx::g_current_gl_context->glIsProgramFn
 #define glIsQuery ::gfx::g_current_gl_context->glIsQueryFn
-#define glIsQueryARB ::gfx::g_current_gl_context->glIsQueryARBFn
 #define glIsRenderbufferEXT ::gfx::g_current_gl_context->glIsRenderbufferEXTFn
 #define glIsSampler ::gfx::g_current_gl_context->glIsSamplerFn
 #define glIsShader ::gfx::g_current_gl_context->glIsShaderFn
diff --git a/ui/gl/gl_bindings_autogen_mock.cc b/ui/gl/gl_bindings_autogen_mock.cc
index bf0a857..717198f 100644
--- a/ui/gl/gl_bindings_autogen_mock.cc
+++ b/ui/gl/gl_bindings_autogen_mock.cc
@@ -41,13 +41,13 @@
 void GL_BINDING_CALL
 MockGLInterface::Mock_glBeginQueryARB(GLenum target, GLuint id) {
   MakeFunctionUnique("glBeginQueryARB");
-  interface_->BeginQueryARB(target, id);
+  interface_->BeginQuery(target, id);
 }
 
 void GL_BINDING_CALL
 MockGLInterface::Mock_glBeginQueryEXT(GLenum target, GLuint id) {
   MakeFunctionUnique("glBeginQueryEXT");
-  interface_->BeginQueryARB(target, id);
+  interface_->BeginQuery(target, id);
 }
 
 void GL_BINDING_CALL
@@ -518,13 +518,13 @@
 void GL_BINDING_CALL
 MockGLInterface::Mock_glDeleteQueriesARB(GLsizei n, const GLuint* ids) {
   MakeFunctionUnique("glDeleteQueriesARB");
-  interface_->DeleteQueriesARB(n, ids);
+  interface_->DeleteQueries(n, ids);
 }
 
 void GL_BINDING_CALL
 MockGLInterface::Mock_glDeleteQueriesEXT(GLsizei n, const GLuint* ids) {
   MakeFunctionUnique("glDeleteQueriesEXT");
-  interface_->DeleteQueriesARB(n, ids);
+  interface_->DeleteQueries(n, ids);
 }
 
 void GL_BINDING_CALL
@@ -773,12 +773,12 @@
 
 void GL_BINDING_CALL MockGLInterface::Mock_glEndQueryARB(GLenum target) {
   MakeFunctionUnique("glEndQueryARB");
-  interface_->EndQueryARB(target);
+  interface_->EndQuery(target);
 }
 
 void GL_BINDING_CALL MockGLInterface::Mock_glEndQueryEXT(GLenum target) {
   MakeFunctionUnique("glEndQueryEXT");
-  interface_->EndQueryARB(target);
+  interface_->EndQuery(target);
 }
 
 void GL_BINDING_CALL MockGLInterface::Mock_glEndTransformFeedback(void) {
@@ -941,13 +941,13 @@
 void GL_BINDING_CALL
 MockGLInterface::Mock_glGenQueriesARB(GLsizei n, GLuint* ids) {
   MakeFunctionUnique("glGenQueriesARB");
-  interface_->GenQueriesARB(n, ids);
+  interface_->GenQueries(n, ids);
 }
 
 void GL_BINDING_CALL
 MockGLInterface::Mock_glGenQueriesEXT(GLsizei n, GLuint* ids) {
   MakeFunctionUnique("glGenQueriesEXT");
-  interface_->GenQueriesARB(n, ids);
+  interface_->GenQueries(n, ids);
 }
 
 void GL_BINDING_CALL
@@ -1267,7 +1267,7 @@
                                             GLenum pname,
                                             GLint* params) {
   MakeFunctionUnique("glGetQueryObjectivARB");
-  interface_->GetQueryObjectivARB(id, pname, params);
+  interface_->GetQueryObjectiv(id, pname, params);
 }
 
 void GL_BINDING_CALL
@@ -1275,7 +1275,7 @@
                                             GLenum pname,
                                             GLint* params) {
   MakeFunctionUnique("glGetQueryObjectivEXT");
-  interface_->GetQueryObjectivARB(id, pname, params);
+  interface_->GetQueryObjectiv(id, pname, params);
 }
 
 void GL_BINDING_CALL
@@ -1306,7 +1306,7 @@
                                              GLenum pname,
                                              GLuint* params) {
   MakeFunctionUnique("glGetQueryObjectuivARB");
-  interface_->GetQueryObjectuivARB(id, pname, params);
+  interface_->GetQueryObjectuiv(id, pname, params);
 }
 
 void GL_BINDING_CALL
@@ -1314,7 +1314,7 @@
                                              GLenum pname,
                                              GLuint* params) {
   MakeFunctionUnique("glGetQueryObjectuivEXT");
-  interface_->GetQueryObjectuivARB(id, pname, params);
+  interface_->GetQueryObjectuiv(id, pname, params);
 }
 
 void GL_BINDING_CALL
@@ -1327,14 +1327,14 @@
                                                            GLenum pname,
                                                            GLint* params) {
   MakeFunctionUnique("glGetQueryivARB");
-  interface_->GetQueryivARB(target, pname, params);
+  interface_->GetQueryiv(target, pname, params);
 }
 
 void GL_BINDING_CALL MockGLInterface::Mock_glGetQueryivEXT(GLenum target,
                                                            GLenum pname,
                                                            GLint* params) {
   MakeFunctionUnique("glGetQueryivEXT");
-  interface_->GetQueryivARB(target, pname, params);
+  interface_->GetQueryiv(target, pname, params);
 }
 
 void GL_BINDING_CALL
@@ -1614,12 +1614,12 @@
 
 GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsQueryARB(GLuint query) {
   MakeFunctionUnique("glIsQueryARB");
-  return interface_->IsQueryARB(query);
+  return interface_->IsQuery(query);
 }
 
 GLboolean GL_BINDING_CALL MockGLInterface::Mock_glIsQueryEXT(GLuint query) {
   MakeFunctionUnique("glIsQueryEXT");
-  return interface_->IsQueryARB(query);
+  return interface_->IsQuery(query);
 }
 
 GLboolean GL_BINDING_CALL
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc
index dd8aa26..e64d031 100644
--- a/ui/gl/gl_context.cc
+++ b/ui/gl/gl_context.cc
@@ -4,6 +4,8 @@
 
 #include <string>
 
+#include "base/bind.h"
+#include "base/cancelable_callback.h"
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
@@ -41,8 +43,15 @@
 
 GLContext::GLContext(GLShareGroup* share_group) :
     share_group_(share_group),
+    state_dirtied_externally_(false),
     swap_interval_(1),
-    force_swap_interval_zero_(false) {
+    force_swap_interval_zero_(false),
+    state_dirtied_callback_(
+        base::Bind(&GLContext::SetStateWasDirtiedExternally,
+        // Note that if this is not unretained, it will create a cycle (and
+        // will never be freed.
+        base::Unretained(this),
+        true)) {
   if (!share_group_.get())
     share_group_ = new GLShareGroup;
 
@@ -93,6 +102,24 @@
   return std::string(renderer ? renderer : "");
 }
 
+base::Closure GLContext::GetStateWasDirtiedExternallyCallback() {
+  return state_dirtied_callback_.callback();
+}
+
+void GLContext::RestoreStateIfDirtiedExternally() {
+  NOTREACHED();
+}
+
+bool GLContext::GetStateWasDirtiedExternally() const {
+  DCHECK(virtual_gl_api_);
+  return state_dirtied_externally_;
+}
+
+void GLContext::SetStateWasDirtiedExternally(bool dirtied_externally) {
+  DCHECK(virtual_gl_api_);
+  state_dirtied_externally_ = dirtied_externally;
+}
+
 bool GLContext::HasExtension(const char* name) {
   std::string extensions = GetExtensions();
   extensions += " ";
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h
index 4577be3..9598661 100644
--- a/ui/gl/gl_context.h
+++ b/ui/gl/gl_context.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/basictypes.h"
+#include "base/cancelable_callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/synchronization/cancellation_flag.h"
@@ -16,6 +17,10 @@
 #include "ui/gl/gl_state_restorer.h"
 #include "ui/gl/gpu_preference.h"
 
+namespace gpu {
+class GLContextVirtual;
+}  // namespace gpu
+
 namespace gfx {
 
 class GLSurface;
@@ -130,6 +135,14 @@
   // Returns the GL renderer string. The context must be current.
   virtual std::string GetGLRenderer();
 
+  // Return a callback that, when called, indicates that the state the
+  // underlying context has been changed by code outside of the command buffer,
+  // and will need to be restored.
+  virtual base::Closure GetStateWasDirtiedExternallyCallback();
+
+  // Restore the context's state if it was dirtied by an external caller.
+  virtual void RestoreStateIfDirtiedExternally();
+
  protected:
   virtual ~GLContext();
 
@@ -159,20 +172,27 @@
 
   virtual void OnSetSwapInterval(int interval) = 0;
 
+  bool GetStateWasDirtiedExternally() const;
+  void SetStateWasDirtiedExternally(bool dirtied_externally);
+
  private:
   friend class base::RefCounted<GLContext>;
 
   // For GetRealCurrent.
   friend class VirtualGLApi;
+  friend class gpu::GLContextVirtual;
 
   scoped_refptr<GLShareGroup> share_group_;
   scoped_ptr<VirtualGLApi> virtual_gl_api_;
+  bool state_dirtied_externally_;
   scoped_ptr<GLStateRestorer> state_restorer_;
   scoped_ptr<GLVersionInfo> version_info_;
 
   int swap_interval_;
   bool force_swap_interval_zero_;
 
+  base::CancelableCallback<void()> state_dirtied_callback_;
+
   DISALLOW_COPY_AND_ASSIGN(GLContext);
 };
 
diff --git a/ui/gl/gl_enums_implementation_autogen.h b/ui/gl/gl_enums_implementation_autogen.h
index 5872db9..da97baa 100644
--- a/ui/gl/gl_enums_implementation_autogen.h
+++ b/ui/gl/gl_enums_implementation_autogen.h
@@ -10,4432 +10,4432 @@
 
 static const GLEnums::EnumToString enum_to_string_table[] = {
     {
-     0x8D77,
-     "GL_RGB16UI",
+        0x8D77,
+        "GL_RGB16UI",
     },
     {
-     0x8D76,
-     "GL_RGBA16UI",
+        0x8D76,
+        "GL_RGBA16UI",
     },
     {
-     0x9260,
-     "GL_GCCSO_SHADER_BINARY_FJ",
+        0x9260,
+        "GL_GCCSO_SHADER_BINARY_FJ",
     },
     {
-     0x9009,
-     "GL_TEXTURE_CUBE_MAP_ARRAY_EXT",
+        0x9009,
+        "GL_TEXTURE_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x8D71,
-     "GL_RGB32UI",
+        0x8D71,
+        "GL_RGB32UI",
     },
     {
-     0x8D70,
-     "GL_RGBA32UI",
+        0x8D70,
+        "GL_RGBA32UI",
     },
     {
-     0x8C76,
-     "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
+        0x8C76,
+        "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
     },
     {
-     0x8825,
-     "GL_DRAW_BUFFER0_EXT",
+        0x8825,
+        "GL_DRAW_BUFFER0_EXT",
     },
     {
-     0x8D94,
-     "GL_RED_INTEGER",
+        0x8D94,
+        "GL_RED_INTEGER",
     },
     {
-     0x0BC1,
-     "GL_ALPHA_TEST_FUNC_QCOM",
+        0x0BC1,
+        "GL_ALPHA_TEST_FUNC_QCOM",
     },
     {
-     0x884C,
-     "GL_TEXTURE_COMPARE_MODE_EXT",
+        0x884C,
+        "GL_TEXTURE_COMPARE_MODE_EXT",
     },
     {
-     0x0BC2,
-     "GL_ALPHA_TEST_REF_QCOM",
+        0x0BC2,
+        "GL_ALPHA_TEST_REF_QCOM",
     },
     {
-     0x78EF,
-     "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
+        0x78EF,
+        "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
     },
     {
-     0x884D,
-     "GL_TEXTURE_COMPARE_FUNC_EXT",
+        0x884D,
+        "GL_TEXTURE_COMPARE_FUNC_EXT",
     },
     {
-     0x884E,
-     "GL_COMPARE_REF_TO_TEXTURE_EXT",
+        0x884E,
+        "GL_COMPARE_REF_TO_TEXTURE_EXT",
     },
     {
-     0x8E76,
-     "GL_TESS_GEN_MODE_EXT",
+        0x8E76,
+        "GL_TESS_GEN_MODE_EXT",
     },
     {
-     0x8E77,
-     "GL_TESS_GEN_SPACING_EXT",
+        0x8E77,
+        "GL_TESS_GEN_SPACING_EXT",
     },
     {
-     0x000D,
-     "GL_TRIANGLE_STRIP_ADJACENCY_EXT",
+        0x000D,
+        "GL_TRIANGLE_STRIP_ADJACENCY_EXT",
     },
     {
-     0x000E,
-     "GL_PATCHES_EXT",
+        0x000E,
+        "GL_PATCHES_EXT",
     },
     {
-     0x000B,
-     "GL_LINE_STRIP_ADJACENCY_EXT",
+        0x000B,
+        "GL_LINE_STRIP_ADJACENCY_EXT",
     },
     {
-     0x000C,
-     "GL_TRIANGLES_ADJACENCY_EXT",
+        0x000C,
+        "GL_TRIANGLES_ADJACENCY_EXT",
     },
     {
-     0x000A,
-     "GL_LINES_ADJACENCY_EXT",
+        0x000A,
+        "GL_LINES_ADJACENCY_EXT",
     },
     {
-     0x92CF,
-     "GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT",
+        0x92CF,
+        "GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT",
     },
     {
-     0x93A1,
-     "GL_BGRA8_EXT",
+        0x93A1,
+        "GL_BGRA8_EXT",
     },
     {
-     0x813C,
-     "GL_TEXTURE_BASE_LEVEL",
+        0x813C,
+        "GL_TEXTURE_BASE_LEVEL",
     },
     {
-     0,
-     "GL_FALSE",
+        0,
+        "GL_FALSE",
     },
     {
-     0x00400000,
-     "GL_STENCIL_BUFFER_BIT6_QCOM",
+        0x00400000,
+        "GL_STENCIL_BUFFER_BIT6_QCOM",
     },
     {
-     0x9500,
-     "GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL",
+        0x9500,
+        "GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL",
     },
     {
-     0x78F2,
-     "GL_SCANOUT_CHROMIUM",
+        0x78F2,
+        "GL_SCANOUT_CHROMIUM",
     },
     {
-     0x9138,
-     "GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG",
+        0x9138,
+        "GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG",
     },
     {
-     0x8FC4,
-     "GL_SHADER_BINARY_VIV",
+        0x8FC4,
+        "GL_SHADER_BINARY_VIV",
     },
     {
-     0x9130,
-     "GL_SGX_PROGRAM_BINARY_IMG",
+        0x9130,
+        "GL_SGX_PROGRAM_BINARY_IMG",
     },
     {
-     0x9133,
-     "GL_RENDERBUFFER_SAMPLES_IMG",
+        0x9133,
+        "GL_RENDERBUFFER_SAMPLES_IMG",
     },
     {
-     0x82E0,
-     "GL_BUFFER_KHR",
+        0x82E0,
+        "GL_BUFFER_KHR",
     },
     {
-     0x9135,
-     "GL_MAX_SAMPLES_IMG",
+        0x9135,
+        "GL_MAX_SAMPLES_IMG",
     },
     {
-     0x9134,
-     "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG",
+        0x9134,
+        "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG",
     },
     {
-     0x9137,
-     "GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG",
+        0x9137,
+        "GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG",
     },
     {
-     0x9136,
-     "GL_TEXTURE_SAMPLES_IMG",
+        0x9136,
+        "GL_TEXTURE_SAMPLES_IMG",
     },
     {
-     0x8D88,
-     "GL_RGBA16I",
+        0x8D88,
+        "GL_RGBA16I",
     },
     {
-     0x8D89,
-     "GL_RGB16I",
+        0x8D89,
+        "GL_RGB16I",
     },
     {
-     0x00000020,
-     "GL_COLOR_BUFFER_BIT5_QCOM",
+        0x00000020,
+        "GL_COLOR_BUFFER_BIT5_QCOM",
     },
     {
-     0x0008,
-     "GL_MAP_INVALIDATE_BUFFER_BIT_EXT",
+        0x0008,
+        "GL_MAP_INVALIDATE_BUFFER_BIT_EXT",
     },
     {
-     0x0BC0,
-     "GL_ALPHA_TEST_QCOM",
+        0x0BC0,
+        "GL_ALPHA_TEST_QCOM",
     },
     {
-     0x0006,
-     "GL_TRIANGLE_FAN",
+        0x0006,
+        "GL_TRIANGLE_FAN",
     },
     {
-     0x0007,
-     "GL_QUADS_EXT",
+        0x0007,
+        "GL_QUADS_EXT",
     },
     {
-     0x0004,
-     "GL_TRIANGLES",
+        0x0004,
+        "GL_TRIANGLES",
     },
     {
-     0x0005,
-     "GL_TRIANGLE_STRIP",
+        0x0005,
+        "GL_TRIANGLE_STRIP",
     },
     {
-     0x0002,
-     "GL_LINE_LOOP",
+        0x0002,
+        "GL_LINE_LOOP",
     },
     {
-     0x0003,
-     "GL_LINE_STRIP",
+        0x0003,
+        "GL_LINE_STRIP",
     },
     {
-     0x0000,
-     "GL_POINTS",
+        0x0000,
+        "GL_POINTS",
     },
     {
-     0x0001,
-     "GL_LINES",
+        0x0001,
+        "GL_LINES",
     },
     {
-     0x8D7D,
-     "GL_RGB8UI",
+        0x8D7D,
+        "GL_RGB8UI",
     },
     {
-     0x93F0,
-     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG",
+        0x93F0,
+        "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG",
     },
     {
-     0x93F1,
-     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG",
+        0x93F1,
+        "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG",
     },
     {
-     0x0D04,
-     "GL_PACK_SKIP_PIXELS",
+        0x0D04,
+        "GL_PACK_SKIP_PIXELS",
     },
     {
-     0x900E,
-     "GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
+        0x900E,
+        "GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x900D,
-     "GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT",
+        0x900D,
+        "GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT",
     },
     {
-     0x8C7F,
-     "GL_TRANSFORM_FEEDBACK_BUFFER_MODE",
+        0x8C7F,
+        "GL_TRANSFORM_FEEDBACK_BUFFER_MODE",
     },
     {
-     0x900F,
-     "GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
+        0x900F,
+        "GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x900A,
-     "GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT",
+        0x900A,
+        "GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x900C,
-     "GL_SAMPLER_CUBE_MAP_ARRAY_EXT",
+        0x900C,
+        "GL_SAMPLER_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x88B8,
-     "GL_READ_ONLY",
+        0x88B8,
+        "GL_READ_ONLY",
     },
     {
-     0x88B9,
-     "GL_WRITE_ONLY_OES",
+        0x88B9,
+        "GL_WRITE_ONLY_OES",
     },
     {
-     0x8211,
-     "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT",
+        0x8211,
+        "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT",
     },
     {
-     0x8210,
-     "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT",
+        0x8210,
+        "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT",
     },
     {
-     0x8741,
-     "GL_PROGRAM_BINARY_LENGTH_OES",
+        0x8741,
+        "GL_PROGRAM_BINARY_LENGTH_OES",
     },
     {
-     0x8740,
-     "GL_Z400_BINARY_AMD",
+        0x8740,
+        "GL_Z400_BINARY_AMD",
     },
     {
-     0x8215,
-     "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
+        0x8215,
+        "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
     },
     {
-     0x8C4D,
-     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV",
+        0x8C4D,
+        "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV",
     },
     {
-     0x8192,
-     "GL_GENERATE_MIPMAP_HINT",
+        0x8192,
+        "GL_GENERATE_MIPMAP_HINT",
     },
     {
-     0x8E79,
-     "GL_TESS_GEN_POINT_MODE_EXT",
+        0x8E79,
+        "GL_TESS_GEN_POINT_MODE_EXT",
     },
     {
-     0x8A54,
-     "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT",
+        0x8A54,
+        "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT",
     },
     {
-     0x8A55,
-     "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT",
+        0x8A55,
+        "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT",
     },
     {
-     0x8A56,
-     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT",
+        0x8A56,
+        "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT",
     },
     {
-     0x8A57,
-     "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT",
+        0x8A57,
+        "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT",
     },
     {
-     0x8A51,
-     "GL_RGB_RAW_422_APPLE",
+        0x8A51,
+        "GL_RGB_RAW_422_APPLE",
     },
     {
-     0x87F9,
-     "GL_3DC_X_AMD",
+        0x87F9,
+        "GL_3DC_X_AMD",
     },
     {
-     0x8A53,
-     "GL_SYNC_OBJECT_APPLE",
+        0x8A53,
+        "GL_SYNC_OBJECT_APPLE",
     },
     {
-     0x8DF8,
-     "GL_SHADER_BINARY_FORMATS",
+        0x8DF8,
+        "GL_SHADER_BINARY_FORMATS",
     },
     {
-     0x8DF9,
-     "GL_NUM_SHADER_BINARY_FORMATS",
+        0x8DF9,
+        "GL_NUM_SHADER_BINARY_FORMATS",
     },
     {
-     0x826D,
-     "GL_DEBUG_GROUP_STACK_DEPTH_KHR",
+        0x826D,
+        "GL_DEBUG_GROUP_STACK_DEPTH_KHR",
     },
     {
-     0x8E75,
-     "GL_TESS_CONTROL_OUTPUT_VERTICES_EXT",
+        0x8E75,
+        "GL_TESS_CONTROL_OUTPUT_VERTICES_EXT",
     },
     {
-     0x826B,
-     "GL_DEBUG_SEVERITY_NOTIFICATION_KHR",
+        0x826B,
+        "GL_DEBUG_SEVERITY_NOTIFICATION_KHR",
     },
     {
-     0x826C,
-     "GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR",
+        0x826C,
+        "GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR",
     },
     {
-     0x8B59,
-     "GL_BOOL_VEC4",
+        0x8B59,
+        "GL_BOOL_VEC4",
     },
     {
-     0x826A,
-     "GL_DEBUG_TYPE_POP_GROUP_KHR",
+        0x826A,
+        "GL_DEBUG_TYPE_POP_GROUP_KHR",
     },
     {
-     0x8B57,
-     "GL_BOOL_VEC2",
+        0x8B57,
+        "GL_BOOL_VEC2",
     },
     {
-     0x8DF1,
-     "GL_MEDIUM_FLOAT",
+        0x8DF1,
+        "GL_MEDIUM_FLOAT",
     },
     {
-     0x8B55,
-     "GL_INT_VEC4",
+        0x8B55,
+        "GL_INT_VEC4",
     },
     {
-     0x8B54,
-     "GL_INT_VEC3",
+        0x8B54,
+        "GL_INT_VEC3",
     },
     {
-     0x8DF4,
-     "GL_MEDIUM_INT",
+        0x8DF4,
+        "GL_MEDIUM_INT",
     },
     {
-     0x8DF5,
-     "GL_HIGH_INT",
+        0x8DF5,
+        "GL_HIGH_INT",
     },
     {
-     0x8B51,
-     "GL_FLOAT_VEC3",
+        0x8B51,
+        "GL_FLOAT_VEC3",
     },
     {
-     0x8B50,
-     "GL_FLOAT_VEC2",
+        0x8B50,
+        "GL_FLOAT_VEC2",
     },
     {
-     0x806D,
-     "GL_UNPACK_SKIP_IMAGES",
+        0x806D,
+        "GL_UNPACK_SKIP_IMAGES",
     },
     {
-     0x806E,
-     "GL_UNPACK_IMAGE_HEIGHT",
+        0x806E,
+        "GL_UNPACK_IMAGE_HEIGHT",
     },
     {
-     0x806F,
-     "GL_TEXTURE_3D_OES",
+        0x806F,
+        "GL_TEXTURE_3D_OES",
     },
     {
-     0x92E7,
-     "GL_IS_PER_PATCH_EXT",
+        0x92E7,
+        "GL_IS_PER_PATCH_EXT",
     },
     {
-     0x92E0,
-     "GL_DEBUG_OUTPUT_KHR",
+        0x92E0,
+        "GL_DEBUG_OUTPUT_KHR",
     },
     {
-     0x806A,
-     "GL_TEXTURE_BINDING_3D_OES",
+        0x806A,
+        "GL_TEXTURE_BINDING_3D_OES",
     },
     {
-     0x8D8E,
-     "GL_RGBA8I",
+        0x8D8E,
+        "GL_RGBA8I",
     },
     {
-     0x8CE3,
-     "GL_COLOR_ATTACHMENT3_EXT",
+        0x8CE3,
+        "GL_COLOR_ATTACHMENT3_EXT",
     },
     {
-     0x9274,
-     "GL_COMPRESSED_RGB8_ETC2",
+        0x9274,
+        "GL_COMPRESSED_RGB8_ETC2",
     },
     {
-     0x1904,
-     "GL_GREEN_NV",
+        0x1904,
+        "GL_GREEN_NV",
     },
     {
-     0x928D,
-     "GL_DST_OUT_NV",
+        0x928D,
+        "GL_DST_OUT_NV",
     },
     {
-     0x8069,
-     "GL_TEXTURE_BINDING_2D",
+        0x8069,
+        "GL_TEXTURE_BINDING_2D",
     },
     {
-     0x8A2E,
-     "GL_MAX_COMBINED_UNIFORM_BLOCKS",
+        0x8A2E,
+        "GL_MAX_COMBINED_UNIFORM_BLOCKS",
     },
     {
-     0x8F96,
-     "GL_RGB8_SNORM",
+        0x8F96,
+        "GL_RGB8_SNORM",
     },
     {
-     0x8F95,
-     "GL_RG8_SNORM",
+        0x8F95,
+        "GL_RG8_SNORM",
     },
     {
-     0x8260,
-     "GL_UNDEFINED_VERTEX_EXT",
+        0x8260,
+        "GL_UNDEFINED_VERTEX_EXT",
     },
     {
-     0x8261,
-     "GL_NO_RESET_NOTIFICATION_KHR",
+        0x8261,
+        "GL_NO_RESET_NOTIFICATION_KHR",
     },
     {
-     0x0D02,
-     "GL_PACK_ROW_LENGTH",
+        0x0D02,
+        "GL_PACK_ROW_LENGTH",
     },
     {
-     0x8DFA,
-     "GL_SHADER_COMPILER",
+        0x8DFA,
+        "GL_SHADER_COMPILER",
     },
     {
-     0x8DFB,
-     "GL_MAX_VERTEX_UNIFORM_VECTORS",
+        0x8DFB,
+        "GL_MAX_VERTEX_UNIFORM_VECTORS",
     },
     {
-     0x8DFC,
-     "GL_MAX_VARYING_VECTORS",
+        0x8DFC,
+        "GL_MAX_VARYING_VECTORS",
     },
     {
-     0x8B5C,
-     "GL_FLOAT_MAT4",
+        0x8B5C,
+        "GL_FLOAT_MAT4",
     },
     {
-     0x8B5B,
-     "GL_FLOAT_MAT3",
+        0x8B5B,
+        "GL_FLOAT_MAT3",
     },
     {
-     0x8268,
-     "GL_DEBUG_TYPE_MARKER_KHR",
+        0x8268,
+        "GL_DEBUG_TYPE_MARKER_KHR",
     },
     {
-     0x8269,
-     "GL_DEBUG_TYPE_PUSH_GROUP_KHR",
+        0x8269,
+        "GL_DEBUG_TYPE_PUSH_GROUP_KHR",
     },
     {
-     0x8A43,
-     "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
+        0x8A43,
+        "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
     },
     {
-     0x1905,
-     "GL_BLUE_NV",
+        0x1905,
+        "GL_BLUE_NV",
     },
     {
-     0x87FF,
-     "GL_PROGRAM_BINARY_FORMATS_OES",
+        0x87FF,
+        "GL_PROGRAM_BINARY_FORMATS_OES",
     },
     {
-     0x87FE,
-     "GL_NUM_PROGRAM_BINARY_FORMATS_OES",
+        0x87FE,
+        "GL_NUM_PROGRAM_BINARY_FORMATS_OES",
     },
     {
-     0x8A41,
-     "GL_UNIFORM_BLOCK_NAME_LENGTH",
+        0x8A41,
+        "GL_UNIFORM_BLOCK_NAME_LENGTH",
     },
     {
-     0x2600,
-     "GL_NEAREST",
+        0x2600,
+        "GL_NEAREST",
     },
     {
-     0x2601,
-     "GL_LINEAR",
+        0x2601,
+        "GL_LINEAR",
     },
     {
-     0x8C03,
-     "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG",
+        0x8C03,
+        "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG",
     },
     {
-     0x821B,
-     "GL_MAJOR_VERSION",
+        0x821B,
+        "GL_MAJOR_VERSION",
     },
     {
-     0x821A,
-     "GL_DEPTH_STENCIL_ATTACHMENT",
+        0x821A,
+        "GL_DEPTH_STENCIL_ATTACHMENT",
     },
     {
-     0x8A40,
-     "GL_UNIFORM_BLOCK_DATA_SIZE",
+        0x8A40,
+        "GL_UNIFORM_BLOCK_DATA_SIZE",
     },
     {
-     0x9242,
-     "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM",
+        0x9242,
+        "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM",
     },
     {
-     0x821D,
-     "GL_NUM_EXTENSIONS",
+        0x821D,
+        "GL_NUM_EXTENSIONS",
     },
     {
-     0x88BB,
-     "GL_BUFFER_ACCESS_OES",
+        0x88BB,
+        "GL_BUFFER_ACCESS_OES",
     },
     {
-     0x88BC,
-     "GL_BUFFER_MAPPED_OES",
+        0x88BC,
+        "GL_BUFFER_MAPPED_OES",
     },
     {
-     0x88BD,
-     "GL_BUFFER_MAP_POINTER_OES",
+        0x88BD,
+        "GL_BUFFER_MAP_POINTER_OES",
     },
     {
-     0x88BF,
-     "GL_TIME_ELAPSED_EXT",
+        0x88BF,
+        "GL_TIME_ELAPSED_EXT",
     },
     {
-     0x8A46,
-     "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
+        0x8A46,
+        "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
     },
     {
-     0x6003,
-     "GL_GET_ERROR_QUERY_CHROMIUM",
+        0x6003,
+        "GL_GET_ERROR_QUERY_CHROMIUM",
     },
     {
-     0x8F94,
-     "GL_R8_SNORM",
+        0x8F94,
+        "GL_R8_SNORM",
     },
     {
-     0x0C10,
-     "GL_SCISSOR_BOX",
+        0x0C10,
+        "GL_SCISSOR_BOX",
     },
     {
-     0x0C11,
-     "GL_SCISSOR_TEST",
+        0x0C11,
+        "GL_SCISSOR_TEST",
     },
     {
-     0x1700,
-     "GL_PATH_MODELVIEW_CHROMIUM",
+        0x1700,
+        "GL_PATH_MODELVIEW_CHROMIUM",
     },
     {
-     0x80000000,
-     "GL_MULTISAMPLE_BUFFER_BIT7_QCOM",
+        0x80000000,
+        "GL_MULTISAMPLE_BUFFER_BIT7_QCOM",
     },
     {
-     0x94F8,
-     "GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL",
+        0x94F8,
+        "GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL",
     },
     {
-     0x8A48,
-     "GL_TEXTURE_SRGB_DECODE_EXT",
+        0x8A48,
+        "GL_TEXTURE_SRGB_DECODE_EXT",
     },
     {
-     0x300E,
-     "GL_CONTEXT_LOST",
+        0x300E,
+        "GL_CONTEXT_LOST",
     },
     {
-     0x02000000,
-     "GL_MULTISAMPLE_BUFFER_BIT1_QCOM",
+        0x02000000,
+        "GL_MULTISAMPLE_BUFFER_BIT1_QCOM",
     },
     {
-     0x8C2F,
-     "GL_ANY_SAMPLES_PASSED_EXT",
+        0x8C2F,
+        "GL_ANY_SAMPLES_PASSED_EXT",
     },
     {
-     0x8BD2,
-     "GL_TEXTURE_WIDTH_QCOM",
+        0x8BD2,
+        "GL_TEXTURE_WIDTH_QCOM",
     },
     {
-     0x8C2D,
-     "GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT",
+        0x8C2D,
+        "GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT",
     },
     {
-     0x8C2C,
-     "GL_TEXTURE_BINDING_BUFFER_EXT",
+        0x8C2C,
+        "GL_TEXTURE_BINDING_BUFFER_EXT",
     },
     {
-     0x8C2B,
-     "GL_MAX_TEXTURE_BUFFER_SIZE_EXT",
+        0x8C2B,
+        "GL_MAX_TEXTURE_BUFFER_SIZE_EXT",
     },
     {
-     0x8C2A,
-     "GL_TEXTURE_BUFFER_EXT",
+        0x8C2A,
+        "GL_TEXTURE_BUFFER_EXT",
     },
     {
-     0x8BD7,
-     "GL_TEXTURE_TYPE_QCOM",
+        0x8BD7,
+        "GL_TEXTURE_TYPE_QCOM",
     },
     {
-     0x8B8D,
-     "GL_CURRENT_PROGRAM",
+        0x8B8D,
+        "GL_CURRENT_PROGRAM",
     },
     {
-     0x8BD9,
-     "GL_TEXTURE_NUM_LEVELS_QCOM",
+        0x8BD9,
+        "GL_TEXTURE_NUM_LEVELS_QCOM",
     },
     {
-     0x00200000,
-     "GL_STENCIL_BUFFER_BIT5_QCOM",
+        0x00200000,
+        "GL_STENCIL_BUFFER_BIT5_QCOM",
     },
     {
-     0x8D9F,
-     "GL_INT_2_10_10_10_REV",
+        0x8D9F,
+        "GL_INT_2_10_10_10_REV",
     },
     {
-     0x8B8A,
-     "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH",
+        0x8B8A,
+        "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH",
     },
     {
-     0x8B8B,
-     "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES",
+        0x8B8B,
+        "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES",
     },
     {
-     0x8B8C,
-     "GL_SHADING_LANGUAGE_VERSION",
+        0x8B8C,
+        "GL_SHADING_LANGUAGE_VERSION",
     },
     {
-     0x8BDA,
-     "GL_TEXTURE_TARGET_QCOM",
+        0x8BDA,
+        "GL_TEXTURE_TARGET_QCOM",
     },
     {
-     0x8BDB,
-     "GL_TEXTURE_OBJECT_VALID_QCOM",
+        0x8BDB,
+        "GL_TEXTURE_OBJECT_VALID_QCOM",
     },
     {
-     0x8BDC,
-     "GL_STATE_RESTORE",
+        0x8BDC,
+        "GL_STATE_RESTORE",
     },
     {
-     0x8B88,
-     "GL_SHADER_SOURCE_LENGTH",
+        0x8B88,
+        "GL_SHADER_SOURCE_LENGTH",
     },
     {
-     0x8B89,
-     "GL_ACTIVE_ATTRIBUTES",
+        0x8B89,
+        "GL_ACTIVE_ATTRIBUTES",
     },
     {
-     0x93C9,
-     "GL_COMPRESSED_RGBA_ASTC_6x6x6_OES",
+        0x93C9,
+        "GL_COMPRESSED_RGBA_ASTC_6x6x6_OES",
     },
     {
-     0x93C8,
-     "GL_COMPRESSED_RGBA_ASTC_6x6x5_OES",
+        0x93C8,
+        "GL_COMPRESSED_RGBA_ASTC_6x6x5_OES",
     },
     {
-     0x8B84,
-     "GL_INFO_LOG_LENGTH",
+        0x8B84,
+        "GL_INFO_LOG_LENGTH",
     },
     {
-     0x8B85,
-     "GL_ATTACHED_SHADERS",
+        0x8B85,
+        "GL_ATTACHED_SHADERS",
     },
     {
-     0x8B86,
-     "GL_ACTIVE_UNIFORMS",
+        0x8B86,
+        "GL_ACTIVE_UNIFORMS",
     },
     {
-     0x8B87,
-     "GL_ACTIVE_UNIFORM_MAX_LENGTH",
+        0x8B87,
+        "GL_ACTIVE_UNIFORM_MAX_LENGTH",
     },
     {
-     0x8B80,
-     "GL_DELETE_STATUS",
+        0x8B80,
+        "GL_DELETE_STATUS",
     },
     {
-     0x8B81,
-     "GL_COMPILE_STATUS",
+        0x8B81,
+        "GL_COMPILE_STATUS",
     },
     {
-     0x8B82,
-     "GL_LINK_STATUS",
+        0x8B82,
+        "GL_LINK_STATUS",
     },
     {
-     0x8B83,
-     "GL_VALIDATE_STATUS",
+        0x8B83,
+        "GL_VALIDATE_STATUS",
     },
     {
-     0x9380,
-     "GL_NUM_SAMPLE_COUNTS",
+        0x9380,
+        "GL_NUM_SAMPLE_COUNTS",
     },
     {
-     0x8D48,
-     "GL_STENCIL_INDEX8",
+        0x8D48,
+        "GL_STENCIL_INDEX8",
     },
     {
-     0x8D46,
-     "GL_STENCIL_INDEX1_OES",
+        0x8D46,
+        "GL_STENCIL_INDEX1_OES",
     },
     {
-     0x8D47,
-     "GL_STENCIL_INDEX4_OES",
+        0x8D47,
+        "GL_STENCIL_INDEX4_OES",
     },
     {
-     0x8D44,
-     "GL_RENDERBUFFER_INTERNAL_FORMAT",
+        0x8D44,
+        "GL_RENDERBUFFER_INTERNAL_FORMAT",
     },
     {
-     0x00000100,
-     "GL_DEPTH_BUFFER_BIT",
+        0x00000100,
+        "GL_DEPTH_BUFFER_BIT",
     },
     {
-     0x8D42,
-     "GL_RENDERBUFFER_WIDTH",
+        0x8D42,
+        "GL_RENDERBUFFER_WIDTH",
     },
     {
-     0x8D43,
-     "GL_RENDERBUFFER_HEIGHT",
+        0x8D43,
+        "GL_RENDERBUFFER_HEIGHT",
     },
     {
-     0x8D40,
-     "GL_FRAMEBUFFER",
+        0x8D40,
+        "GL_FRAMEBUFFER",
     },
     {
-     0x8D41,
-     "GL_RENDERBUFFER",
+        0x8D41,
+        "GL_RENDERBUFFER",
     },
     {
-     0x8A3A,
-     "GL_UNIFORM_BLOCK_INDEX",
+        0x8A3A,
+        "GL_UNIFORM_BLOCK_INDEX",
     },
     {
-     0x0BD0,
-     "GL_DITHER",
+        0x0BD0,
+        "GL_DITHER",
     },
     {
-     0x93D3,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR",
+        0x93D3,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR",
     },
     {
-     0x9144,
-     "GL_MAX_DEBUG_LOGGED_MESSAGES_KHR",
+        0x9144,
+        "GL_MAX_DEBUG_LOGGED_MESSAGES_KHR",
     },
     {
-     0x1801,
-     "GL_DEPTH_EXT",
+        0x1801,
+        "GL_DEPTH_EXT",
     },
     {
-     0x1800,
-     "GL_COLOR_EXT",
+        0x1800,
+        "GL_COLOR_EXT",
     },
     {
-     0x1802,
-     "GL_STENCIL_EXT",
+        0x1802,
+        "GL_STENCIL_EXT",
     },
     {
-     0x9288,
-     "GL_SRC_OVER_NV",
+        0x9288,
+        "GL_SRC_OVER_NV",
     },
     {
-     0x9120,
-     "GL_BUFFER_MAP_LENGTH",
+        0x9120,
+        "GL_BUFFER_MAP_LENGTH",
     },
     {
-     0x0B21,
-     "GL_LINE_WIDTH",
+        0x0B21,
+        "GL_LINE_WIDTH",
     },
     {
-     0x9308,
-     "GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT",
+        0x9308,
+        "GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT",
     },
     {
-     0x81A5,
-     "GL_DEPTH_COMPONENT16",
+        0x81A5,
+        "GL_DEPTH_COMPONENT16",
     },
     {
-     0x81A6,
-     "GL_DEPTH_COMPONENT24_OES",
+        0x81A6,
+        "GL_DEPTH_COMPONENT24_OES",
     },
     {
-     0x81A7,
-     "GL_DEPTH_COMPONENT32_OES",
+        0x81A7,
+        "GL_DEPTH_COMPONENT32_OES",
     },
     {
-     0x88FD,
-     "GL_VERTEX_ATTRIB_ARRAY_INTEGER",
+        0x88FD,
+        "GL_VERTEX_ATTRIB_ARRAY_INTEGER",
     },
     {
-     0x88FE,
-     "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE",
+        0x88FE,
+        "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE",
     },
     {
-     0x88FF,
-     "GL_MAX_ARRAY_TEXTURE_LAYERS",
+        0x88FF,
+        "GL_MAX_ARRAY_TEXTURE_LAYERS",
     },
     {
-     0x8B6A,
-     "GL_FLOAT_MAT4x3_NV",
+        0x8B6A,
+        "GL_FLOAT_MAT4x3_NV",
     },
     {
-     0x93D0,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR",
+        0x93D0,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR",
     },
     {
-     0x9143,
-     "GL_MAX_DEBUG_MESSAGE_LENGTH_KHR",
+        0x9143,
+        "GL_MAX_DEBUG_MESSAGE_LENGTH_KHR",
     },
     {
-     0x8DFD,
-     "GL_MAX_FRAGMENT_UNIFORM_VECTORS",
+        0x8DFD,
+        "GL_MAX_FRAGMENT_UNIFORM_VECTORS",
     },
     {
-     0x9145,
-     "GL_DEBUG_LOGGED_MESSAGES_KHR",
+        0x9145,
+        "GL_DEBUG_LOGGED_MESSAGES_KHR",
     },
     {
-     0x9146,
-     "GL_DEBUG_SEVERITY_HIGH_KHR",
+        0x9146,
+        "GL_DEBUG_SEVERITY_HIGH_KHR",
     },
     {
-     0x9147,
-     "GL_DEBUG_SEVERITY_MEDIUM_KHR",
+        0x9147,
+        "GL_DEBUG_SEVERITY_MEDIUM_KHR",
     },
     {
-     0x9148,
-     "GL_DEBUG_SEVERITY_LOW_KHR",
+        0x9148,
+        "GL_DEBUG_SEVERITY_LOW_KHR",
     },
     {
-     0x8F63,
-     "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT",
+        0x8F63,
+        "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT",
     },
     {
-     0x8F60,
-     "GL_MALI_SHADER_BINARY_ARM",
+        0x8F60,
+        "GL_MALI_SHADER_BINARY_ARM",
     },
     {
-     0x8F61,
-     "GL_MALI_PROGRAM_BINARY_ARM",
+        0x8F61,
+        "GL_MALI_PROGRAM_BINARY_ARM",
     },
     {
-     0x8F66,
-     "GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM",
+        0x8F66,
+        "GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM",
     },
     {
-     0x8F67,
-     "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT",
+        0x8F67,
+        "GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT",
     },
     {
-     0x8F64,
-     "GL_SHADER_PIXEL_LOCAL_STORAGE_EXT",
+        0x8F64,
+        "GL_SHADER_PIXEL_LOCAL_STORAGE_EXT",
     },
     {
-     0x8F65,
-     "GL_FETCH_PER_SAMPLE_ARM",
+        0x8F65,
+        "GL_FETCH_PER_SAMPLE_ARM",
     },
     {
-     0x92D3,
-     "GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT",
+        0x92D3,
+        "GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT",
     },
     {
-     0x87EE,
-     "GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD",
+        0x87EE,
+        "GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD",
     },
     {
-     0x822B,
-     "GL_RG8_EXT",
+        0x822B,
+        "GL_RG8_EXT",
     },
     {
-     0x822F,
-     "GL_RG16F_EXT",
+        0x822F,
+        "GL_RG16F_EXT",
     },
     {
-     0x822D,
-     "GL_R16F_EXT",
+        0x822D,
+        "GL_R16F_EXT",
     },
     {
-     0x822E,
-     "GL_R32F_EXT",
+        0x822E,
+        "GL_R32F_EXT",
     },
     {
-     1,
-     "GL_ES_VERSION_2_0",
+        1,
+        "GL_ES_VERSION_2_0",
     },
     {
-     0x84F9,
-     "GL_DEPTH_STENCIL_OES",
+        0x84F9,
+        "GL_DEPTH_STENCIL_OES",
     },
     {
-     0x82DB,
-     "GL_TEXTURE_VIEW_MIN_LEVEL_EXT",
+        0x82DB,
+        "GL_TEXTURE_VIEW_MIN_LEVEL_EXT",
     },
     {
-     0x8368,
-     "GL_UNSIGNED_INT_2_10_10_10_REV_EXT",
+        0x8368,
+        "GL_UNSIGNED_INT_2_10_10_10_REV_EXT",
     },
     {
-     0x8819,
-     "GL_LUMINANCE_ALPHA32F_EXT",
+        0x8819,
+        "GL_LUMINANCE_ALPHA32F_EXT",
     },
     {
-     0x8818,
-     "GL_LUMINANCE32F_EXT",
+        0x8818,
+        "GL_LUMINANCE32F_EXT",
     },
     {
-     0x82DF,
-     "GL_TEXTURE_IMMUTABLE_LEVELS",
+        0x82DF,
+        "GL_TEXTURE_IMMUTABLE_LEVELS",
     },
     {
-     0x8363,
-     "GL_UNSIGNED_SHORT_5_6_5",
+        0x8363,
+        "GL_UNSIGNED_SHORT_5_6_5",
     },
     {
-     0x9051,
-     "GL_IMAGE_BUFFER_EXT",
+        0x9051,
+        "GL_IMAGE_BUFFER_EXT",
     },
     {
-     0x84F2,
-     "GL_ALL_COMPLETED_NV",
+        0x84F2,
+        "GL_ALL_COMPLETED_NV",
     },
     {
-     0x8E5A,
-     "GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT",
+        0x8E5A,
+        "GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT",
     },
     {
-     0x84F4,
-     "GL_FENCE_CONDITION_NV",
+        0x84F4,
+        "GL_FENCE_CONDITION_NV",
     },
     {
-     0x8366,
-     "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT",
+        0x8366,
+        "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT",
     },
     {
-     0x8365,
-     "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT",
+        0x8365,
+        "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT",
     },
     {
-     0x84F7,
-     "GL_COMMANDS_COMPLETED_CHROMIUM",
+        0x84F7,
+        "GL_COMMANDS_COMPLETED_CHROMIUM",
     },
     {
-     0x8F9C,
-     "GL_SIGNED_NORMALIZED",
+        0x8F9C,
+        "GL_SIGNED_NORMALIZED",
     },
     {
-     0x92D5,
-     "GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT",
+        0x92D5,
+        "GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT",
     },
     {
-     0x881E,
-     "GL_LUMINANCE16F_EXT",
+        0x881E,
+        "GL_LUMINANCE16F_EXT",
     },
     {
-     0x84FA,
-     "GL_UNSIGNED_INT_24_8_OES",
+        0x84FA,
+        "GL_UNSIGNED_INT_24_8_OES",
     },
     {
-     0x92D4,
-     "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT",
+        0x92D4,
+        "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT",
     },
     {
-     0x881A,
-     "GL_RGBA16F_EXT",
+        0x881A,
+        "GL_RGBA16F_EXT",
     },
     {
-     0x84FE,
-     "GL_TEXTURE_MAX_ANISOTROPY_EXT",
+        0x84FE,
+        "GL_TEXTURE_MAX_ANISOTROPY_EXT",
     },
     {
-     0x0901,
-     "GL_CCW",
+        0x0901,
+        "GL_CCW",
     },
     {
-     0x0900,
-     "GL_CW",
+        0x0900,
+        "GL_CW",
     },
     {
-     0x9317,
-     "GL_MAX_FRAMEBUFFER_LAYERS_EXT",
+        0x9317,
+        "GL_MAX_FRAMEBUFFER_LAYERS_EXT",
     },
     {
-     0x8229,
-     "GL_R8_EXT",
+        0x8229,
+        "GL_R8_EXT",
     },
     {
-     0x8230,
-     "GL_RG32F_EXT",
+        0x8230,
+        "GL_RG32F_EXT",
     },
     {
-     0x9312,
-     "GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT",
+        0x9312,
+        "GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT",
     },
     {
-     0x9283,
-     "GL_DISJOINT_NV",
+        0x9283,
+        "GL_DISJOINT_NV",
     },
     {
-     0x8221,
-     "GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED",
+        0x8221,
+        "GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED",
     },
     {
-     0x8227,
-     "GL_RG_EXT",
+        0x8227,
+        "GL_RG_EXT",
     },
     {
-     0x8B66,
-     "GL_FLOAT_MAT2x4_NV",
+        0x8B66,
+        "GL_FLOAT_MAT2x4_NV",
     },
     {
-     0x8B67,
-     "GL_FLOAT_MAT3x2_NV",
+        0x8B67,
+        "GL_FLOAT_MAT3x2_NV",
     },
     {
-     0x8E1E,
-     "GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
+        0x8E1E,
+        "GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x8B62,
-     "GL_SAMPLER_2D_SHADOW_EXT",
+        0x8B62,
+        "GL_SAMPLER_2D_SHADOW_EXT",
     },
     {
-     0x8B63,
-     "GL_SAMPLER_2D_RECT_ARB",
+        0x8B63,
+        "GL_SAMPLER_2D_RECT_ARB",
     },
     {
-     0x8B60,
-     "GL_SAMPLER_CUBE",
+        0x8B60,
+        "GL_SAMPLER_CUBE",
     },
     {
-     0x00001000,
-     "GL_DEPTH_BUFFER_BIT4_QCOM",
+        0x00001000,
+        "GL_DEPTH_BUFFER_BIT4_QCOM",
     },
     {
-     0x8B68,
-     "GL_FLOAT_MAT3x4_NV",
+        0x8B68,
+        "GL_FLOAT_MAT3x4_NV",
     },
     {
-     0x83F0,
-     "GL_COMPRESSED_RGB_S3TC_DXT1_EXT",
+        0x83F0,
+        "GL_COMPRESSED_RGB_S3TC_DXT1_EXT",
     },
     {
-     0x8D6A,
-     "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT",
+        0x8D6A,
+        "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT",
     },
     {
-     0x00000080,
-     "GL_COLOR_BUFFER_BIT7_QCOM",
+        0x00000080,
+        "GL_COLOR_BUFFER_BIT7_QCOM",
     },
     {
-     0x88F0,
-     "GL_DEPTH24_STENCIL8_OES",
+        0x88F0,
+        "GL_DEPTH24_STENCIL8_OES",
     },
     {
-     0x8E1F,
-     "GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
+        0x8E1F,
+        "GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x80A0,
-     "GL_SAMPLE_COVERAGE",
+        0x80A0,
+        "GL_SAMPLE_COVERAGE",
     },
     {
-     0x928F,
-     "GL_DST_ATOP_NV",
+        0x928F,
+        "GL_DST_ATOP_NV",
     },
     {
-     0x8213,
-     "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
+        0x8213,
+        "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
     },
     {
-     0x80A9,
-     "GL_SAMPLES",
+        0x80A9,
+        "GL_SAMPLES",
     },
     {
-     0x80A8,
-     "GL_SAMPLE_BUFFERS",
+        0x80A8,
+        "GL_SAMPLE_BUFFERS",
     },
     {
-     0x0D55,
-     "GL_ALPHA_BITS",
+        0x0D55,
+        "GL_ALPHA_BITS",
     },
     {
-     0x0D54,
-     "GL_BLUE_BITS",
+        0x0D54,
+        "GL_BLUE_BITS",
     },
     {
-     0x0D57,
-     "GL_STENCIL_BITS",
+        0x0D57,
+        "GL_STENCIL_BITS",
     },
     {
-     0x0D56,
-     "GL_DEPTH_BITS",
+        0x0D56,
+        "GL_DEPTH_BITS",
     },
     {
-     0x8CD5,
-     "GL_FRAMEBUFFER_COMPLETE",
+        0x8CD5,
+        "GL_FRAMEBUFFER_COMPLETE",
     },
     {
-     0x0D50,
-     "GL_SUBPIXEL_BITS",
+        0x0D50,
+        "GL_SUBPIXEL_BITS",
     },
     {
-     0x0D53,
-     "GL_GREEN_BITS",
+        0x0D53,
+        "GL_GREEN_BITS",
     },
     {
-     0x0D52,
-     "GL_RED_BITS",
+        0x0D52,
+        "GL_RED_BITS",
     },
     {
-     0x8037,
-     "GL_POLYGON_OFFSET_FILL",
+        0x8037,
+        "GL_POLYGON_OFFSET_FILL",
     },
     {
-     0x928C,
-     "GL_SRC_OUT_NV",
+        0x928C,
+        "GL_SRC_OUT_NV",
     },
     {
-     0x8034,
-     "GL_UNSIGNED_SHORT_5_5_5_1",
+        0x8034,
+        "GL_UNSIGNED_SHORT_5_5_5_1",
     },
     {
-     0x8033,
-     "GL_UNSIGNED_SHORT_4_4_4_4",
+        0x8033,
+        "GL_UNSIGNED_SHORT_4_4_4_4",
     },
     {
-     0x928B,
-     "GL_DST_IN_NV",
+        0x928B,
+        "GL_DST_IN_NV",
     },
     {
-     0x0305,
-     "GL_ONE_MINUS_DST_ALPHA",
+        0x0305,
+        "GL_ONE_MINUS_DST_ALPHA",
     },
     {
-     0x0304,
-     "GL_DST_ALPHA",
+        0x0304,
+        "GL_DST_ALPHA",
     },
     {
-     0x0307,
-     "GL_ONE_MINUS_DST_COLOR",
+        0x0307,
+        "GL_ONE_MINUS_DST_COLOR",
     },
     {
-     0x0306,
-     "GL_DST_COLOR",
+        0x0306,
+        "GL_DST_COLOR",
     },
     {
-     0x0301,
-     "GL_ONE_MINUS_SRC_COLOR",
+        0x0301,
+        "GL_ONE_MINUS_SRC_COLOR",
     },
     {
-     0x0300,
-     "GL_SRC_COLOR",
+        0x0300,
+        "GL_SRC_COLOR",
     },
     {
-     0x0303,
-     "GL_ONE_MINUS_SRC_ALPHA",
+        0x0303,
+        "GL_ONE_MINUS_SRC_ALPHA",
     },
     {
-     0x0302,
-     "GL_SRC_ALPHA",
+        0x0302,
+        "GL_SRC_ALPHA",
     },
     {
-     0x8212,
-     "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE",
+        0x8212,
+        "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE",
     },
     {
-     0x0308,
-     "GL_SRC_ALPHA_SATURATE",
+        0x0308,
+        "GL_SRC_ALPHA_SATURATE",
     },
     {
-     0x2A00,
-     "GL_POLYGON_OFFSET_UNITS",
+        0x2A00,
+        "GL_POLYGON_OFFSET_UNITS",
     },
     {
-     0xFFFFFFFF,
-     "GL_ALL_SHADER_BITS_EXT",
+        0xFFFFFFFF,
+        "GL_ALL_SHADER_BITS_EXT",
     },
     {
-     0x82DC,
-     "GL_TEXTURE_VIEW_NUM_LEVELS_EXT",
+        0x82DC,
+        "GL_TEXTURE_VIEW_NUM_LEVELS_EXT",
     },
     {
-     0x8C29,
-     "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT",
+        0x8C29,
+        "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT",
     },
     {
-     0x82DD,
-     "GL_TEXTURE_VIEW_MIN_LAYER_EXT",
+        0x82DD,
+        "GL_TEXTURE_VIEW_MIN_LAYER_EXT",
     },
     {
-     0x00800000,
-     "GL_STENCIL_BUFFER_BIT7_QCOM",
+        0x00800000,
+        "GL_STENCIL_BUFFER_BIT7_QCOM",
     },
     {
-     0x82DE,
-     "GL_TEXTURE_VIEW_NUM_LAYERS_EXT",
+        0x82DE,
+        "GL_TEXTURE_VIEW_NUM_LAYERS_EXT",
     },
     {
-     0x00020000,
-     "GL_STENCIL_BUFFER_BIT1_QCOM",
+        0x00020000,
+        "GL_STENCIL_BUFFER_BIT1_QCOM",
     },
     {
-     0x8D00,
-     "GL_DEPTH_ATTACHMENT",
+        0x8D00,
+        "GL_DEPTH_ATTACHMENT",
     },
     {
-     0x8FA0,
-     "GL_PERFMON_GLOBAL_MODE_QCOM",
+        0x8FA0,
+        "GL_PERFMON_GLOBAL_MODE_QCOM",
     },
     {
-     0x8815,
-     "GL_RGB32F_EXT",
+        0x8815,
+        "GL_RGB32F_EXT",
     },
     {
-     0x8A35,
-     "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
+        0x8A35,
+        "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
     },
     {
-     0x8814,
-     "GL_RGBA32F_EXT",
+        0x8814,
+        "GL_RGBA32F_EXT",
     },
     {
-     0x9277,
-     "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+        0x9277,
+        "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
     },
     {
-     0x6004,
-     "GL_COMMANDS_ISSUED_CHROMIUM",
+        0x6004,
+        "GL_COMMANDS_ISSUED_CHROMIUM",
     },
     {
-     0x813D,
-     "GL_TEXTURE_MAX_LEVEL_APPLE",
+        0x813D,
+        "GL_TEXTURE_MAX_LEVEL_APPLE",
     },
     {
-     0x8816,
-     "GL_ALPHA32F_EXT",
+        0x8816,
+        "GL_ALPHA32F_EXT",
     },
     {
-     0x813B,
-     "GL_TEXTURE_MAX_LOD",
+        0x813B,
+        "GL_TEXTURE_MAX_LOD",
     },
     {
-     0x8CDD,
-     "GL_FRAMEBUFFER_UNSUPPORTED",
+        0x8CDD,
+        "GL_FRAMEBUFFER_UNSUPPORTED",
     },
     {
-     0x8CDF,
-     "GL_MAX_COLOR_ATTACHMENTS_EXT",
+        0x8CDF,
+        "GL_MAX_COLOR_ATTACHMENTS_EXT",
     },
     {
-     0x90F3,
-     "GL_CONTEXT_ROBUST_ACCESS_KHR",
+        0x90F3,
+        "GL_CONTEXT_ROBUST_ACCESS_KHR",
     },
     {
-     0x90F2,
-     "GL_MAX_MULTIVIEW_BUFFERS_EXT",
+        0x90F2,
+        "GL_MAX_MULTIVIEW_BUFFERS_EXT",
     },
     {
-     0x90F1,
-     "GL_MULTIVIEW_EXT",
+        0x90F1,
+        "GL_MULTIVIEW_EXT",
     },
     {
-     0x90F0,
-     "GL_COLOR_ATTACHMENT_EXT",
+        0x90F0,
+        "GL_COLOR_ATTACHMENT_EXT",
     },
     {
-     0x803C,
-     "GL_ALPHA8_OES",
+        0x803C,
+        "GL_ALPHA8_OES",
     },
     {
-     0x8904,
-     "GL_MIN_PROGRAM_TEXEL_OFFSET",
+        0x8904,
+        "GL_MIN_PROGRAM_TEXEL_OFFSET",
     },
     {
-     0x84F5,
-     "GL_TEXTURE_RECTANGLE_ARB",
+        0x84F5,
+        "GL_TEXTURE_RECTANGLE_ARB",
     },
     {
-     0x882A,
-     "GL_DRAW_BUFFER5_EXT",
+        0x882A,
+        "GL_DRAW_BUFFER5_EXT",
     },
     {
-     0x8E7F,
-     "GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
+        0x8E7F,
+        "GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x80AA,
-     "GL_SAMPLE_COVERAGE_VALUE",
+        0x80AA,
+        "GL_SAMPLE_COVERAGE_VALUE",
     },
     {
-     0x84F6,
-     "GL_TEXTURE_BINDING_RECTANGLE_ARB",
+        0x84F6,
+        "GL_TEXTURE_BINDING_RECTANGLE_ARB",
     },
     {
-     0x80AB,
-     "GL_SAMPLE_COVERAGE_INVERT",
+        0x80AB,
+        "GL_SAMPLE_COVERAGE_INVERT",
     },
     {
-     0x8E7D,
-     "GL_MAX_PATCH_VERTICES_EXT",
+        0x8E7D,
+        "GL_MAX_PATCH_VERTICES_EXT",
     },
     {
-     0x6005,
-     "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM",
+        0x6005,
+        "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM",
     },
     {
-     0x9105,
-     "GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES",
+        0x9105,
+        "GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES",
     },
     {
-     0x8E7E,
-     "GL_MAX_TESS_GEN_LEVEL_EXT",
+        0x8E7E,
+        "GL_MAX_TESS_GEN_LEVEL_EXT",
     },
     {
-     0x9102,
-     "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES",
+        0x9102,
+        "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES",
     },
     {
-     0x8C40,
-     "GL_SRGB_EXT",
+        0x8C40,
+        "GL_SRGB_EXT",
     },
     {
-     0x8236,
-     "GL_R32UI",
+        0x8236,
+        "GL_R32UI",
     },
     {
-     0x8E7B,
-     "GL_FRACTIONAL_ODD_EXT",
+        0x8E7B,
+        "GL_FRACTIONAL_ODD_EXT",
     },
     {
-     0x00000040,
-     "GL_COLOR_BUFFER_BIT6_QCOM",
+        0x00000040,
+        "GL_COLOR_BUFFER_BIT6_QCOM",
     },
     {
-     0x882B,
-     "GL_DRAW_BUFFER6_EXT",
+        0x882B,
+        "GL_DRAW_BUFFER6_EXT",
     },
     {
-     0x8E7C,
-     "GL_FRACTIONAL_EVEN_EXT",
+        0x8E7C,
+        "GL_FRACTIONAL_EVEN_EXT",
     },
     {
-     0x8C8E,
-     "GL_TRANSFORM_FEEDBACK_BUFFER",
+        0x8C8E,
+        "GL_TRANSFORM_FEEDBACK_BUFFER",
     },
     {
-     0x8C8D,
-     "GL_SEPARATE_ATTRIBS",
+        0x8C8D,
+        "GL_SEPARATE_ATTRIBS",
     },
     {
-     0x8C8F,
-     "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING",
+        0x8C8F,
+        "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING",
     },
     {
-     0x8C8A,
-     "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
+        0x8C8A,
+        "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
     },
     {
-     0x8C8C,
-     "GL_INTERLEAVED_ATTRIBS",
+        0x8C8C,
+        "GL_INTERLEAVED_ATTRIBS",
     },
     {
-     0x8C8B,
-     "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
+        0x8C8B,
+        "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
     },
     {
-     0x8C17,
-     "GL_UNSIGNED_NORMALIZED_EXT",
+        0x8C17,
+        "GL_UNSIGNED_NORMALIZED_EXT",
     },
     {
-     0x8A3E,
-     "GL_UNIFORM_IS_ROW_MAJOR",
+        0x8A3E,
+        "GL_UNIFORM_IS_ROW_MAJOR",
     },
     {
-     0x8E7A,
-     "GL_ISOLINES_EXT",
+        0x8E7A,
+        "GL_ISOLINES_EXT",
     },
     {
-     0x6006,
-     "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM",
+        0x6006,
+        "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM",
     },
     {
-     0x8D99,
-     "GL_RGBA_INTEGER",
+        0x8D99,
+        "GL_RGBA_INTEGER",
     },
     {
-     0x8D98,
-     "GL_RGB_INTEGER",
+        0x8D98,
+        "GL_RGB_INTEGER",
     },
     {
-     0x8A4A,
-     "GL_SKIP_DECODE_EXT",
+        0x8A4A,
+        "GL_SKIP_DECODE_EXT",
     },
     {
-     0x8A4F,
-     "GL_PROGRAM_PIPELINE_OBJECT_EXT",
+        0x8A4F,
+        "GL_PROGRAM_PIPELINE_OBJECT_EXT",
     },
     {
-     0x882C,
-     "GL_DRAW_BUFFER7_EXT",
+        0x882C,
+        "GL_DRAW_BUFFER7_EXT",
     },
     {
-     0x0010,
-     "GL_MAP_FLUSH_EXPLICIT_BIT_EXT",
+        0x0010,
+        "GL_MAP_FLUSH_EXPLICIT_BIT_EXT",
     },
     {
-     0x8918,
-     "GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT",
+        0x8918,
+        "GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT",
     },
     {
-     0x8919,
-     "GL_SAMPLER_BINDING",
+        0x8919,
+        "GL_SAMPLER_BINDING",
     },
     {
-     0x92CD,
-     "GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT",
+        0x92CD,
+        "GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT",
     },
     {
-     0x92CE,
-     "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT",
+        0x92CE,
+        "GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT",
     },
     {
-     0x8C85,
-     "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE",
+        0x8C85,
+        "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE",
     },
     {
-     0x8D7C,
-     "GL_RGBA8UI",
+        0x8D7C,
+        "GL_RGBA8UI",
     },
     {
-     0x6007,
-     "GL_LATENCY_QUERY_CHROMIUM",
+        0x6007,
+        "GL_LATENCY_QUERY_CHROMIUM",
     },
     {
-     0x8D83,
-     "GL_RGB32I",
+        0x8D83,
+        "GL_RGB32I",
     },
     {
-     0x8916,
-     "GL_GEOMETRY_LINKED_VERTICES_OUT_EXT",
+        0x8916,
+        "GL_GEOMETRY_LINKED_VERTICES_OUT_EXT",
     },
     {
-     0x8917,
-     "GL_GEOMETRY_LINKED_INPUT_TYPE_EXT",
+        0x8917,
+        "GL_GEOMETRY_LINKED_INPUT_TYPE_EXT",
     },
     {
-     0x881F,
-     "GL_LUMINANCE_ALPHA16F_EXT",
+        0x881F,
+        "GL_LUMINANCE_ALPHA16F_EXT",
     },
     {
-     0x84FD,
-     "GL_MAX_TEXTURE_LOD_BIAS",
+        0x84FD,
+        "GL_MAX_TEXTURE_LOD_BIAS",
     },
     {
-     0x882D,
-     "GL_DRAW_BUFFER8_EXT",
+        0x882D,
+        "GL_DRAW_BUFFER8_EXT",
     },
     {
-     0x0BA6,
-     "GL_PATH_MODELVIEW_MATRIX_CHROMIUM",
+        0x0BA6,
+        "GL_PATH_MODELVIEW_MATRIX_CHROMIUM",
     },
     {
-     0x8A42,
-     "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS",
+        0x8A42,
+        "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS",
     },
     {
-     0x8F37,
-     "GL_COPY_WRITE_BUFFER_NV",
+        0x8F37,
+        "GL_COPY_WRITE_BUFFER_NV",
     },
     {
-     0x8F36,
-     "GL_COPY_READ_BUFFER_NV",
+        0x8F36,
+        "GL_COPY_READ_BUFFER_NV",
     },
     {
-     0x84FF,
-     "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT",
+        0x84FF,
+        "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT",
     },
     {
-     0x8A3C,
-     "GL_UNIFORM_ARRAY_STRIDE",
+        0x8A3C,
+        "GL_UNIFORM_ARRAY_STRIDE",
     },
     {
-     0x8A44,
-     "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
+        0x8A44,
+        "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
     },
     {
-     0x6000,
-     "GL_TEXTURE_POOL_CHROMIUM",
+        0x6000,
+        "GL_TEXTURE_POOL_CHROMIUM",
     },
     {
-     0x0B74,
-     "GL_DEPTH_FUNC",
+        0x0B74,
+        "GL_DEPTH_FUNC",
     },
     {
-     0x8A49,
-     "GL_DECODE_EXT",
+        0x8A49,
+        "GL_DECODE_EXT",
     },
     {
-     0x881B,
-     "GL_RGB16F_EXT",
+        0x881B,
+        "GL_RGB16F_EXT",
     },
     {
-     0x0B71,
-     "GL_DEPTH_TEST",
+        0x0B71,
+        "GL_DEPTH_TEST",
     },
     {
-     0x0B70,
-     "GL_DEPTH_RANGE",
+        0x0B70,
+        "GL_DEPTH_RANGE",
     },
     {
-     0x0B73,
-     "GL_DEPTH_CLEAR_VALUE",
+        0x0B73,
+        "GL_DEPTH_CLEAR_VALUE",
     },
     {
-     0x0B72,
-     "GL_DEPTH_WRITEMASK",
+        0x0B72,
+        "GL_DEPTH_WRITEMASK",
     },
     {
-     0x8BD5,
-     "GL_TEXTURE_INTERNAL_FORMAT_QCOM",
+        0x8BD5,
+        "GL_TEXTURE_INTERNAL_FORMAT_QCOM",
     },
     {
-     0x85BA,
-     "GL_UNSIGNED_SHORT_8_8_APPLE",
+        0x85BA,
+        "GL_UNSIGNED_SHORT_8_8_APPLE",
     },
     {
-     0x8C87,
-     "GL_PRIMITIVES_GENERATED_EXT",
+        0x8C87,
+        "GL_PRIMITIVES_GENERATED_EXT",
     },
     {
-     0x8C80,
-     "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
+        0x8C80,
+        "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
     },
     {
-     0x8C83,
-     "GL_TRANSFORM_FEEDBACK_VARYINGS",
+        0x8C83,
+        "GL_TRANSFORM_FEEDBACK_VARYINGS",
     },
     {
-     0x8D69,
-     "GL_PRIMITIVE_RESTART_FIXED_INDEX",
+        0x8D69,
+        "GL_PRIMITIVE_RESTART_FIXED_INDEX",
     },
     {
-     0x882E,
-     "GL_DRAW_BUFFER9_EXT",
+        0x882E,
+        "GL_DRAW_BUFFER9_EXT",
     },
     {
-     0x8A32,
-     "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT",
+        0x8A32,
+        "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x8A31,
-     "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
+        0x8A31,
+        "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
     },
     {
-     0x8C89,
-     "GL_RASTERIZER_DISCARD",
+        0x8C89,
+        "GL_RASTERIZER_DISCARD",
     },
     {
-     0x8C88,
-     "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
+        0x8C88,
+        "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
     },
     {
-     0x8C1A,
-     "GL_TEXTURE_2D_ARRAY",
+        0x8C1A,
+        "GL_TEXTURE_2D_ARRAY",
     },
     {
-     0x910D,
-     "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+        0x910D,
+        "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
     },
     {
-     0x8E80,
-     "GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
+        0x8E80,
+        "GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x910B,
-     "GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+        0x910B,
+        "GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
     },
     {
-     0x910C,
-     "GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
+        0x910C,
+        "GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES",
     },
     {
-     0x94FA,
-     "GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL",
+        0x94FA,
+        "GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL",
     },
     {
-     0x8073,
-     "GL_MAX_3D_TEXTURE_SIZE_OES",
+        0x8073,
+        "GL_MAX_3D_TEXTURE_SIZE_OES",
     },
     {
-     0x8072,
-     "GL_TEXTURE_WRAP_R_OES",
+        0x8072,
+        "GL_TEXTURE_WRAP_R_OES",
     },
     {
-     0x9289,
-     "GL_DST_OVER_NV",
+        0x9289,
+        "GL_DST_OVER_NV",
     },
     {
-     0x882F,
-     "GL_DRAW_BUFFER10_EXT",
+        0x882F,
+        "GL_DRAW_BUFFER10_EXT",
     },
     {
-     0x8074,
-     "GL_VERTEX_ARRAY_KHR",
+        0x8074,
+        "GL_VERTEX_ARRAY_KHR",
     },
     {
-     0x80E1,
-     "GL_BGRA_EXT",
+        0x80E1,
+        "GL_BGRA_EXT",
     },
     {
-     0x8ED7,
-     "GL_COVERAGE_AUTOMATIC_NV",
+        0x8ED7,
+        "GL_COVERAGE_AUTOMATIC_NV",
     },
     {
-     0x8ED6,
-     "GL_COVERAGE_EDGE_FRAGMENTS_NV",
+        0x8ED6,
+        "GL_COVERAGE_EDGE_FRAGMENTS_NV",
     },
     {
-     0x8ED5,
-     "GL_COVERAGE_ALL_FRAGMENTS_NV",
+        0x8ED5,
+        "GL_COVERAGE_ALL_FRAGMENTS_NV",
     },
     {
-     0x8ED4,
-     "GL_COVERAGE_SAMPLES_NV",
+        0x8ED4,
+        "GL_COVERAGE_SAMPLES_NV",
     },
     {
-     0x8ED3,
-     "GL_COVERAGE_BUFFERS_NV",
+        0x8ED3,
+        "GL_COVERAGE_BUFFERS_NV",
     },
     {
-     0x8ED2,
-     "GL_COVERAGE_ATTACHMENT_NV",
+        0x8ED2,
+        "GL_COVERAGE_ATTACHMENT_NV",
     },
     {
-     0x8ED1,
-     "GL_COVERAGE_COMPONENT4_NV",
+        0x8ED1,
+        "GL_COVERAGE_COMPONENT4_NV",
     },
     {
-     0x8ED0,
-     "GL_COVERAGE_COMPONENT_NV",
+        0x8ED0,
+        "GL_COVERAGE_COMPONENT_NV",
     },
     {
-     0x8217,
-     "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
+        0x8217,
+        "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
     },
     {
-     0x8E89,
-     "GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT",
+        0x8E89,
+        "GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT",
     },
     {
-     0x8216,
-     "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
+        0x8216,
+        "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
     },
     {
-     0x8A36,
-     "GL_ACTIVE_UNIFORM_BLOCKS",
+        0x8A36,
+        "GL_ACTIVE_UNIFORM_BLOCKS",
     },
     {
-     0x8A37,
-     "GL_UNIFORM_TYPE",
+        0x8A37,
+        "GL_UNIFORM_TYPE",
     },
     {
-     0x8A34,
-     "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT",
+        0x8A34,
+        "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT",
     },
     {
-     0x3006,
-     "GL_CLIP_DISTANCE6_APPLE",
+        0x3006,
+        "GL_CLIP_DISTANCE6_APPLE",
     },
     {
-     0x800B,
-     "GL_FUNC_REVERSE_SUBTRACT",
+        0x800B,
+        "GL_FUNC_REVERSE_SUBTRACT",
     },
     {
-     0x8A33,
-     "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
+        0x8A33,
+        "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
     },
     {
-     0x00000400,
-     "GL_STENCIL_BUFFER_BIT",
+        0x00000400,
+        "GL_STENCIL_BUFFER_BIT",
     },
     {
-     0x800A,
-     "GL_FUNC_SUBTRACT",
+        0x800A,
+        "GL_FUNC_SUBTRACT",
     },
     {
-     0x8214,
-     "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
+        0x8214,
+        "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
     },
     {
-     0x8A38,
-     "GL_UNIFORM_SIZE",
+        0x8A38,
+        "GL_UNIFORM_SIZE",
     },
     {
-     0x8A39,
-     "GL_UNIFORM_NAME_LENGTH",
+        0x8A39,
+        "GL_UNIFORM_NAME_LENGTH",
     },
     {
-     0x8E2C,
-     "GL_DEPTH_COMPONENT16_NONLINEAR_NV",
+        0x8E2C,
+        "GL_DEPTH_COMPONENT16_NONLINEAR_NV",
     },
     {
-     0x889F,
-     "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
+        0x889F,
+        "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
     },
     {
-     0x8219,
-     "GL_FRAMEBUFFER_UNDEFINED_OES",
+        0x8219,
+        "GL_FRAMEBUFFER_UNDEFINED_OES",
     },
     {
-     0x8E23,
-     "GL_TRANSFORM_FEEDBACK_PAUSED",
+        0x8E23,
+        "GL_TRANSFORM_FEEDBACK_PAUSED",
     },
     {
-     0x8E22,
-     "GL_TRANSFORM_FEEDBACK",
+        0x8E22,
+        "GL_TRANSFORM_FEEDBACK",
     },
     {
-     0x8E25,
-     "GL_TRANSFORM_FEEDBACK_BINDING",
+        0x8E25,
+        "GL_TRANSFORM_FEEDBACK_BINDING",
     },
     {
-     0x9054,
-     "GL_IMAGE_CUBE_MAP_ARRAY_EXT",
+        0x9054,
+        "GL_IMAGE_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x8E28,
-     "GL_TIMESTAMP_EXT",
+        0x8E28,
+        "GL_TIMESTAMP_EXT",
     },
     {
-     0x8006,
-     "GL_FUNC_ADD",
+        0x8006,
+        "GL_FUNC_ADD",
     },
     {
-     0x8007,
-     "GL_MIN_EXT",
+        0x8007,
+        "GL_MIN_EXT",
     },
     {
-     0x8004,
-     "GL_ONE_MINUS_CONSTANT_ALPHA",
+        0x8004,
+        "GL_ONE_MINUS_CONSTANT_ALPHA",
     },
     {
-     0x8005,
-     "GL_BLEND_COLOR",
+        0x8005,
+        "GL_BLEND_COLOR",
     },
     {
-     0x8002,
-     "GL_ONE_MINUS_CONSTANT_COLOR",
+        0x8002,
+        "GL_ONE_MINUS_CONSTANT_COLOR",
     },
     {
-     0x8003,
-     "GL_CONSTANT_ALPHA",
+        0x8003,
+        "GL_CONSTANT_ALPHA",
     },
     {
-     0x8001,
-     "GL_CONSTANT_COLOR",
+        0x8001,
+        "GL_CONSTANT_COLOR",
     },
     {
-     0x0204,
-     "GL_GREATER",
+        0x0204,
+        "GL_GREATER",
     },
     {
-     0x0205,
-     "GL_NOTEQUAL",
+        0x0205,
+        "GL_NOTEQUAL",
     },
     {
-     0x0206,
-     "GL_GEQUAL",
+        0x0206,
+        "GL_GEQUAL",
     },
     {
-     0x0207,
-     "GL_ALWAYS",
+        0x0207,
+        "GL_ALWAYS",
     },
     {
-     0x0200,
-     "GL_NEVER",
+        0x0200,
+        "GL_NEVER",
     },
     {
-     0x0201,
-     "GL_LESS",
+        0x0201,
+        "GL_LESS",
     },
     {
-     0x0202,
-     "GL_EQUAL",
+        0x0202,
+        "GL_EQUAL",
     },
     {
-     0x0203,
-     "GL_LEQUAL",
+        0x0203,
+        "GL_LEQUAL",
     },
     {
-     0x8BD6,
-     "GL_TEXTURE_FORMAT_QCOM",
+        0x8BD6,
+        "GL_TEXTURE_FORMAT_QCOM",
     },
     {
-     0x8228,
-     "GL_RG_INTEGER",
+        0x8228,
+        "GL_RG_INTEGER",
     },
     {
-     0x2901,
-     "GL_REPEAT",
+        0x2901,
+        "GL_REPEAT",
     },
     {
-     0x9067,
-     "GL_UNSIGNED_INT_IMAGE_BUFFER_EXT",
+        0x9067,
+        "GL_UNSIGNED_INT_IMAGE_BUFFER_EXT",
     },
     {
-     0x92A0,
-     "GL_EXCLUSION_KHR",
+        0x92A0,
+        "GL_EXCLUSION_KHR",
     },
     {
-     0x93D8,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR",
+        0x93D8,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR",
     },
     {
-     0x93D9,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR",
+        0x93D9,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR",
     },
     {
-     0x8FB2,
-     "GL_GPU_OPTIMIZED_QCOM",
+        0x8FB2,
+        "GL_GPU_OPTIMIZED_QCOM",
     },
     {
-     0x190A,
-     "GL_LUMINANCE_ALPHA",
+        0x190A,
+        "GL_LUMINANCE_ALPHA",
     },
     {
-     0x8FB0,
-     "GL_BINNING_CONTROL_HINT_QCOM",
+        0x8FB0,
+        "GL_BINNING_CONTROL_HINT_QCOM",
     },
     {
-     0x905C,
-     "GL_INT_IMAGE_BUFFER_EXT",
+        0x905C,
+        "GL_INT_IMAGE_BUFFER_EXT",
     },
     {
-     0x1E00,
-     "GL_KEEP",
+        0x1E00,
+        "GL_KEEP",
     },
     {
-     0x1E01,
-     "GL_REPLACE",
+        0x1E01,
+        "GL_REPLACE",
     },
     {
-     0x1E02,
-     "GL_INCR",
+        0x1E02,
+        "GL_INCR",
     },
     {
-     0x1E03,
-     "GL_DECR",
+        0x1E03,
+        "GL_DECR",
     },
     {
-     0x93D6,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR",
+        0x93D6,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR",
     },
     {
-     0x93D7,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR",
+        0x93D7,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR",
     },
     {
-     0x93D4,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR",
+        0x93D4,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR",
     },
     {
-     0x93D5,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR",
+        0x93D5,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR",
     },
     {
-     0x886D,
-     "GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT",
+        0x886D,
+        "GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT",
     },
     {
-     0x0BE2,
-     "GL_BLEND",
+        0x0BE2,
+        "GL_BLEND",
     },
     {
-     0x84CB,
-     "GL_TEXTURE11",
+        0x84CB,
+        "GL_TEXTURE11",
     },
     {
-     0x8D55,
-     "GL_RENDERBUFFER_STENCIL_SIZE",
+        0x8D55,
+        "GL_RENDERBUFFER_STENCIL_SIZE",
     },
     {
-     0x8D54,
-     "GL_RENDERBUFFER_DEPTH_SIZE",
+        0x8D54,
+        "GL_RENDERBUFFER_DEPTH_SIZE",
     },
     {
-     0x8D57,
-     "GL_MAX_SAMPLES_ANGLE",
+        0x8D57,
+        "GL_MAX_SAMPLES_ANGLE",
     },
     {
-     0x8D56,
-     "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE",
+        0x8D56,
+        "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE",
     },
     {
-     0x8D51,
-     "GL_RENDERBUFFER_GREEN_SIZE",
+        0x8D51,
+        "GL_RENDERBUFFER_GREEN_SIZE",
     },
     {
-     0x8D50,
-     "GL_RENDERBUFFER_RED_SIZE",
+        0x8D50,
+        "GL_RENDERBUFFER_RED_SIZE",
     },
     {
-     0x8D53,
-     "GL_RENDERBUFFER_ALPHA_SIZE",
+        0x8D53,
+        "GL_RENDERBUFFER_ALPHA_SIZE",
     },
     {
-     0x8D52,
-     "GL_RENDERBUFFER_BLUE_SIZE",
+        0x8D52,
+        "GL_RENDERBUFFER_BLUE_SIZE",
     },
     {
-     0x92A6,
-     "GL_VIVIDLIGHT_NV",
+        0x92A6,
+        "GL_VIVIDLIGHT_NV",
     },
     {
-     0x8A2A,
-     "GL_UNIFORM_BUFFER_SIZE",
+        0x8A2A,
+        "GL_UNIFORM_BUFFER_SIZE",
     },
     {
-     0x8DCC,
-     "GL_INT_SAMPLER_CUBE",
+        0x8DCC,
+        "GL_INT_SAMPLER_CUBE",
     },
     {
-     0x78F1,
-     "GL_MAP_CHROMIUM",
+        0x78F1,
+        "GL_MAP_CHROMIUM",
     },
     {
-     0x00080000,
-     "GL_STENCIL_BUFFER_BIT3_QCOM",
+        0x00080000,
+        "GL_STENCIL_BUFFER_BIT3_QCOM",
     },
     {
-     0x92A7,
-     "GL_LINEARLIGHT_NV",
+        0x92A7,
+        "GL_LINEARLIGHT_NV",
     },
     {
-     0x8DCF,
-     "GL_INT_SAMPLER_2D_ARRAY",
+        0x8DCF,
+        "GL_INT_SAMPLER_2D_ARRAY",
     },
     {
-     0x886A,
-     "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED",
+        0x886A,
+        "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED",
     },
     {
-     0x8C41,
-     "GL_SRGB8_NV",
+        0x8C41,
+        "GL_SRGB8_NV",
     },
     {
-     0x0C01,
-     "GL_DRAW_BUFFER_EXT",
+        0x0C01,
+        "GL_DRAW_BUFFER_EXT",
     },
     {
-     0x886C,
-     "GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT",
+        0x886C,
+        "GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT",
     },
     {
-     0x90CB,
-     "GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT",
+        0x90CB,
+        "GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT",
     },
     {
-     0x8DCA,
-     "GL_INT_SAMPLER_2D",
+        0x8DCA,
+        "GL_INT_SAMPLER_2D",
     },
     {
-     0x93C7,
-     "GL_COMPRESSED_RGBA_ASTC_6x5x5_OES",
+        0x93C7,
+        "GL_COMPRESSED_RGBA_ASTC_6x5x5_OES",
     },
     {
-     0x8B5F,
-     "GL_SAMPLER_3D_OES",
+        0x8B5F,
+        "GL_SAMPLER_3D_OES",
     },
     {
-     0x8B95,
-     "GL_PALETTE8_RGB8_OES",
+        0x8B95,
+        "GL_PALETTE8_RGB8_OES",
     },
     {
-     0x9250,
-     "GL_SHADER_BINARY_DMP",
+        0x9250,
+        "GL_SHADER_BINARY_DMP",
     },
     {
-     0x9251,
-     "GL_SMAPHS30_PROGRAM_BINARY_DMP",
+        0x9251,
+        "GL_SMAPHS30_PROGRAM_BINARY_DMP",
     },
     {
-     0x9252,
-     "GL_SMAPHS_PROGRAM_BINARY_DMP",
+        0x9252,
+        "GL_SMAPHS_PROGRAM_BINARY_DMP",
     },
     {
-     0x9253,
-     "GL_DMP_PROGRAM_BINARY_DMP",
+        0x9253,
+        "GL_DMP_PROGRAM_BINARY_DMP",
     },
     {
-     0x8DC8,
-     "GL_UNSIGNED_INT_VEC4",
+        0x8DC8,
+        "GL_UNSIGNED_INT_VEC4",
     },
     {
-     0x3000,
-     "GL_CLIP_DISTANCE0_APPLE",
+        0x3000,
+        "GL_CLIP_DISTANCE0_APPLE",
     },
     {
-     0x8C92,
-     "GL_ATC_RGB_AMD",
+        0x8C92,
+        "GL_ATC_RGB_AMD",
     },
     {
-     0x8DC1,
-     "GL_SAMPLER_2D_ARRAY",
+        0x8DC1,
+        "GL_SAMPLER_2D_ARRAY",
     },
     {
-     0x9154,
-     "GL_VERTEX_ARRAY_OBJECT_EXT",
+        0x9154,
+        "GL_VERTEX_ARRAY_OBJECT_EXT",
     },
     {
-     0x9153,
-     "GL_QUERY_OBJECT_EXT",
+        0x9153,
+        "GL_QUERY_OBJECT_EXT",
     },
     {
-     0x8864,
-     "GL_QUERY_COUNTER_BITS_EXT",
+        0x8864,
+        "GL_QUERY_COUNTER_BITS_EXT",
     },
     {
-     0x9151,
-     "GL_BUFFER_OBJECT_EXT",
+        0x9151,
+        "GL_BUFFER_OBJECT_EXT",
     },
     {
-     0x8C93,
-     "GL_ATC_RGBA_EXPLICIT_ALPHA_AMD",
+        0x8C93,
+        "GL_ATC_RGBA_EXPLICIT_ALPHA_AMD",
     },
     {
-     0x00000002,
-     "GL_CONTEXT_FLAG_DEBUG_BIT_KHR",
+        0x00000002,
+        "GL_CONTEXT_FLAG_DEBUG_BIT_KHR",
     },
     {
-     0x8A3F,
-     "GL_UNIFORM_BLOCK_BINDING",
+        0x8A3F,
+        "GL_UNIFORM_BLOCK_BINDING",
     },
     {
-     0x00000000,
-     "GL_PERFQUERY_SINGLE_CONTEXT_INTEL",
+        0x00000000,
+        "GL_PERFQUERY_SINGLE_CONTEXT_INTEL",
     },
     {
-     0x00000001,
-     "GL_SYNC_FLUSH_COMMANDS_BIT_APPLE",
+        0x00000001,
+        "GL_SYNC_FLUSH_COMMANDS_BIT_APPLE",
     },
     {
-     0x9248,
-     "GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM",
+        0x9248,
+        "GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM",
     },
     {
-     0x00000004,
-     "GL_GEOMETRY_SHADER_BIT_EXT",
+        0x00000004,
+        "GL_GEOMETRY_SHADER_BIT_EXT",
     },
     {
-     0x1702,
-     "GL_TEXTURE",
+        0x1702,
+        "GL_TEXTURE",
     },
     {
-     0x3003,
-     "GL_CLIP_DISTANCE3_APPLE",
+        0x3003,
+        "GL_CLIP_DISTANCE3_APPLE",
     },
     {
-     0x00000008,
-     "GL_TESS_CONTROL_SHADER_BIT_EXT",
+        0x00000008,
+        "GL_TESS_CONTROL_SHADER_BIT_EXT",
     },
     {
-     0x8B58,
-     "GL_BOOL_VEC3",
+        0x8B58,
+        "GL_BOOL_VEC3",
     },
     {
-     0x8A3D,
-     "GL_UNIFORM_MATRIX_STRIDE",
+        0x8A3D,
+        "GL_UNIFORM_MATRIX_STRIDE",
     },
     {
-     0x8828,
-     "GL_DRAW_BUFFER3_EXT",
+        0x8828,
+        "GL_DRAW_BUFFER3_EXT",
     },
     {
-     0x8DF0,
-     "GL_LOW_FLOAT",
+        0x8DF0,
+        "GL_LOW_FLOAT",
     },
     {
-     0x1906,
-     "GL_ALPHA",
+        0x1906,
+        "GL_ALPHA",
     },
     {
-     0x1907,
-     "GL_RGB",
+        0x1907,
+        "GL_RGB",
     },
     {
-     0x8FBB,
-     "GL_GPU_DISJOINT_EXT",
+        0x8FBB,
+        "GL_GPU_DISJOINT_EXT",
     },
     {
-     0x1901,
-     "GL_STENCIL_INDEX_OES",
+        0x1901,
+        "GL_STENCIL_INDEX_OES",
     },
     {
-     0x1902,
-     "GL_DEPTH_COMPONENT",
+        0x1902,
+        "GL_DEPTH_COMPONENT",
     },
     {
-     0x8B56,
-     "GL_BOOL",
+        0x8B56,
+        "GL_BOOL",
     },
     {
-     0x93DB,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR",
+        0x93DB,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR",
     },
     {
-     0x8B9B,
-     "GL_IMPLEMENTATION_COLOR_READ_FORMAT",
+        0x8B9B,
+        "GL_IMPLEMENTATION_COLOR_READ_FORMAT",
     },
     {
-     0x8B9A,
-     "GL_IMPLEMENTATION_COLOR_READ_TYPE",
+        0x8B9A,
+        "GL_IMPLEMENTATION_COLOR_READ_TYPE",
     },
     {
-     0x93DA,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR",
+        0x93DA,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR",
     },
     {
-     0x1908,
-     "GL_RGBA",
+        0x1908,
+        "GL_RGBA",
     },
     {
-     0x8DF2,
-     "GL_HIGH_FLOAT",
+        0x8DF2,
+        "GL_HIGH_FLOAT",
     },
     {
-     0x93DD,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR",
+        0x93DD,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR",
     },
     {
-     0x8827,
-     "GL_DRAW_BUFFER2_EXT",
+        0x8827,
+        "GL_DRAW_BUFFER2_EXT",
     },
     {
-     0x9243,
-     "GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM",
+        0x9243,
+        "GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM",
     },
     {
-     0x8DF3,
-     "GL_LOW_INT",
+        0x8DF3,
+        "GL_LOW_INT",
     },
     {
-     0x82E8,
-     "GL_MAX_LABEL_LENGTH_KHR",
+        0x82E8,
+        "GL_MAX_LABEL_LENGTH_KHR",
     },
     {
-     0x82E6,
-     "GL_SAMPLER_KHR",
+        0x82E6,
+        "GL_SAMPLER_KHR",
     },
     {
-     0x0C02,
-     "GL_READ_BUFFER_EXT",
+        0x0C02,
+        "GL_READ_BUFFER_EXT",
     },
     {
-     0x82E3,
-     "GL_QUERY_KHR",
+        0x82E3,
+        "GL_QUERY_KHR",
     },
     {
-     0x82E2,
-     "GL_PROGRAM_KHR",
+        0x82E2,
+        "GL_PROGRAM_KHR",
     },
     {
-     0x82E1,
-     "GL_SHADER_KHR",
+        0x82E1,
+        "GL_SHADER_KHR",
     },
     {
-     0x8B52,
-     "GL_FLOAT_VEC4",
+        0x8B52,
+        "GL_FLOAT_VEC4",
     },
     {
-     0x8239,
-     "GL_RG16I",
+        0x8239,
+        "GL_RG16I",
     },
     {
-     0x8238,
-     "GL_RG8UI",
+        0x8238,
+        "GL_RG8UI",
     },
     {
-     0x9240,
-     "GL_UNPACK_FLIP_Y_CHROMIUM",
+        0x9240,
+        "GL_UNPACK_FLIP_Y_CHROMIUM",
     },
     {
-     0x8DF6,
-     "GL_UNSIGNED_INT_10_10_10_2_OES",
+        0x8DF6,
+        "GL_UNSIGNED_INT_10_10_10_2_OES",
     },
     {
-     0x8A30,
-     "GL_MAX_UNIFORM_BLOCK_SIZE",
+        0x8A30,
+        "GL_MAX_UNIFORM_BLOCK_SIZE",
     },
     {
-     0x9273,
-     "GL_COMPRESSED_SIGNED_RG11_EAC",
+        0x9273,
+        "GL_COMPRESSED_SIGNED_RG11_EAC",
     },
     {
-     0x8231,
-     "GL_R8I",
+        0x8231,
+        "GL_R8I",
     },
     {
-     0x8866,
-     "GL_QUERY_RESULT_EXT",
+        0x8866,
+        "GL_QUERY_RESULT_EXT",
     },
     {
-     0x8233,
-     "GL_R16I",
+        0x8233,
+        "GL_R16I",
     },
     {
-     0x8DF7,
-     "GL_INT_10_10_10_2_OES",
+        0x8DF7,
+        "GL_INT_10_10_10_2_OES",
     },
     {
-     0x8235,
-     "GL_R32I",
+        0x8235,
+        "GL_R32I",
     },
     {
-     0x8234,
-     "GL_R16UI",
+        0x8234,
+        "GL_R16UI",
     },
     {
-     0x8237,
-     "GL_RG8I",
+        0x8237,
+        "GL_RG8I",
     },
     {
-     0x9246,
-     "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM",
+        0x9246,
+        "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM",
     },
     {
-     0x8B69,
-     "GL_FLOAT_MAT4x2_NV",
+        0x8B69,
+        "GL_FLOAT_MAT4x2_NV",
     },
     {
-     0x812D,
-     "GL_CLAMP_TO_BORDER_EXT",
+        0x812D,
+        "GL_CLAMP_TO_BORDER_EXT",
     },
     {
-     0x812F,
-     "GL_CLAMP_TO_EDGE",
+        0x812F,
+        "GL_CLAMP_TO_EDGE",
     },
     {
-     0x92A4,
-     "GL_LINEARDODGE_NV",
+        0x92A4,
+        "GL_LINEARDODGE_NV",
     },
     {
-     0x8DD8,
-     "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT",
+        0x8DD8,
+        "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT",
     },
     {
-     0x8DD9,
-     "GL_GEOMETRY_SHADER_EXT",
+        0x8DD9,
+        "GL_GEOMETRY_SHADER_EXT",
     },
     {
-     0x86A3,
-     "GL_COMPRESSED_TEXTURE_FORMATS",
+        0x86A3,
+        "GL_COMPRESSED_TEXTURE_FORMATS",
     },
     {
-     0x8DD4,
-     "GL_UNSIGNED_INT_SAMPLER_CUBE",
+        0x8DD4,
+        "GL_UNSIGNED_INT_SAMPLER_CUBE",
     },
     {
-     0x9244,
-     "GL_BIND_GENERATES_RESOURCE_CHROMIUM",
+        0x9244,
+        "GL_BIND_GENERATES_RESOURCE_CHROMIUM",
     },
     {
-     0x8DD2,
-     "GL_UNSIGNED_INT_SAMPLER_2D",
+        0x8DD2,
+        "GL_UNSIGNED_INT_SAMPLER_2D",
     },
     {
-     0x8DD3,
-     "GL_UNSIGNED_INT_SAMPLER_3D",
+        0x8DD3,
+        "GL_UNSIGNED_INT_SAMPLER_3D",
     },
     {
-     0x8DD0,
-     "GL_INT_SAMPLER_BUFFER_EXT",
+        0x8DD0,
+        "GL_INT_SAMPLER_BUFFER_EXT",
     },
     {
-     0x86A2,
-     "GL_NUM_COMPRESSED_TEXTURE_FORMATS",
+        0x86A2,
+        "GL_NUM_COMPRESSED_TEXTURE_FORMATS",
     },
     {
-     0x0CF3,
-     "GL_UNPACK_SKIP_ROWS_EXT",
+        0x0CF3,
+        "GL_UNPACK_SKIP_ROWS_EXT",
     },
     {
-     0x0CF2,
-     "GL_UNPACK_ROW_LENGTH_EXT",
+        0x0CF2,
+        "GL_UNPACK_ROW_LENGTH_EXT",
     },
     {
-     0x140C,
-     "GL_FIXED",
+        0x140C,
+        "GL_FIXED",
     },
     {
-     0x140B,
-     "GL_HALF_FLOAT",
+        0x140B,
+        "GL_HALF_FLOAT",
     },
     {
-     0x8008,
-     "GL_MAX_EXT",
+        0x8008,
+        "GL_MAX_EXT",
     },
     {
-     0x0CF5,
-     "GL_UNPACK_ALIGNMENT",
+        0x0CF5,
+        "GL_UNPACK_ALIGNMENT",
     },
     {
-     0x8867,
-     "GL_QUERY_RESULT_AVAILABLE_EXT",
+        0x8867,
+        "GL_QUERY_RESULT_AVAILABLE_EXT",
     },
     {
-     0x8D82,
-     "GL_RGBA32I",
+        0x8D82,
+        "GL_RGBA32I",
     },
     {
-     0x8009,
-     "GL_BLEND_EQUATION",
+        0x8009,
+        "GL_BLEND_EQUATION",
     },
     {
-     0x911F,
-     "GL_BUFFER_ACCESS_FLAGS",
+        0x911F,
+        "GL_BUFFER_ACCESS_FLAGS",
     },
     {
-     0x1401,
-     "GL_UNSIGNED_BYTE",
+        0x1401,
+        "GL_UNSIGNED_BYTE",
     },
     {
-     0x1400,
-     "GL_BYTE",
+        0x1400,
+        "GL_BYTE",
     },
     {
-     0x1403,
-     "GL_UNSIGNED_SHORT",
+        0x1403,
+        "GL_UNSIGNED_SHORT",
     },
     {
-     0x1402,
-     "GL_SHORT",
+        0x1402,
+        "GL_SHORT",
     },
     {
-     0x1405,
-     "GL_UNSIGNED_INT",
+        0x1405,
+        "GL_UNSIGNED_INT",
     },
     {
-     0x1404,
-     "GL_INT",
+        0x1404,
+        "GL_INT",
     },
     {
-     0x1406,
-     "GL_FLOAT",
+        0x1406,
+        "GL_FLOAT",
     },
     {
-     0x8C1D,
-     "GL_TEXTURE_BINDING_2D_ARRAY",
+        0x8C1D,
+        "GL_TEXTURE_BINDING_2D_ARRAY",
     },
     {
-     0x8DDF,
-     "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT",
+        0x8DDF,
+        "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT",
     },
     {
-     0x8043,
-     "GL_LUMINANCE4_ALPHA4_OES",
+        0x8043,
+        "GL_LUMINANCE4_ALPHA4_OES",
     },
     {
-     0x8040,
-     "GL_LUMINANCE8_OES",
+        0x8040,
+        "GL_LUMINANCE8_OES",
     },
     {
-     0x8045,
-     "GL_LUMINANCE8_ALPHA8_OES",
+        0x8045,
+        "GL_LUMINANCE8_ALPHA8_OES",
     },
     {
-     0x8CD1,
-     "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
+        0x8CD1,
+        "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
     },
     {
-     0x00040000,
-     "GL_STENCIL_BUFFER_BIT2_QCOM",
+        0x00040000,
+        "GL_STENCIL_BUFFER_BIT2_QCOM",
     },
     {
-     0x8CD0,
-     "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
+        0x8CD0,
+        "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
     },
     {
-     0x823A,
-     "GL_RG16UI",
+        0x823A,
+        "GL_RG16UI",
     },
     {
-     0x8CE4,
-     "GL_COLOR_ATTACHMENT4_EXT",
+        0x8CE4,
+        "GL_COLOR_ATTACHMENT4_EXT",
     },
     {
-     0x823B,
-     "GL_RG32I",
+        0x823B,
+        "GL_RG32I",
     },
     {
-     0x8CD3,
-     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
+        0x8CD3,
+        "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
     },
     {
-     0x846E,
-     "GL_ALIASED_LINE_WIDTH_RANGE",
+        0x846E,
+        "GL_ALIASED_LINE_WIDTH_RANGE",
     },
     {
-     0x0B90,
-     "GL_STENCIL_TEST",
+        0x0B90,
+        "GL_STENCIL_TEST",
     },
     {
-     0x8CD2,
-     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
+        0x8CD2,
+        "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
     },
     {
-     0x881C,
-     "GL_ALPHA16F_EXT",
+        0x881C,
+        "GL_ALPHA16F_EXT",
     },
     {
-     0x928E,
-     "GL_SRC_ATOP_NV",
+        0x928E,
+        "GL_SRC_ATOP_NV",
     },
     {
-     0x8CD4,
-     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES",
+        0x8CD4,
+        "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES",
     },
     {
-     0x9113,
-     "GL_SYNC_CONDITION_APPLE",
+        0x9113,
+        "GL_SYNC_CONDITION_APPLE",
     },
     {
-     0x8CD7,
-     "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
+        0x8CD7,
+        "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
     },
     {
-     0x08000000,
-     "GL_MULTISAMPLE_BUFFER_BIT3_QCOM",
+        0x08000000,
+        "GL_MULTISAMPLE_BUFFER_BIT3_QCOM",
     },
     {
-     0x93A4,
-     "GL_PACK_REVERSE_ROW_ORDER_ANGLE",
+        0x93A4,
+        "GL_PACK_REVERSE_ROW_ORDER_ANGLE",
     },
     {
-     0x8038,
-     "GL_POLYGON_OFFSET_FACTOR",
+        0x8038,
+        "GL_POLYGON_OFFSET_FACTOR",
     },
     {
-     0x94F9,
-     "GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL",
+        0x94F9,
+        "GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL",
     },
     {
-     0x851A,
-     "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z",
+        0x851A,
+        "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z",
     },
     {
-     0x851C,
-     "GL_MAX_CUBE_MAP_TEXTURE_SIZE",
+        0x851C,
+        "GL_MAX_CUBE_MAP_TEXTURE_SIZE",
     },
     {
-     0x8CD9,
-     "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
+        0x8CD9,
+        "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
     },
     {
-     0x84CC,
-     "GL_TEXTURE12",
+        0x84CC,
+        "GL_TEXTURE12",
     },
     {
-     0x0BA2,
-     "GL_VIEWPORT",
+        0x0BA2,
+        "GL_VIEWPORT",
     },
     {
-     0x84CA,
-     "GL_TEXTURE10",
+        0x84CA,
+        "GL_TEXTURE10",
     },
     {
-     0x0BA7,
-     "GL_PATH_PROJECTION_MATRIX_CHROMIUM",
+        0x0BA7,
+        "GL_PATH_PROJECTION_MATRIX_CHROMIUM",
     },
     {
-     0x84CF,
-     "GL_TEXTURE15",
+        0x84CF,
+        "GL_TEXTURE15",
     },
     {
-     0x84CE,
-     "GL_TEXTURE14",
+        0x84CE,
+        "GL_TEXTURE14",
     },
     {
-     0x84CD,
-     "GL_TEXTURE13",
+        0x84CD,
+        "GL_TEXTURE13",
     },
     {
-     0x83F9,
-     "GL_PERFQUERY_DONOT_FLUSH_INTEL",
+        0x83F9,
+        "GL_PERFQUERY_DONOT_FLUSH_INTEL",
     },
     {
-     0x9115,
-     "GL_SYNC_FLAGS_APPLE",
+        0x9115,
+        "GL_SYNC_FLAGS_APPLE",
     },
     {
-     0x9286,
-     "GL_SRC_NV",
+        0x9286,
+        "GL_SRC_NV",
     },
     {
-     0x83F3,
-     "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE",
+        0x83F3,
+        "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE",
     },
     {
-     0x83F2,
-     "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE",
+        0x83F2,
+        "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE",
     },
     {
-     0x83F1,
-     "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT",
+        0x83F1,
+        "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT",
     },
     {
-     0x9114,
-     "GL_SYNC_STATUS_APPLE",
+        0x9114,
+        "GL_SYNC_STATUS_APPLE",
     },
     {
-     0x8C0A,
-     "GL_SGX_BINARY_IMG",
+        0x8C0A,
+        "GL_SGX_BINARY_IMG",
     },
     {
-     0x93BB,
-     "GL_COMPRESSED_RGBA_ASTC_10x10_KHR",
+        0x93BB,
+        "GL_COMPRESSED_RGBA_ASTC_10x10_KHR",
     },
     {
-     0x911C,
-     "GL_CONDITION_SATISFIED_APPLE",
+        0x911C,
+        "GL_CONDITION_SATISFIED_APPLE",
     },
     {
-     0x911B,
-     "GL_TIMEOUT_EXPIRED_APPLE",
+        0x911B,
+        "GL_TIMEOUT_EXPIRED_APPLE",
     },
     {
-     0x911A,
-     "GL_ALREADY_SIGNALED_APPLE",
+        0x911A,
+        "GL_ALREADY_SIGNALED_APPLE",
     },
     {
-     0x9284,
-     "GL_CONJOINT_NV",
+        0x9284,
+        "GL_CONJOINT_NV",
     },
     {
-     0x9124,
-     "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT",
+        0x9124,
+        "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT",
     },
     {
-     0x911D,
-     "GL_WAIT_FAILED_APPLE",
+        0x911D,
+        "GL_WAIT_FAILED_APPLE",
     },
     {
-     0x929A,
-     "GL_COLORBURN_KHR",
+        0x929A,
+        "GL_COLORBURN_KHR",
     },
     {
-     0x929B,
-     "GL_HARDLIGHT_KHR",
+        0x929B,
+        "GL_HARDLIGHT_KHR",
     },
     {
-     0x929C,
-     "GL_SOFTLIGHT_KHR",
+        0x929C,
+        "GL_SOFTLIGHT_KHR",
     },
     {
-     0x846D,
-     "GL_ALIASED_POINT_SIZE_RANGE",
+        0x846D,
+        "GL_ALIASED_POINT_SIZE_RANGE",
     },
     {
-     0x929E,
-     "GL_DIFFERENCE_KHR",
+        0x929E,
+        "GL_DIFFERENCE_KHR",
     },
     {
-     0x929F,
-     "GL_MINUS_NV",
+        0x929F,
+        "GL_MINUS_NV",
     },
     {
-     0x9282,
-     "GL_UNCORRELATED_NV",
+        0x9282,
+        "GL_UNCORRELATED_NV",
     },
     {
-     0x9298,
-     "GL_LIGHTEN_KHR",
+        0x9298,
+        "GL_LIGHTEN_KHR",
     },
     {
-     0x9299,
-     "GL_COLORDODGE_KHR",
+        0x9299,
+        "GL_COLORDODGE_KHR",
     },
     {
-     0x9111,
-     "GL_MAX_SERVER_WAIT_TIMEOUT_APPLE",
+        0x9111,
+        "GL_MAX_SERVER_WAIT_TIMEOUT_APPLE",
     },
     {
-     0x93A6,
-     "GL_PROGRAM_BINARY_ANGLE",
+        0x93A6,
+        "GL_PROGRAM_BINARY_ANGLE",
     },
     {
-     0x9117,
-     "GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE",
+        0x9117,
+        "GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE",
     },
     {
-     0x93A0,
-     "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE",
+        0x93A0,
+        "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE",
     },
     {
-     0x93A3,
-     "GL_FRAMEBUFFER_ATTACHMENT_ANGLE",
+        0x93A3,
+        "GL_FRAMEBUFFER_ATTACHMENT_ANGLE",
     },
     {
-     0x93A2,
-     "GL_TEXTURE_USAGE_ANGLE",
+        0x93A2,
+        "GL_TEXTURE_USAGE_ANGLE",
     },
     {
-     0x8802,
-     "GL_STENCIL_BACK_PASS_DEPTH_FAIL",
+        0x8802,
+        "GL_STENCIL_BACK_PASS_DEPTH_FAIL",
     },
     {
-     0x9119,
-     "GL_SIGNALED_APPLE",
+        0x9119,
+        "GL_SIGNALED_APPLE",
     },
     {
-     0x9118,
-     "GL_UNSIGNALED_APPLE",
+        0x9118,
+        "GL_UNSIGNALED_APPLE",
     },
     {
-     0x9294,
-     "GL_MULTIPLY_KHR",
+        0x9294,
+        "GL_MULTIPLY_KHR",
     },
     {
-     0x9295,
-     "GL_SCREEN_KHR",
+        0x9295,
+        "GL_SCREEN_KHR",
     },
     {
-     0x9296,
-     "GL_OVERLAY_KHR",
+        0x9296,
+        "GL_OVERLAY_KHR",
     },
     {
-     0x9297,
-     "GL_DARKEN_KHR",
+        0x9297,
+        "GL_DARKEN_KHR",
     },
     {
-     0x0020,
-     "GL_MAP_UNSYNCHRONIZED_BIT_EXT",
+        0x0020,
+        "GL_MAP_UNSYNCHRONIZED_BIT_EXT",
     },
     {
-     0x8E78,
-     "GL_TESS_GEN_VERTEX_ORDER_EXT",
+        0x8E78,
+        "GL_TESS_GEN_VERTEX_ORDER_EXT",
     },
     {
-     0x8C01,
-     "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG",
+        0x8C01,
+        "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG",
     },
     {
-     0x8C00,
-     "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG",
+        0x8C00,
+        "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG",
     },
     {
-     0x8A52,
-     "GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT",
+        0x8A52,
+        "GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT",
     },
     {
-     0x8C02,
-     "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG",
+        0x8C02,
+        "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG",
     },
     {
-     0x84C9,
-     "GL_TEXTURE9",
+        0x84C9,
+        "GL_TEXTURE9",
     },
     {
-     0x84C8,
-     "GL_TEXTURE8",
+        0x84C8,
+        "GL_TEXTURE8",
     },
     {
-     0x8869,
-     "GL_MAX_VERTEX_ATTRIBS",
+        0x8869,
+        "GL_MAX_VERTEX_ATTRIBS",
     },
     {
-     0x84C3,
-     "GL_TEXTURE3",
+        0x84C3,
+        "GL_TEXTURE3",
     },
     {
-     0x84C2,
-     "GL_TEXTURE2",
+        0x84C2,
+        "GL_TEXTURE2",
     },
     {
-     0x84C1,
-     "GL_TEXTURE1",
+        0x84C1,
+        "GL_TEXTURE1",
     },
     {
-     0x84C0,
-     "GL_TEXTURE0",
+        0x84C0,
+        "GL_TEXTURE0",
     },
     {
-     0x84C7,
-     "GL_TEXTURE7",
+        0x84C7,
+        "GL_TEXTURE7",
     },
     {
-     0x84C6,
-     "GL_TEXTURE6",
+        0x84C6,
+        "GL_TEXTURE6",
     },
     {
-     0x84C5,
-     "GL_TEXTURE5",
+        0x84C5,
+        "GL_TEXTURE5",
     },
     {
-     0x8803,
-     "GL_STENCIL_BACK_PASS_DEPTH_PASS",
+        0x8803,
+        "GL_STENCIL_BACK_PASS_DEPTH_PASS",
     },
     {
-     0x928A,
-     "GL_SRC_IN_NV",
+        0x928A,
+        "GL_SRC_IN_NV",
     },
     {
-     0x8518,
-     "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y",
+        0x8518,
+        "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y",
     },
     {
-     0x8519,
-     "GL_TEXTURE_CUBE_MAP_POSITIVE_Z",
+        0x8519,
+        "GL_TEXTURE_CUBE_MAP_POSITIVE_Z",
     },
     {
-     0x8514,
-     "GL_TEXTURE_BINDING_CUBE_MAP",
+        0x8514,
+        "GL_TEXTURE_BINDING_CUBE_MAP",
     },
     {
-     0x8515,
-     "GL_TEXTURE_CUBE_MAP_POSITIVE_X",
+        0x8515,
+        "GL_TEXTURE_CUBE_MAP_POSITIVE_X",
     },
     {
-     0x8516,
-     "GL_TEXTURE_CUBE_MAP_NEGATIVE_X",
+        0x8516,
+        "GL_TEXTURE_CUBE_MAP_NEGATIVE_X",
     },
     {
-     0x8517,
-     "GL_TEXTURE_CUBE_MAP_POSITIVE_Y",
+        0x8517,
+        "GL_TEXTURE_CUBE_MAP_POSITIVE_Y",
     },
     {
-     0x8218,
-     "GL_FRAMEBUFFER_DEFAULT",
+        0x8218,
+        "GL_FRAMEBUFFER_DEFAULT",
     },
     {
-     0x8513,
-     "GL_TEXTURE_CUBE_MAP",
+        0x8513,
+        "GL_TEXTURE_CUBE_MAP",
     },
     {
-     0x8626,
-     "GL_CURRENT_VERTEX_ATTRIB",
+        0x8626,
+        "GL_CURRENT_VERTEX_ATTRIB",
     },
     {
-     0x92B1,
-     "GL_PLUS_CLAMPED_NV",
+        0x92B1,
+        "GL_PLUS_CLAMPED_NV",
     },
     {
-     0x92B0,
-     "GL_HSL_LUMINOSITY_KHR",
+        0x92B0,
+        "GL_HSL_LUMINOSITY_KHR",
     },
     {
-     0x92B3,
-     "GL_MINUS_CLAMPED_NV",
+        0x92B3,
+        "GL_MINUS_CLAMPED_NV",
     },
     {
-     0x92B2,
-     "GL_PLUS_CLAMPED_ALPHA_NV",
+        0x92B2,
+        "GL_PLUS_CLAMPED_ALPHA_NV",
     },
     {
-     0x8765,
-     "GL_BUFFER_USAGE",
+        0x8765,
+        "GL_BUFFER_USAGE",
     },
     {
-     0x8764,
-     "GL_BUFFER_SIZE",
+        0x8764,
+        "GL_BUFFER_SIZE",
     },
     {
-     0x8B99,
-     "GL_PALETTE8_RGB5_A1_OES",
+        0x8B99,
+        "GL_PALETTE8_RGB5_A1_OES",
     },
     {
-     0x0503,
-     "GL_STACK_OVERFLOW_KHR",
+        0x0503,
+        "GL_STACK_OVERFLOW_KHR",
     },
     {
-     0x0502,
-     "GL_INVALID_OPERATION",
+        0x0502,
+        "GL_INVALID_OPERATION",
     },
     {
-     0x0501,
-     "GL_INVALID_VALUE",
+        0x0501,
+        "GL_INVALID_VALUE",
     },
     {
-     0x0500,
-     "GL_INVALID_ENUM",
+        0x0500,
+        "GL_INVALID_ENUM",
     },
     {
-     0x0507,
-     "GL_CONTEXT_LOST_KHR",
+        0x0507,
+        "GL_CONTEXT_LOST_KHR",
     },
     {
-     0x0506,
-     "GL_INVALID_FRAMEBUFFER_OPERATION",
+        0x0506,
+        "GL_INVALID_FRAMEBUFFER_OPERATION",
     },
     {
-     0x0505,
-     "GL_OUT_OF_MEMORY",
+        0x0505,
+        "GL_OUT_OF_MEMORY",
     },
     {
-     0x0504,
-     "GL_STACK_UNDERFLOW_KHR",
+        0x0504,
+        "GL_STACK_UNDERFLOW_KHR",
     },
     {
-     0x0CF4,
-     "GL_UNPACK_SKIP_PIXELS_EXT",
+        0x0CF4,
+        "GL_UNPACK_SKIP_PIXELS_EXT",
     },
     {
-     0x0B44,
-     "GL_CULL_FACE",
+        0x0B44,
+        "GL_CULL_FACE",
     },
     {
-     0x8B5E,
-     "GL_SAMPLER_2D",
+        0x8B5E,
+        "GL_SAMPLER_2D",
     },
     {
-     0x0B46,
-     "GL_FRONT_FACE",
+        0x0B46,
+        "GL_FRONT_FACE",
     },
     {
-     0x8FB3,
-     "GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM",
+        0x8FB3,
+        "GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM",
     },
     {
-     0x824A,
-     "GL_DEBUG_SOURCE_APPLICATION_KHR",
+        0x824A,
+        "GL_DEBUG_SOURCE_APPLICATION_KHR",
     },
     {
-     0x824B,
-     "GL_DEBUG_SOURCE_OTHER_KHR",
+        0x824B,
+        "GL_DEBUG_SOURCE_OTHER_KHR",
     },
     {
-     0x824C,
-     "GL_DEBUG_TYPE_ERROR_KHR",
+        0x824C,
+        "GL_DEBUG_TYPE_ERROR_KHR",
     },
     {
-     0x824D,
-     "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR",
+        0x824D,
+        "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR",
     },
     {
-     0x824E,
-     "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR",
+        0x824E,
+        "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR",
     },
     {
-     0x824F,
-     "GL_DEBUG_TYPE_PORTABILITY_KHR",
+        0x824F,
+        "GL_DEBUG_TYPE_PORTABILITY_KHR",
     },
     {
-     0x8DD7,
-     "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY",
+        0x8DD7,
+        "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY",
     },
     {
-     0x8B31,
-     "GL_VERTEX_SHADER",
+        0x8B31,
+        "GL_VERTEX_SHADER",
     },
     {
-     0x8B30,
-     "GL_FRAGMENT_SHADER",
+        0x8B30,
+        "GL_FRAGMENT_SHADER",
     },
     {
-     0x8FB1,
-     "GL_CPU_OPTIMIZED_QCOM",
+        0x8FB1,
+        "GL_CPU_OPTIMIZED_QCOM",
     },
     {
-     0x93D2,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR",
+        0x93D2,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR",
     },
     {
-     0x82FB,
-     "GL_CONTEXT_RELEASE_BEHAVIOR_KHR",
+        0x82FB,
+        "GL_CONTEXT_RELEASE_BEHAVIOR_KHR",
     },
     {
-     0x8B5A,
-     "GL_FLOAT_MAT2",
+        0x8B5A,
+        "GL_FLOAT_MAT2",
     },
     {
-     0x84D8,
-     "GL_TEXTURE24",
+        0x84D8,
+        "GL_TEXTURE24",
     },
     {
-     0x84D9,
-     "GL_TEXTURE25",
+        0x84D9,
+        "GL_TEXTURE25",
     },
     {
-     0x84D6,
-     "GL_TEXTURE22",
+        0x84D6,
+        "GL_TEXTURE22",
     },
     {
-     0x84D7,
-     "GL_TEXTURE23",
+        0x84D7,
+        "GL_TEXTURE23",
     },
     {
-     0x84D4,
-     "GL_TEXTURE20",
+        0x84D4,
+        "GL_TEXTURE20",
     },
     {
-     0x0D05,
-     "GL_PACK_ALIGNMENT",
+        0x0D05,
+        "GL_PACK_ALIGNMENT",
     },
     {
-     0x84D2,
-     "GL_TEXTURE18",
+        0x84D2,
+        "GL_TEXTURE18",
     },
     {
-     0x84D3,
-     "GL_TEXTURE19",
+        0x84D3,
+        "GL_TEXTURE19",
     },
     {
-     0x84D0,
-     "GL_TEXTURE16",
+        0x84D0,
+        "GL_TEXTURE16",
     },
     {
-     0x84D1,
-     "GL_TEXTURE17",
+        0x84D1,
+        "GL_TEXTURE17",
     },
     {
-     0x93D1,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR",
+        0x93D1,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR",
     },
     {
-     0x84DF,
-     "GL_TEXTURE31",
+        0x84DF,
+        "GL_TEXTURE31",
     },
     {
-     0x8B97,
-     "GL_PALETTE8_R5_G6_B5_OES",
+        0x8B97,
+        "GL_PALETTE8_R5_G6_B5_OES",
     },
     {
-     0x84DD,
-     "GL_TEXTURE29",
+        0x84DD,
+        "GL_TEXTURE29",
     },
     {
-     0x84DE,
-     "GL_TEXTURE30",
+        0x84DE,
+        "GL_TEXTURE30",
     },
     {
-     0x84DB,
-     "GL_TEXTURE27",
+        0x84DB,
+        "GL_TEXTURE27",
     },
     {
-     0x84DC,
-     "GL_TEXTURE28",
+        0x84DC,
+        "GL_TEXTURE28",
     },
     {
-     0x6002,
-     "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM",
+        0x6002,
+        "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM",
     },
     {
-     0x84DA,
-     "GL_TEXTURE26",
+        0x84DA,
+        "GL_TEXTURE26",
     },
     {
-     0x8242,
-     "GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR",
+        0x8242,
+        "GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR",
     },
     {
-     0x8243,
-     "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR",
+        0x8243,
+        "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR",
     },
     {
-     0x8244,
-     "GL_DEBUG_CALLBACK_FUNCTION_KHR",
+        0x8244,
+        "GL_DEBUG_CALLBACK_FUNCTION_KHR",
     },
     {
-     0x8245,
-     "GL_DEBUG_CALLBACK_USER_PARAM_KHR",
+        0x8245,
+        "GL_DEBUG_CALLBACK_USER_PARAM_KHR",
     },
     {
-     0x8246,
-     "GL_DEBUG_SOURCE_API_KHR",
+        0x8246,
+        "GL_DEBUG_SOURCE_API_KHR",
     },
     {
-     0x8247,
-     "GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR",
+        0x8247,
+        "GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR",
     },
     {
-     0x8248,
-     "GL_DEBUG_SOURCE_SHADER_COMPILER_KHR",
+        0x8248,
+        "GL_DEBUG_SOURCE_SHADER_COMPILER_KHR",
     },
     {
-     0x8249,
-     "GL_DEBUG_SOURCE_THIRD_PARTY_KHR",
+        0x8249,
+        "GL_DEBUG_SOURCE_THIRD_PARTY_KHR",
     },
     {
-     0x88ED,
-     "GL_PIXEL_PACK_BUFFER_BINDING",
+        0x88ED,
+        "GL_PIXEL_PACK_BUFFER_BINDING",
     },
     {
-     0x8B94,
-     "GL_PALETTE4_RGB5_A1_OES",
+        0x8B94,
+        "GL_PALETTE4_RGB5_A1_OES",
     },
     {
-     0x94F4,
-     "GL_PERFQUERY_COUNTER_RAW_INTEL",
+        0x94F4,
+        "GL_PERFQUERY_COUNTER_RAW_INTEL",
     },
     {
-     0x823C,
-     "GL_RG32UI",
+        0x823C,
+        "GL_RG32UI",
     },
     {
-     0x8A29,
-     "GL_UNIFORM_BUFFER_START",
+        0x8A29,
+        "GL_UNIFORM_BUFFER_START",
     },
     {
-     0x8A28,
-     "GL_UNIFORM_BUFFER_BINDING",
+        0x8A28,
+        "GL_UNIFORM_BUFFER_BINDING",
     },
     {
-     0x92BE,
-     "GL_PRIMITIVE_BOUNDING_BOX_EXT",
+        0x92BE,
+        "GL_PRIMITIVE_BOUNDING_BOX_EXT",
     },
     {
-     0x8645,
-     "GL_VERTEX_ATTRIB_ARRAY_POINTER",
+        0x8645,
+        "GL_VERTEX_ATTRIB_ARRAY_POINTER",
     },
     {
-     0x8865,
-     "GL_CURRENT_QUERY_EXT",
+        0x8865,
+        "GL_CURRENT_QUERY_EXT",
     },
     {
-     0x8E5B,
-     "GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES",
+        0x8E5B,
+        "GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES",
     },
     {
-     0x8E5C,
-     "GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES",
+        0x8E5C,
+        "GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES",
     },
     {
-     0x8E5D,
-     "GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES",
+        0x8E5D,
+        "GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES",
     },
     {
-     0x906A,
-     "GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
+        0x906A,
+        "GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x906F,
-     "GL_RGB10_A2UI",
+        0x906F,
+        "GL_RGB10_A2UI",
     },
     {
-     0x8E72,
-     "GL_PATCH_VERTICES_EXT",
+        0x8E72,
+        "GL_PATCH_VERTICES_EXT",
     },
     {
-     0x8BD3,
-     "GL_TEXTURE_HEIGHT_QCOM",
+        0x8BD3,
+        "GL_TEXTURE_HEIGHT_QCOM",
     },
     {
-     0x87FA,
-     "GL_3DC_XY_AMD",
+        0x87FA,
+        "GL_3DC_XY_AMD",
     },
     {
-     0x84C4,
-     "GL_TEXTURE4",
+        0x84C4,
+        "GL_TEXTURE4",
     },
     {
-     0x821C,
-     "GL_MINOR_VERSION",
+        0x821C,
+        "GL_MINOR_VERSION",
     },
     {
-     0x8E8A,
-     "GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT",
+        0x8E8A,
+        "GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT",
     },
     {
-     0x85B5,
-     "GL_VERTEX_ARRAY_BINDING_OES",
+        0x85B5,
+        "GL_VERTEX_ARRAY_BINDING_OES",
     },
     {
-     0x8253,
-     "GL_GUILTY_CONTEXT_RESET_KHR",
+        0x8253,
+        "GL_GUILTY_CONTEXT_RESET_KHR",
     },
     {
-     0x8D6B,
-     "GL_MAX_ELEMENT_INDEX",
+        0x8D6B,
+        "GL_MAX_ELEMENT_INDEX",
     },
     {
-     0x8D6C,
-     "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT",
+        0x8D6C,
+        "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT",
     },
     {
-     0x92A1,
-     "GL_CONTRAST_NV",
+        0x92A1,
+        "GL_CONTRAST_NV",
     },
     {
-     0x8252,
-     "GL_LOSE_CONTEXT_ON_RESET_KHR",
+        0x8252,
+        "GL_LOSE_CONTEXT_ON_RESET_KHR",
     },
     {
-     0x8C4C,
-     "GL_COMPRESSED_SRGB_S3TC_DXT1_NV",
+        0x8C4C,
+        "GL_COMPRESSED_SRGB_S3TC_DXT1_NV",
     },
     {
-     0x8C4E,
-     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV",
+        0x8C4E,
+        "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV",
     },
     {
-     0x8251,
-     "GL_DEBUG_TYPE_OTHER_KHR",
+        0x8251,
+        "GL_DEBUG_TYPE_OTHER_KHR",
     },
     {
-     0x8C4F,
-     "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV",
+        0x8C4F,
+        "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV",
     },
     {
-     0x9309,
-     "GL_REFERENCED_BY_GEOMETRY_SHADER_EXT",
+        0x9309,
+        "GL_REFERENCED_BY_GEOMETRY_SHADER_EXT",
     },
     {
-     0x93E9,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES",
+        0x93E9,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES",
     },
     {
-     0x93E8,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES",
+        0x93E8,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES",
     },
     {
-     0x8C43,
-     "GL_SRGB8_ALPHA8_EXT",
+        0x8C43,
+        "GL_SRGB8_ALPHA8_EXT",
     },
     {
-     0x8C42,
-     "GL_SRGB_ALPHA_EXT",
+        0x8C42,
+        "GL_SRGB_ALPHA_EXT",
     },
     {
-     0x8C45,
-     "GL_SLUMINANCE8_ALPHA8_NV",
+        0x8C45,
+        "GL_SLUMINANCE8_ALPHA8_NV",
     },
     {
-     0x8C44,
-     "GL_SLUMINANCE_ALPHA_NV",
+        0x8C44,
+        "GL_SLUMINANCE_ALPHA_NV",
     },
     {
-     0x8C47,
-     "GL_SLUMINANCE8_NV",
+        0x8C47,
+        "GL_SLUMINANCE8_NV",
     },
     {
-     0x8C46,
-     "GL_SLUMINANCE_NV",
+        0x8C46,
+        "GL_SLUMINANCE_NV",
     },
     {
-     0x93E1,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES",
+        0x93E1,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES",
     },
     {
-     0x93E0,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES",
+        0x93E0,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES",
     },
     {
-     0x93E3,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES",
+        0x93E3,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES",
     },
     {
-     0x93E2,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES",
+        0x93E2,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES",
     },
     {
-     0x93E5,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES",
+        0x93E5,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES",
     },
     {
-     0x93E4,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES",
+        0x93E4,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES",
     },
     {
-     0x93E7,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES",
+        0x93E7,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES",
     },
     {
-     0x93E6,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES",
+        0x93E6,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES",
     },
     {
-     0x8D68,
-     "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES",
+        0x8D68,
+        "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES",
     },
     {
-     0x8E82,
-     "GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT",
+        0x8E82,
+        "GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT",
     },
     {
-     0x8E81,
-     "GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT",
+        0x8E81,
+        "GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT",
     },
     {
-     0x85BB,
-     "GL_UNSIGNED_SHORT_8_8_REV_APPLE",
+        0x85BB,
+        "GL_UNSIGNED_SHORT_8_8_REV_APPLE",
     },
     {
-     0x8E87,
-     "GL_TESS_EVALUATION_SHADER_EXT",
+        0x8E87,
+        "GL_TESS_EVALUATION_SHADER_EXT",
     },
     {
-     0x8E86,
-     "GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT",
+        0x8E86,
+        "GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT",
     },
     {
-     0x8E85,
-     "GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT",
+        0x8E85,
+        "GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT",
     },
     {
-     0x8E84,
-     "GL_MAX_TESS_PATCH_COMPONENTS_EXT",
+        0x8E84,
+        "GL_MAX_TESS_PATCH_COMPONENTS_EXT",
     },
     {
-     0x8D61,
-     "GL_HALF_FLOAT_OES",
+        0x8D61,
+        "GL_HALF_FLOAT_OES",
     },
     {
-     0x8D62,
-     "GL_RGB565",
+        0x8D62,
+        "GL_RGB565",
     },
     {
-     0x8E88,
-     "GL_TESS_CONTROL_SHADER_EXT",
+        0x8E88,
+        "GL_TESS_CONTROL_SHADER_EXT",
     },
     {
-     0x8D64,
-     "GL_ETC1_RGB8_OES",
+        0x8D64,
+        "GL_ETC1_RGB8_OES",
     },
     {
-     0x8D65,
-     "GL_TEXTURE_EXTERNAL_OES",
+        0x8D65,
+        "GL_TEXTURE_EXTERNAL_OES",
     },
     {
-     0x8D66,
-     "GL_SAMPLER_EXTERNAL_OES",
+        0x8D66,
+        "GL_SAMPLER_EXTERNAL_OES",
     },
     {
-     0x8D67,
-     "GL_TEXTURE_BINDING_EXTERNAL_OES",
+        0x8D67,
+        "GL_TEXTURE_BINDING_EXTERNAL_OES",
     },
     {
-     0x10000000,
-     "GL_MULTISAMPLE_BUFFER_BIT4_QCOM",
+        0x10000000,
+        "GL_MULTISAMPLE_BUFFER_BIT4_QCOM",
     },
     {
-     0x04000000,
-     "GL_MULTISAMPLE_BUFFER_BIT2_QCOM",
+        0x04000000,
+        "GL_MULTISAMPLE_BUFFER_BIT2_QCOM",
     },
     {
-     0x90D7,
-     "GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT",
+        0x90D7,
+        "GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT",
     },
     {
-     0x90D9,
-     "GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT",
+        0x90D9,
+        "GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT",
     },
     {
-     0x90D8,
-     "GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT",
+        0x90D8,
+        "GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT",
     },
     {
-     0x8CEE,
-     "GL_COLOR_ATTACHMENT14_EXT",
+        0x8CEE,
+        "GL_COLOR_ATTACHMENT14_EXT",
     },
     {
-     0x8DC7,
-     "GL_UNSIGNED_INT_VEC3",
+        0x8DC7,
+        "GL_UNSIGNED_INT_VEC3",
     },
     {
-     0x1701,
-     "GL_PATH_PROJECTION_CHROMIUM",
+        0x1701,
+        "GL_PATH_PROJECTION_CHROMIUM",
     },
     {
-     0x2800,
-     "GL_TEXTURE_MAG_FILTER",
+        0x2800,
+        "GL_TEXTURE_MAG_FILTER",
     },
     {
-     0x2801,
-     "GL_TEXTURE_MIN_FILTER",
+        0x2801,
+        "GL_TEXTURE_MIN_FILTER",
     },
     {
-     0x2802,
-     "GL_TEXTURE_WRAP_S",
+        0x2802,
+        "GL_TEXTURE_WRAP_S",
     },
     {
-     0x2803,
-     "GL_TEXTURE_WRAP_T",
+        0x2803,
+        "GL_TEXTURE_WRAP_T",
     },
     {
-     0x8DCB,
-     "GL_INT_SAMPLER_3D",
+        0x8DCB,
+        "GL_INT_SAMPLER_3D",
     },
     {
-     0x3007,
-     "GL_CLIP_DISTANCE7_APPLE",
+        0x3007,
+        "GL_CLIP_DISTANCE7_APPLE",
     },
     {
-     0x2703,
-     "GL_LINEAR_MIPMAP_LINEAR",
+        0x2703,
+        "GL_LINEAR_MIPMAP_LINEAR",
     },
     {
-     0x3005,
-     "GL_CLIP_DISTANCE5_APPLE",
+        0x3005,
+        "GL_CLIP_DISTANCE5_APPLE",
     },
     {
-     0x3004,
-     "GL_CLIP_DISTANCE4_APPLE",
+        0x3004,
+        "GL_CLIP_DISTANCE4_APPLE",
     },
     {
-     0x8B98,
-     "GL_PALETTE8_RGBA4_OES",
+        0x8B98,
+        "GL_PALETTE8_RGBA4_OES",
     },
     {
-     0x3002,
-     "GL_CLIP_DISTANCE2_APPLE",
+        0x3002,
+        "GL_CLIP_DISTANCE2_APPLE",
     },
     {
-     0x3001,
-     "GL_CLIP_DISTANCE1_APPLE",
+        0x3001,
+        "GL_CLIP_DISTANCE1_APPLE",
     },
     {
-     0x2702,
-     "GL_NEAREST_MIPMAP_LINEAR",
+        0x2702,
+        "GL_NEAREST_MIPMAP_LINEAR",
     },
     {
-     0x1F03,
-     "GL_EXTENSIONS",
+        0x1F03,
+        "GL_EXTENSIONS",
     },
     {
-     0x1F02,
-     "GL_VERSION",
+        0x1F02,
+        "GL_VERSION",
     },
     {
-     0x1F01,
-     "GL_RENDERER",
+        0x1F01,
+        "GL_RENDERER",
     },
     {
-     0x1F00,
-     "GL_VENDOR",
+        0x1F00,
+        "GL_VENDOR",
     },
     {
-     0x9247,
-     "GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM",
+        0x9247,
+        "GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM",
     },
     {
-     0x2701,
-     "GL_LINEAR_MIPMAP_NEAREST",
+        0x2701,
+        "GL_LINEAR_MIPMAP_NEAREST",
     },
     {
-     0x9245,
-     "GL_OVERLAY_TRANSFORM_NONE_CHROMIUM",
+        0x9245,
+        "GL_OVERLAY_TRANSFORM_NONE_CHROMIUM",
     },
     {
-     0x92B4,
-     "GL_INVERT_OVG_NV",
+        0x92B4,
+        "GL_INVERT_OVG_NV",
     },
     {
-     0x9249,
-     "GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM",
+        0x9249,
+        "GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM",
     },
     {
-     0x0B94,
-     "GL_STENCIL_FAIL",
+        0x0B94,
+        "GL_STENCIL_FAIL",
     },
     {
-     0x8B4A,
-     "GL_MAX_VERTEX_UNIFORM_COMPONENTS",
+        0x8B4A,
+        "GL_MAX_VERTEX_UNIFORM_COMPONENTS",
     },
     {
-     0x8B4B,
-     "GL_MAX_VARYING_COMPONENTS",
+        0x8B4B,
+        "GL_MAX_VARYING_COMPONENTS",
     },
     {
-     0x8B4C,
-     "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS",
+        0x8B4C,
+        "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS",
     },
     {
-     0x8B4D,
-     "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS",
+        0x8B4D,
+        "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS",
     },
     {
-     0x8B4F,
-     "GL_SHADER_TYPE",
+        0x8B4F,
+        "GL_SHADER_TYPE",
     },
     {
-     0x9122,
-     "GL_MAX_VERTEX_OUTPUT_COMPONENTS",
+        0x9122,
+        "GL_MAX_VERTEX_OUTPUT_COMPONENTS",
     },
     {
-     0x9123,
-     "GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT",
+        0x9123,
+        "GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT",
     },
     {
-     0x83FB,
-     "GL_PERFQUERY_WAIT_INTEL",
+        0x83FB,
+        "GL_PERFQUERY_WAIT_INTEL",
     },
     {
-     0x9121,
-     "GL_BUFFER_MAP_OFFSET",
+        0x9121,
+        "GL_BUFFER_MAP_OFFSET",
     },
     {
-     0x00004000,
-     "GL_COLOR_BUFFER_BIT",
+        0x00004000,
+        "GL_COLOR_BUFFER_BIT",
     },
     {
-     0x9125,
-     "GL_MAX_FRAGMENT_INPUT_COMPONENTS",
+        0x9125,
+        "GL_MAX_FRAGMENT_INPUT_COMPONENTS",
     },
     {
-     0x00000010,
-     "GL_TESS_EVALUATION_SHADER_BIT_EXT",
+        0x00000010,
+        "GL_TESS_EVALUATION_SHADER_BIT_EXT",
     },
     {
-     0x8834,
-     "GL_DRAW_BUFFER15_EXT",
+        0x8834,
+        "GL_DRAW_BUFFER15_EXT",
     },
     {
-     0x8833,
-     "GL_DRAW_BUFFER14_EXT",
+        0x8833,
+        "GL_DRAW_BUFFER14_EXT",
     },
     {
-     0x8832,
-     "GL_DRAW_BUFFER13_EXT",
+        0x8832,
+        "GL_DRAW_BUFFER13_EXT",
     },
     {
-     0x8831,
-     "GL_DRAW_BUFFER12_EXT",
+        0x8831,
+        "GL_DRAW_BUFFER12_EXT",
     },
     {
-     0x8830,
-     "GL_DRAW_BUFFER11_EXT",
+        0x8830,
+        "GL_DRAW_BUFFER11_EXT",
     },
     {
-     0x8DC5,
-     "GL_SAMPLER_CUBE_SHADOW_NV",
+        0x8DC5,
+        "GL_SAMPLER_CUBE_SHADOW_NV",
     },
     {
-     0x94FF,
-     "GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL",
+        0x94FF,
+        "GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL",
     },
     {
-     0x94FE,
-     "GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL",
+        0x94FE,
+        "GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL",
     },
     {
-     0x94FD,
-     "GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL",
+        0x94FD,
+        "GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL",
     },
     {
-     0x94FC,
-     "GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL",
+        0x94FC,
+        "GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL",
     },
     {
-     0x94FB,
-     "GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL",
+        0x94FB,
+        "GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL",
     },
     {
-     0x93B8,
-     "GL_COMPRESSED_RGBA_ASTC_10x5_KHR",
+        0x93B8,
+        "GL_COMPRESSED_RGBA_ASTC_10x5_KHR",
     },
     {
-     0x8B65,
-     "GL_FLOAT_MAT2x3_NV",
+        0x8B65,
+        "GL_FLOAT_MAT2x3_NV",
     },
     {
-     0x9241,
-     "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM",
+        0x9241,
+        "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM",
     },
     {
-     0x00010000,
-     "GL_STENCIL_BUFFER_BIT0_QCOM",
+        0x00010000,
+        "GL_STENCIL_BUFFER_BIT0_QCOM",
     },
     {
-     0x83FA,
-     "GL_PERFQUERY_FLUSH_INTEL",
+        0x83FA,
+        "GL_PERFQUERY_FLUSH_INTEL",
     },
     {
-     0x0D03,
-     "GL_PACK_SKIP_ROWS",
+        0x0D03,
+        "GL_PACK_SKIP_ROWS",
     },
     {
-     0x84F3,
-     "GL_FENCE_STATUS_NV",
+        0x84F3,
+        "GL_FENCE_STATUS_NV",
     },
     {
-     0x88E6,
-     "GL_STATIC_COPY",
+        0x88E6,
+        "GL_STATIC_COPY",
     },
     {
-     0x0B93,
-     "GL_STENCIL_VALUE_MASK",
+        0x0B93,
+        "GL_STENCIL_VALUE_MASK",
     },
     {
-     0x0B92,
-     "GL_STENCIL_FUNC",
+        0x0B92,
+        "GL_STENCIL_FUNC",
     },
     {
-     0x0B91,
-     "GL_STENCIL_CLEAR_VALUE",
+        0x0B91,
+        "GL_STENCIL_CLEAR_VALUE",
     },
     {
-     0x883D,
-     "GL_BLEND_EQUATION_ALPHA",
+        0x883D,
+        "GL_BLEND_EQUATION_ALPHA",
     },
     {
-     0x0B97,
-     "GL_STENCIL_REF",
+        0x0B97,
+        "GL_STENCIL_REF",
     },
     {
-     0x0B96,
-     "GL_STENCIL_PASS_DEPTH_PASS",
+        0x0B96,
+        "GL_STENCIL_PASS_DEPTH_PASS",
     },
     {
-     0x0B95,
-     "GL_STENCIL_PASS_DEPTH_FAIL",
+        0x0B95,
+        "GL_STENCIL_PASS_DEPTH_FAIL",
     },
     {
-     0x2700,
-     "GL_NEAREST_MIPMAP_NEAREST",
+        0x2700,
+        "GL_NEAREST_MIPMAP_NEAREST",
     },
     {
-     0x94F5,
-     "GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL",
+        0x94F5,
+        "GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL",
     },
     {
-     0x0B98,
-     "GL_STENCIL_WRITEMASK",
+        0x0B98,
+        "GL_STENCIL_WRITEMASK",
     },
     {
-     0x94F3,
-     "GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL",
+        0x94F3,
+        "GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL",
     },
     {
-     0x94F2,
-     "GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL",
+        0x94F2,
+        "GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL",
     },
     {
-     0x94F1,
-     "GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL",
+        0x94F1,
+        "GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL",
     },
     {
-     0x94F0,
-     "GL_PERFQUERY_COUNTER_EVENT_INTEL",
+        0x94F0,
+        "GL_PERFQUERY_COUNTER_EVENT_INTEL",
     },
     {
-     0x8B40,
-     "GL_PROGRAM_OBJECT_EXT",
+        0x8B40,
+        "GL_PROGRAM_OBJECT_EXT",
     },
     {
-     0x1004,
-     "GL_TEXTURE_BORDER_COLOR_EXT",
+        0x1004,
+        "GL_TEXTURE_BORDER_COLOR_EXT",
     },
     {
-     0x8A2D,
-     "GL_MAX_FRAGMENT_UNIFORM_BLOCKS",
+        0x8A2D,
+        "GL_MAX_FRAGMENT_UNIFORM_BLOCKS",
     },
     {
-     0x8B48,
-     "GL_SHADER_OBJECT_EXT",
+        0x8B48,
+        "GL_SHADER_OBJECT_EXT",
     },
     {
-     0x8B49,
-     "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS",
+        0x8B49,
+        "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS",
     },
     {
-     0x813A,
-     "GL_TEXTURE_MIN_LOD",
+        0x813A,
+        "GL_TEXTURE_MIN_LOD",
     },
     {
-     0x8DE1,
-     "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT",
+        0x8DE1,
+        "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT",
     },
     {
-     0x8DE0,
-     "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT",
+        0x8DE0,
+        "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT",
     },
     {
-     0x924C,
-     "GL_MOUSE_POSITION_CHROMIUM",
+        0x924C,
+        "GL_MOUSE_POSITION_CHROMIUM",
     },
     {
-     0x924B,
-     "GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM",
+        0x924B,
+        "GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM",
     },
     {
-     0x924A,
-     "GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM",
+        0x924A,
+        "GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM",
     },
     {
-     0x8A2F,
-     "GL_MAX_UNIFORM_BUFFER_BINDINGS",
+        0x8A2F,
+        "GL_MAX_UNIFORM_BUFFER_BINDINGS",
     },
     {
-     0x20000000,
-     "GL_MULTISAMPLE_BUFFER_BIT5_QCOM",
+        0x20000000,
+        "GL_MULTISAMPLE_BUFFER_BIT5_QCOM",
     },
     {
-     64,
-     "GL_MAILBOX_SIZE_CHROMIUM",
+        64,
+        "GL_MAILBOX_SIZE_CHROMIUM",
     },
     {
-     0x0DE1,
-     "GL_TEXTURE_2D",
+        0x0DE1,
+        "GL_TEXTURE_2D",
     },
     {
-     0x8A2C,
-     "GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT",
+        0x8A2C,
+        "GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT",
     },
     {
-     0x80C9,
-     "GL_BLEND_SRC_RGB",
+        0x80C9,
+        "GL_BLEND_SRC_RGB",
     },
     {
-     0x80C8,
-     "GL_BLEND_DST_RGB",
+        0x80C8,
+        "GL_BLEND_DST_RGB",
     },
     {
-     0x912F,
-     "GL_TEXTURE_IMMUTABLE_FORMAT_EXT",
+        0x912F,
+        "GL_TEXTURE_IMMUTABLE_FORMAT_EXT",
     },
     {
-     0x8A2B,
-     "GL_MAX_VERTEX_UNIFORM_BLOCKS",
+        0x8A2B,
+        "GL_MAX_VERTEX_UNIFORM_BLOCKS",
     },
     {
-     0x88EC,
-     "GL_PIXEL_UNPACK_BUFFER",
+        0x88EC,
+        "GL_PIXEL_UNPACK_BUFFER",
     },
     {
-     0x8D8F,
-     "GL_RGB8I",
+        0x8D8F,
+        "GL_RGB8I",
     },
     {
-     0x8059,
-     "GL_RGB10_A2_EXT",
+        0x8059,
+        "GL_RGB10_A2_EXT",
     },
     {
-     0x8058,
-     "GL_RGBA8_OES",
+        0x8058,
+        "GL_RGBA8_OES",
     },
     {
-     0x8B93,
-     "GL_PALETTE4_RGBA4_OES",
+        0x8B93,
+        "GL_PALETTE4_RGBA4_OES",
     },
     {
-     0x88EB,
-     "GL_PIXEL_PACK_BUFFER",
+        0x88EB,
+        "GL_PIXEL_PACK_BUFFER",
     },
     {
-     0x8E83,
-     "GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT",
+        0x8E83,
+        "GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT",
     },
     {
-     0x8051,
-     "GL_RGB8_OES",
+        0x8051,
+        "GL_RGB8_OES",
     },
     {
-     0x8CAD,
-     "GL_DEPTH32F_STENCIL8",
+        0x8CAD,
+        "GL_DEPTH32F_STENCIL8",
     },
     {
-     0x8052,
-     "GL_RGB10_EXT",
+        0x8052,
+        "GL_RGB10_EXT",
     },
     {
-     0x8CAB,
-     "GL_RENDERBUFFER_SAMPLES_ANGLE",
+        0x8CAB,
+        "GL_RENDERBUFFER_SAMPLES_ANGLE",
     },
     {
-     0x8CAC,
-     "GL_DEPTH_COMPONENT32F",
+        0x8CAC,
+        "GL_DEPTH_COMPONENT32F",
     },
     {
-     0x8057,
-     "GL_RGB5_A1",
+        0x8057,
+        "GL_RGB5_A1",
     },
     {
-     0x8056,
-     "GL_RGBA4",
+        0x8056,
+        "GL_RGBA4",
     },
     {
-     0x8232,
-     "GL_R8UI",
+        0x8232,
+        "GL_R8UI",
     },
     {
-     0x150A,
-     "GL_INVERT",
+        0x150A,
+        "GL_INVERT",
     },
     {
-     0x01000000,
-     "GL_MULTISAMPLE_BUFFER_BIT0_QCOM",
+        0x01000000,
+        "GL_MULTISAMPLE_BUFFER_BIT0_QCOM",
     },
     {
-     0x78ED,
-     "GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM",
+        0x78ED,
+        "GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM",
     },
     {
-     0x78EE,
-     "GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
+        0x78EE,
+        "GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM",
     },
     {
-     0x6001,
-     "GL_TEXTURE_POOL_MANAGED_CHROMIUM",
+        0x6001,
+        "GL_TEXTURE_POOL_MANAGED_CHROMIUM",
     },
     {
-     0x0B45,
-     "GL_CULL_FACE_MODE",
+        0x0B45,
+        "GL_CULL_FACE_MODE",
     },
     {
-     0x8B92,
-     "GL_PALETTE4_R5_G6_B5_OES",
+        0x8B92,
+        "GL_PALETTE4_R5_G6_B5_OES",
     },
     {
-     0x00100000,
-     "GL_STENCIL_BUFFER_BIT4_QCOM",
+        0x00100000,
+        "GL_STENCIL_BUFFER_BIT4_QCOM",
     },
     {
-     0x8E4E,
-     "GL_LAST_VERTEX_CONVENTION_EXT",
+        0x8E4E,
+        "GL_LAST_VERTEX_CONVENTION_EXT",
     },
     {
-     0x8E4D,
-     "GL_FIRST_VERTEX_CONVENTION_EXT",
+        0x8E4D,
+        "GL_FIRST_VERTEX_CONVENTION_EXT",
     },
     {
-     0x8E24,
-     "GL_TRANSFORM_FEEDBACK_ACTIVE",
+        0x8E24,
+        "GL_TRANSFORM_FEEDBACK_ACTIVE",
     },
     {
-     0x8E45,
-     "GL_TEXTURE_SWIZZLE_A",
+        0x8E45,
+        "GL_TEXTURE_SWIZZLE_A",
     },
     {
-     0x8E44,
-     "GL_TEXTURE_SWIZZLE_B",
+        0x8E44,
+        "GL_TEXTURE_SWIZZLE_B",
     },
     {
-     0x8E43,
-     "GL_TEXTURE_SWIZZLE_G",
+        0x8E43,
+        "GL_TEXTURE_SWIZZLE_G",
     },
     {
-     0x8E42,
-     "GL_TEXTURE_SWIZZLE_R",
+        0x8E42,
+        "GL_TEXTURE_SWIZZLE_R",
     },
     {
-     0x8D20,
-     "GL_STENCIL_ATTACHMENT",
+        0x8D20,
+        "GL_STENCIL_ATTACHMENT",
     },
     {
-     0x8B91,
-     "GL_PALETTE4_RGBA8_OES",
+        0x8B91,
+        "GL_PALETTE4_RGBA8_OES",
     },
     {
-     0x00000200,
-     "GL_DEPTH_BUFFER_BIT1_QCOM",
+        0x00000200,
+        "GL_DEPTH_BUFFER_BIT1_QCOM",
     },
     {
-     0x00008000,
-     "GL_COVERAGE_BUFFER_BIT_NV",
+        0x00008000,
+        "GL_COVERAGE_BUFFER_BIT_NV",
     },
     {
-     0x1506,
-     "GL_XOR_NV",
+        0x1506,
+        "GL_XOR_NV",
     },
     {
-     0x8CA8,
-     "GL_READ_FRAMEBUFFER_ANGLE",
+        0x8CA8,
+        "GL_READ_FRAMEBUFFER_ANGLE",
     },
     {
-     0x8CA9,
-     "GL_DRAW_FRAMEBUFFER_ANGLE",
+        0x8CA9,
+        "GL_DRAW_FRAMEBUFFER_ANGLE",
     },
     {
-     0x8CA6,
-     "GL_FRAMEBUFFER_BINDING",
+        0x8CA6,
+        "GL_FRAMEBUFFER_BINDING",
     },
     {
-     0x8CA7,
-     "GL_RENDERBUFFER_BINDING",
+        0x8CA7,
+        "GL_RENDERBUFFER_BINDING",
     },
     {
-     0x8CA4,
-     "GL_STENCIL_BACK_VALUE_MASK",
+        0x8CA4,
+        "GL_STENCIL_BACK_VALUE_MASK",
     },
     {
-     0x8CA5,
-     "GL_STENCIL_BACK_WRITEMASK",
+        0x8CA5,
+        "GL_STENCIL_BACK_WRITEMASK",
     },
     {
-     0x8B90,
-     "GL_PALETTE4_RGB8_OES",
+        0x8B90,
+        "GL_PALETTE4_RGB8_OES",
     },
     {
-     0x8CA3,
-     "GL_STENCIL_BACK_REF",
+        0x8CA3,
+        "GL_STENCIL_BACK_REF",
     },
     {
-     0x80E8,
-     "GL_MAX_ELEMENTS_VERTICES",
+        0x80E8,
+        "GL_MAX_ELEMENTS_VERTICES",
     },
     {
-     0x80CB,
-     "GL_BLEND_SRC_ALPHA",
+        0x80CB,
+        "GL_BLEND_SRC_ALPHA",
     },
     {
-     0x80CA,
-     "GL_BLEND_DST_ALPHA",
+        0x80CA,
+        "GL_BLEND_DST_ALPHA",
     },
     {
-     0x8CE7,
-     "GL_COLOR_ATTACHMENT7_EXT",
+        0x8CE7,
+        "GL_COLOR_ATTACHMENT7_EXT",
     },
     {
-     0x93B0,
-     "GL_COMPRESSED_RGBA_ASTC_4x4_KHR",
+        0x93B0,
+        "GL_COMPRESSED_RGBA_ASTC_4x4_KHR",
     },
     {
-     0x93B1,
-     "GL_COMPRESSED_RGBA_ASTC_5x4_KHR",
+        0x93B1,
+        "GL_COMPRESSED_RGBA_ASTC_5x4_KHR",
     },
     {
-     0x93B2,
-     "GL_COMPRESSED_RGBA_ASTC_5x5_KHR",
+        0x93B2,
+        "GL_COMPRESSED_RGBA_ASTC_5x5_KHR",
     },
     {
-     0x93B3,
-     "GL_COMPRESSED_RGBA_ASTC_6x5_KHR",
+        0x93B3,
+        "GL_COMPRESSED_RGBA_ASTC_6x5_KHR",
     },
     {
-     0x93B4,
-     "GL_COMPRESSED_RGBA_ASTC_6x6_KHR",
+        0x93B4,
+        "GL_COMPRESSED_RGBA_ASTC_6x6_KHR",
     },
     {
-     0x93B5,
-     "GL_COMPRESSED_RGBA_ASTC_8x5_KHR",
+        0x93B5,
+        "GL_COMPRESSED_RGBA_ASTC_8x5_KHR",
     },
     {
-     0x93B6,
-     "GL_COMPRESSED_RGBA_ASTC_8x6_KHR",
+        0x93B6,
+        "GL_COMPRESSED_RGBA_ASTC_8x6_KHR",
     },
     {
-     0x93B7,
-     "GL_COMPRESSED_RGBA_ASTC_8x8_KHR",
+        0x93B7,
+        "GL_COMPRESSED_RGBA_ASTC_8x8_KHR",
     },
     {
-     0x8CD6,
-     "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
+        0x8CD6,
+        "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
     },
     {
-     0x93B9,
-     "GL_COMPRESSED_RGBA_ASTC_10x6_KHR",
+        0x93B9,
+        "GL_COMPRESSED_RGBA_ASTC_10x6_KHR",
     },
     {
-     0x80E9,
-     "GL_MAX_ELEMENTS_INDICES",
+        0x80E9,
+        "GL_MAX_ELEMENTS_INDICES",
     },
     {
-     0x8CE5,
-     "GL_COLOR_ATTACHMENT5_EXT",
+        0x8CE5,
+        "GL_COLOR_ATTACHMENT5_EXT",
     },
     {
-     0x8C84,
-     "GL_TRANSFORM_FEEDBACK_BUFFER_START",
+        0x8C84,
+        "GL_TRANSFORM_FEEDBACK_BUFFER_START",
     },
     {
-     0x8DC2,
-     "GL_SAMPLER_BUFFER_EXT",
+        0x8DC2,
+        "GL_SAMPLER_BUFFER_EXT",
     },
     {
-     0x8C36,
-     "GL_SAMPLE_SHADING_OES",
+        0x8C36,
+        "GL_SAMPLE_SHADING_OES",
     },
     {
-     0x8C37,
-     "GL_MIN_SAMPLE_SHADING_VALUE_OES",
+        0x8C37,
+        "GL_MIN_SAMPLE_SHADING_VALUE_OES",
     },
     {
-     0x8F97,
-     "GL_RGBA8_SNORM",
+        0x8F97,
+        "GL_RGBA8_SNORM",
     },
     {
-     0x8CE9,
-     "GL_COLOR_ATTACHMENT9_EXT",
+        0x8CE9,
+        "GL_COLOR_ATTACHMENT9_EXT",
     },
     {
-     0x8DAD,
-     "GL_FLOAT_32_UNSIGNED_INT_24_8_REV",
+        0x8DAD,
+        "GL_FLOAT_32_UNSIGNED_INT_24_8_REV",
     },
     {
-     0x8B96,
-     "GL_PALETTE8_RGBA8_OES",
+        0x8B96,
+        "GL_PALETTE8_RGBA8_OES",
     },
     {
-     0x8872,
-     "GL_MAX_TEXTURE_IMAGE_UNITS",
+        0x8872,
+        "GL_MAX_TEXTURE_IMAGE_UNITS",
     },
     {
-     0x8DC6,
-     "GL_UNSIGNED_INT_VEC2",
+        0x8DC6,
+        "GL_UNSIGNED_INT_VEC2",
     },
     {
-     0x8905,
-     "GL_MAX_PROGRAM_TEXEL_OFFSET",
+        0x8905,
+        "GL_MAX_PROGRAM_TEXEL_OFFSET",
     },
     {
-     0x8508,
-     "GL_DECR_WRAP",
+        0x8508,
+        "GL_DECR_WRAP",
     },
     {
-     0x92AD,
-     "GL_HSL_HUE_KHR",
+        0x92AD,
+        "GL_HSL_HUE_KHR",
     },
     {
-     0x92AE,
-     "GL_HSL_SATURATION_KHR",
+        0x92AE,
+        "GL_HSL_SATURATION_KHR",
     },
     {
-     0x92AF,
-     "GL_HSL_COLOR_KHR",
+        0x92AF,
+        "GL_HSL_COLOR_KHR",
     },
     {
-     0x8BD4,
-     "GL_TEXTURE_DEPTH_QCOM",
+        0x8BD4,
+        "GL_TEXTURE_DEPTH_QCOM",
     },
     {
-     0x8DC4,
-     "GL_SAMPLER_2D_ARRAY_SHADOW_NV",
+        0x8DC4,
+        "GL_SAMPLER_2D_ARRAY_SHADOW_NV",
     },
     {
-     0x8507,
-     "GL_INCR_WRAP",
+        0x8507,
+        "GL_INCR_WRAP",
     },
     {
-     0x82FC,
-     "GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR",
+        0x82FC,
+        "GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR",
     },
     {
-     0x8895,
-     "GL_ELEMENT_ARRAY_BUFFER_BINDING",
+        0x8895,
+        "GL_ELEMENT_ARRAY_BUFFER_BINDING",
     },
     {
-     0x8894,
-     "GL_ARRAY_BUFFER_BINDING",
+        0x8894,
+        "GL_ARRAY_BUFFER_BINDING",
     },
     {
-     0x92A3,
-     "GL_INVERT_RGB_NV",
+        0x92A3,
+        "GL_INVERT_RGB_NV",
     },
     {
-     0x905F,
-     "GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
+        0x905F,
+        "GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT",
     },
     {
-     0x92A5,
-     "GL_LINEARBURN_NV",
+        0x92A5,
+        "GL_LINEARBURN_NV",
     },
     {
-     0x8893,
-     "GL_ELEMENT_ARRAY_BUFFER",
+        0x8893,
+        "GL_ELEMENT_ARRAY_BUFFER",
     },
     {
-     0x8892,
-     "GL_ARRAY_BUFFER",
+        0x8892,
+        "GL_ARRAY_BUFFER",
     },
     {
-     0x92A8,
-     "GL_PINLIGHT_NV",
+        0x92A8,
+        "GL_PINLIGHT_NV",
     },
     {
-     0x92A9,
-     "GL_HARDMIX_NV",
+        0x92A9,
+        "GL_HARDMIX_NV",
     },
     {
-     0x9112,
-     "GL_OBJECT_TYPE_APPLE",
+        0x9112,
+        "GL_OBJECT_TYPE_APPLE",
     },
     {
-     0x90CC,
-     "GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT",
+        0x90CC,
+        "GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT",
     },
     {
-     0x90CD,
-     "GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT",
+        0x90CD,
+        "GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT",
     },
     {
-     0x919F,
-     "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT",
+        0x919F,
+        "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT",
     },
     {
-     0x919E,
-     "GL_TEXTURE_BUFFER_SIZE_EXT",
+        0x919E,
+        "GL_TEXTURE_BUFFER_SIZE_EXT",
     },
     {
-     0x919D,
-     "GL_TEXTURE_BUFFER_OFFSET_EXT",
+        0x919D,
+        "GL_TEXTURE_BUFFER_OFFSET_EXT",
     },
     {
-     0x8BD8,
-     "GL_TEXTURE_IMAGE_VALID_QCOM",
+        0x8BD8,
+        "GL_TEXTURE_IMAGE_VALID_QCOM",
     },
     {
-     0x9278,
-     "GL_COMPRESSED_RGBA8_ETC2_EAC",
+        0x9278,
+        "GL_COMPRESSED_RGBA8_ETC2_EAC",
     },
     {
-     0x9279,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
+        0x9279,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
     },
     {
-     0x8DA7,
-     "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT",
+        0x8DA7,
+        "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT",
     },
     {
-     0x9272,
-     "GL_COMPRESSED_RG11_EAC",
+        0x9272,
+        "GL_COMPRESSED_RG11_EAC",
     },
     {
-     0x8DA8,
-     "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT",
+        0x8DA8,
+        "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT",
     },
     {
-     0x9270,
-     "GL_COMPRESSED_R11_EAC",
+        0x9270,
+        "GL_COMPRESSED_R11_EAC",
     },
     {
-     0x9271,
-     "GL_COMPRESSED_SIGNED_R11_EAC",
+        0x9271,
+        "GL_COMPRESSED_SIGNED_R11_EAC",
     },
     {
-     0x9276,
-     "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
+        0x9276,
+        "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
     },
     {
-     0x887F,
-     "GL_GEOMETRY_SHADER_INVOCATIONS_EXT",
+        0x887F,
+        "GL_GEOMETRY_SHADER_INVOCATIONS_EXT",
     },
     {
-     0x8A3B,
-     "GL_UNIFORM_OFFSET",
+        0x8A3B,
+        "GL_UNIFORM_OFFSET",
     },
     {
-     0x9275,
-     "GL_COMPRESSED_SRGB8_ETC2",
+        0x9275,
+        "GL_COMPRESSED_SRGB8_ETC2",
     },
     {
-     0x84D5,
-     "GL_TEXTURE21",
+        0x84D5,
+        "GL_TEXTURE21",
     },
     {
-     0x8C3A,
-     "GL_R11F_G11F_B10F_APPLE",
+        0x8C3A,
+        "GL_R11F_G11F_B10F_APPLE",
     },
     {
-     0x8C3B,
-     "GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE",
+        0x8C3B,
+        "GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE",
     },
     {
-     0x8C3D,
-     "GL_RGB9_E5_APPLE",
+        0x8C3D,
+        "GL_RGB9_E5_APPLE",
     },
     {
-     0x8C3E,
-     "GL_UNSIGNED_INT_5_9_9_9_REV_APPLE",
+        0x8C3E,
+        "GL_UNSIGNED_INT_5_9_9_9_REV_APPLE",
     },
     {
-     0x9287,
-     "GL_DST_NV",
+        0x9287,
+        "GL_DST_NV",
     },
     {
-     0x93BA,
-     "GL_COMPRESSED_RGBA_ASTC_10x8_KHR",
+        0x93BA,
+        "GL_COMPRESSED_RGBA_ASTC_10x8_KHR",
     },
     {
-     0x9285,
-     "GL_BLEND_ADVANCED_COHERENT_KHR",
+        0x9285,
+        "GL_BLEND_ADVANCED_COHERENT_KHR",
     },
     {
-     0x93BC,
-     "GL_COMPRESSED_RGBA_ASTC_12x10_KHR",
+        0x93BC,
+        "GL_COMPRESSED_RGBA_ASTC_12x10_KHR",
     },
     {
-     0x93BD,
-     "GL_COMPRESSED_RGBA_ASTC_12x12_KHR",
+        0x93BD,
+        "GL_COMPRESSED_RGBA_ASTC_12x12_KHR",
     },
     {
-     0x84E8,
-     "GL_MAX_RENDERBUFFER_SIZE",
+        0x84E8,
+        "GL_MAX_RENDERBUFFER_SIZE",
     },
     {
-     0x9281,
-     "GL_BLEND_OVERLAP_NV",
+        0x9281,
+        "GL_BLEND_OVERLAP_NV",
     },
     {
-     0x9280,
-     "GL_BLEND_PREMULTIPLIED_SRC_NV",
+        0x9280,
+        "GL_BLEND_PREMULTIPLIED_SRC_NV",
     },
     {
-     0x00002000,
-     "GL_DEPTH_BUFFER_BIT5_QCOM",
+        0x00002000,
+        "GL_DEPTH_BUFFER_BIT5_QCOM",
     },
     {
-     0x8370,
-     "GL_MIRRORED_REPEAT",
+        0x8370,
+        "GL_MIRRORED_REPEAT",
     },
     {
-     0x84E0,
-     "GL_ACTIVE_TEXTURE",
+        0x84E0,
+        "GL_ACTIVE_TEXTURE",
     },
     {
-     0x8800,
-     "GL_STENCIL_BACK_FUNC",
+        0x8800,
+        "GL_STENCIL_BACK_FUNC",
     },
     {
-     0x8801,
-     "GL_STENCIL_BACK_FAIL",
+        0x8801,
+        "GL_STENCIL_BACK_FAIL",
     },
     {
-     0x0D33,
-     "GL_MAX_TEXTURE_SIZE",
+        0x0D33,
+        "GL_MAX_TEXTURE_SIZE",
     },
     {
-     0x0D32,
-     "GL_MAX_CLIP_DISTANCES_APPLE",
+        0x0D32,
+        "GL_MAX_CLIP_DISTANCES_APPLE",
     },
     {
-     0x8624,
-     "GL_VERTEX_ATTRIB_ARRAY_STRIDE",
+        0x8624,
+        "GL_VERTEX_ATTRIB_ARRAY_STRIDE",
     },
     {
-     0x8625,
-     "GL_VERTEX_ATTRIB_ARRAY_TYPE",
+        0x8625,
+        "GL_VERTEX_ATTRIB_ARRAY_TYPE",
     },
     {
-     0x8622,
-     "GL_VERTEX_ATTRIB_ARRAY_ENABLED",
+        0x8622,
+        "GL_VERTEX_ATTRIB_ARRAY_ENABLED",
     },
     {
-     0x8623,
-     "GL_VERTEX_ATTRIB_ARRAY_SIZE",
+        0x8623,
+        "GL_VERTEX_ATTRIB_ARRAY_SIZE",
     },
     {
-     0x8DB9,
-     "GL_FRAMEBUFFER_SRGB_EXT",
+        0x8DB9,
+        "GL_FRAMEBUFFER_SRGB_EXT",
     },
     {
-     0x9307,
-     "GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT",
+        0x9307,
+        "GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT",
     },
     {
-     0x8259,
-     "GL_ACTIVE_PROGRAM_EXT",
+        0x8259,
+        "GL_ACTIVE_PROGRAM_EXT",
     },
     {
-     0x8258,
-     "GL_PROGRAM_SEPARABLE_EXT",
+        0x8258,
+        "GL_PROGRAM_SEPARABLE_EXT",
     },
     {
-     0x8257,
-     "GL_PROGRAM_BINARY_RETRIEVABLE_HINT",
+        0x8257,
+        "GL_PROGRAM_BINARY_RETRIEVABLE_HINT",
     },
     {
-     0x8256,
-     "GL_RESET_NOTIFICATION_STRATEGY_KHR",
+        0x8256,
+        "GL_RESET_NOTIFICATION_STRATEGY_KHR",
     },
     {
-     0x8255,
-     "GL_UNKNOWN_CONTEXT_RESET_KHR",
+        0x8255,
+        "GL_UNKNOWN_CONTEXT_RESET_KHR",
     },
     {
-     0x8254,
-     "GL_INNOCENT_CONTEXT_RESET_KHR",
+        0x8254,
+        "GL_INNOCENT_CONTEXT_RESET_KHR",
     },
     {
-     0x1100,
-     "GL_DONT_CARE",
+        0x1100,
+        "GL_DONT_CARE",
     },
     {
-     0x1101,
-     "GL_FASTEST",
+        0x1101,
+        "GL_FASTEST",
     },
     {
-     0x1102,
-     "GL_NICEST",
+        0x1102,
+        "GL_NICEST",
     },
     {
-     0x8250,
-     "GL_DEBUG_TYPE_PERFORMANCE_KHR",
+        0x8250,
+        "GL_DEBUG_TYPE_PERFORMANCE_KHR",
     },
     {
-     0x8CEB,
-     "GL_COLOR_ATTACHMENT11_EXT",
+        0x8CEB,
+        "GL_COLOR_ATTACHMENT11_EXT",
     },
     {
-     0x8CEC,
-     "GL_COLOR_ATTACHMENT12_EXT",
+        0x8CEC,
+        "GL_COLOR_ATTACHMENT12_EXT",
     },
     {
-     0x0408,
-     "GL_FRONT_AND_BACK",
+        0x0408,
+        "GL_FRONT_AND_BACK",
     },
     {
-     0x8CEA,
-     "GL_COLOR_ATTACHMENT10_EXT",
+        0x8CEA,
+        "GL_COLOR_ATTACHMENT10_EXT",
     },
     {
-     0x8CEF,
-     "GL_COLOR_ATTACHMENT15_EXT",
+        0x8CEF,
+        "GL_COLOR_ATTACHMENT15_EXT",
     },
     {
-     0x8CED,
-     "GL_COLOR_ATTACHMENT13_EXT",
+        0x8CED,
+        "GL_COLOR_ATTACHMENT13_EXT",
     },
     {
-     0x8829,
-     "GL_DRAW_BUFFER4_EXT",
+        0x8829,
+        "GL_DRAW_BUFFER4_EXT",
     },
     {
-     0x0404,
-     "GL_FRONT",
+        0x0404,
+        "GL_FRONT",
     },
     {
-     0x0405,
-     "GL_BACK",
+        0x0405,
+        "GL_BACK",
     },
     {
-     0x88E1,
-     "GL_STREAM_READ",
+        0x88E1,
+        "GL_STREAM_READ",
     },
     {
-     0x88E0,
-     "GL_STREAM_DRAW",
+        0x88E0,
+        "GL_STREAM_DRAW",
     },
     {
-     0x88E2,
-     "GL_STREAM_COPY",
+        0x88E2,
+        "GL_STREAM_COPY",
     },
     {
-     0x88E5,
-     "GL_STATIC_READ",
+        0x88E5,
+        "GL_STATIC_READ",
     },
     {
-     0x88E4,
-     "GL_STATIC_DRAW",
+        0x88E4,
+        "GL_STATIC_DRAW",
     },
     {
-     0x93C6,
-     "GL_COMPRESSED_RGBA_ASTC_5x5x5_OES",
+        0x93C6,
+        "GL_COMPRESSED_RGBA_ASTC_5x5x5_OES",
     },
     {
-     0x88E9,
-     "GL_DYNAMIC_READ",
+        0x88E9,
+        "GL_DYNAMIC_READ",
     },
     {
-     0x88E8,
-     "GL_DYNAMIC_DRAW",
+        0x88E8,
+        "GL_DYNAMIC_DRAW",
     },
     {
-     0x9291,
-     "GL_PLUS_NV",
+        0x9291,
+        "GL_PLUS_NV",
     },
     {
-     0x8CAA,
-     "GL_READ_FRAMEBUFFER_BINDING_ANGLE",
+        0x8CAA,
+        "GL_READ_FRAMEBUFFER_BINDING_ANGLE",
     },
     {
-     0x93C5,
-     "GL_COMPRESSED_RGBA_ASTC_5x5x4_OES",
+        0x93C5,
+        "GL_COMPRESSED_RGBA_ASTC_5x5x4_OES",
     },
     {
-     0x40000000,
-     "GL_MULTISAMPLE_BUFFER_BIT6_QCOM",
+        0x40000000,
+        "GL_MULTISAMPLE_BUFFER_BIT6_QCOM",
     },
     {
-     0x88EA,
-     "GL_DYNAMIC_COPY",
+        0x88EA,
+        "GL_DYNAMIC_COPY",
     },
     {
-     0x9116,
-     "GL_SYNC_FENCE_APPLE",
+        0x9116,
+        "GL_SYNC_FENCE_APPLE",
     },
     {
-     0x93C4,
-     "GL_COMPRESSED_RGBA_ASTC_5x4x4_OES",
+        0x93C4,
+        "GL_COMPRESSED_RGBA_ASTC_5x4x4_OES",
     },
     {
-     0x88EE,
-     "GL_ETC1_SRGB8_NV",
+        0x88EE,
+        "GL_ETC1_SRGB8_NV",
     },
     {
-     0x78EC,
-     "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM",
+        0x78EC,
+        "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM",
     },
     {
-     0x88EF,
-     "GL_PIXEL_UNPACK_BUFFER_BINDING",
+        0x88EF,
+        "GL_PIXEL_UNPACK_BUFFER_BINDING",
     },
     {
-     0x93C3,
-     "GL_COMPRESSED_RGBA_ASTC_4x4x4_OES",
+        0x93C3,
+        "GL_COMPRESSED_RGBA_ASTC_4x4x4_OES",
     },
     {
-     0x00000800,
-     "GL_DEPTH_BUFFER_BIT3_QCOM",
+        0x00000800,
+        "GL_DEPTH_BUFFER_BIT3_QCOM",
     },
     {
-     0x1903,
-     "GL_RED_EXT",
+        0x1903,
+        "GL_RED_EXT",
     },
     {
-     0x93C2,
-     "GL_COMPRESSED_RGBA_ASTC_4x4x3_OES",
+        0x93C2,
+        "GL_COMPRESSED_RGBA_ASTC_4x4x3_OES",
     },
     {
-     0x8CE2,
-     "GL_COLOR_ATTACHMENT2_EXT",
+        0x8CE2,
+        "GL_COLOR_ATTACHMENT2_EXT",
     },
     {
-     0x8BC1,
-     "GL_COUNTER_RANGE_AMD",
+        0x8BC1,
+        "GL_COUNTER_RANGE_AMD",
     },
     {
-     0x8CE0,
-     "GL_COLOR_ATTACHMENT0",
+        0x8CE0,
+        "GL_COLOR_ATTACHMENT0",
     },
     {
-     0x8CE1,
-     "GL_COLOR_ATTACHMENT1_EXT",
+        0x8CE1,
+        "GL_COLOR_ATTACHMENT1_EXT",
     },
     {
-     0x8CE6,
-     "GL_COLOR_ATTACHMENT6_EXT",
+        0x8CE6,
+        "GL_COLOR_ATTACHMENT6_EXT",
     },
     {
-     0x93C1,
-     "GL_COMPRESSED_RGBA_ASTC_4x3x3_OES",
+        0x93C1,
+        "GL_COMPRESSED_RGBA_ASTC_4x3x3_OES",
     },
     {
-     0x8A1F,
-     "GL_RGB_422_APPLE",
+        0x8A1F,
+        "GL_RGB_422_APPLE",
     },
     {
-     0x93DC,
-     "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR",
+        0x93DC,
+        "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR",
     },
     {
-     0x9292,
-     "GL_PLUS_DARKER_NV",
+        0x9292,
+        "GL_PLUS_DARKER_NV",
     },
     {
-     0x8CE8,
-     "GL_COLOR_ATTACHMENT8_EXT",
+        0x8CE8,
+        "GL_COLOR_ATTACHMENT8_EXT",
     },
     {
-     0x93C0,
-     "GL_COMPRESSED_RGBA_ASTC_3x3x3_OES",
+        0x93C0,
+        "GL_COMPRESSED_RGBA_ASTC_3x3x3_OES",
     },
     {
-     0x0C23,
-     "GL_COLOR_WRITEMASK",
+        0x0C23,
+        "GL_COLOR_WRITEMASK",
     },
     {
-     0x0C22,
-     "GL_COLOR_CLEAR_VALUE",
+        0x0C22,
+        "GL_COLOR_CLEAR_VALUE",
     },
     {
-     0x8A11,
-     "GL_UNIFORM_BUFFER",
+        0x8A11,
+        "GL_UNIFORM_BUFFER",
     },
     {
-     0x8823,
-     "GL_WRITEONLY_RENDERING_QCOM",
+        0x8823,
+        "GL_WRITEONLY_RENDERING_QCOM",
     },
     {
-     0x8824,
-     "GL_MAX_DRAW_BUFFERS_EXT",
+        0x8824,
+        "GL_MAX_DRAW_BUFFERS_EXT",
     },
     {
-     0x825E,
-     "GL_LAYER_PROVOKING_VERTEX_EXT",
+        0x825E,
+        "GL_LAYER_PROVOKING_VERTEX_EXT",
     },
     {
-     0x825A,
-     "GL_PROGRAM_PIPELINE_BINDING_EXT",
+        0x825A,
+        "GL_PROGRAM_PIPELINE_BINDING_EXT",
     },
     {
-     0x1909,
-     "GL_LUMINANCE",
+        0x1909,
+        "GL_LUMINANCE",
     },
     {
-     0x0D3A,
-     "GL_MAX_VIEWPORT_DIMS",
+        0x0D3A,
+        "GL_MAX_VIEWPORT_DIMS",
     },
     {
-     0x8B53,
-     "GL_INT_VEC2",
+        0x8B53,
+        "GL_INT_VEC2",
     },
     {
-     0x8826,
-     "GL_DRAW_BUFFER1_EXT",
+        0x8826,
+        "GL_DRAW_BUFFER1_EXT",
     },
     {
-     0x809E,
-     "GL_SAMPLE_ALPHA_TO_COVERAGE",
+        0x809E,
+        "GL_SAMPLE_ALPHA_TO_COVERAGE",
     },
     {
-     0x8BC0,
-     "GL_COUNTER_TYPE_AMD",
+        0x8BC0,
+        "GL_COUNTER_TYPE_AMD",
     },
     {
-     0x8BC3,
-     "GL_PERCENTAGE_AMD",
+        0x8BC3,
+        "GL_PERCENTAGE_AMD",
     },
     {
-     0x8BC2,
-     "GL_UNSIGNED_INT64_AMD",
+        0x8BC2,
+        "GL_UNSIGNED_INT64_AMD",
     },
     {
-     0x8BC5,
-     "GL_PERFMON_RESULT_SIZE_AMD",
+        0x8BC5,
+        "GL_PERFMON_RESULT_SIZE_AMD",
     },
     {
-     0x8BC4,
-     "GL_PERFMON_RESULT_AVAILABLE_AMD",
+        0x8BC4,
+        "GL_PERFMON_RESULT_AVAILABLE_AMD",
     },
     {
-     0x8BC6,
-     "GL_PERFMON_RESULT_AMD",
+        0x8BC6,
+        "GL_PERFMON_RESULT_AMD",
     },
 };
 
diff --git a/ui/gl/gl_gl_api_implementation.cc b/ui/gl/gl_gl_api_implementation.cc
index 81a1b72..5bea3f1 100644
--- a/ui/gl/gl_gl_api_implementation.cc
+++ b/ui/gl/gl_gl_api_implementation.cc
@@ -466,11 +466,15 @@
     }
   }
 
+  bool state_dirtied_externally = real_context_->GetStateWasDirtiedExternally();
+  real_context_->SetStateWasDirtiedExternally(false);
+
   DCHECK_EQ(real_context_, GLContext::GetRealCurrent());
   DCHECK(real_context_->IsCurrent(NULL));
   DCHECK(virtual_context->IsCurrent(surface));
 
-  if (switched_contexts || virtual_context != current_context_) {
+  if (state_dirtied_externally || switched_contexts ||
+      virtual_context != current_context_) {
 #if DCHECK_IS_ON()
     GLenum error = glGetErrorFn();
     // Accepting a context loss error here enables using debug mode to work on
@@ -485,7 +489,7 @@
     SetGLToRealGLApi();
     if (virtual_context->GetGLStateRestorer()->IsInitialized()) {
       virtual_context->GetGLStateRestorer()->RestoreState(
-          (current_context_ && !switched_contexts)
+          (current_context_ && !state_dirtied_externally && !switched_contexts)
               ? current_context_->GetGLStateRestorer()
               : NULL);
     }
diff --git a/ui/gl/gl_implementation_win.cc b/ui/gl/gl_implementation_win.cc
index 618250d..477f5a5 100644
--- a/ui/gl/gl_implementation_win.cc
+++ b/ui/gl/gl_implementation_win.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
-#include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/native_library.h"
 #include "base/path_service.h"
@@ -17,8 +16,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/win/windows_version.h"
-// TODO(jmadill): Apply to all platforms eventually
-#include "ui/gl/angle_platform_impl.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context_stub_with_extensions.h"
 #include "ui/gl/gl_egl_api_implementation.h"
@@ -100,10 +97,6 @@
     GetCategoryEnabledFlagFunc get_category_enabled_flag,
     AddTraceEventFunc add_trace_event_func);
 
-// TODO(jmadill): Apply to all platforms eventually
-base::LazyInstance<ANGLEPlatformImpl> g_angle_platform_impl =
-    LAZY_INSTANCE_INITIALIZER;
-
 }  // namespace
 
 void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
@@ -118,10 +111,6 @@
   // later switch to another GL implementation.
   DCHECK_EQ(kGLImplementationNone, GetGLImplementation());
 
-  // Init ANGLE platform here, before we call GetPlatformDisplay().
-  // TODO(jmadill): Apply to all platforms eventually
-  angle::Platform::initialize(&g_angle_platform_impl.Get());
-
   // Allow the main thread or another to initialize these bindings
   // after instituting restrictions on I/O. Going forward they will
   // likely be used in the browser process on most platforms. The
@@ -359,9 +348,6 @@
 }
 
 void ClearGLBindings() {
-  // TODO(jmadill): Apply to all platforms eventually
-  angle::Platform::shutdown();
-
   ClearGLBindingsEGL();
   ClearGLBindingsGL();
   ClearGLBindingsOSMESA();
diff --git a/ui/gl/gl_mock_autogen_gl.h b/ui/gl/gl_mock_autogen_gl.h
index 7bec019..d4f3c12 100644
--- a/ui/gl/gl_mock_autogen_gl.h
+++ b/ui/gl/gl_mock_autogen_gl.h
@@ -11,7 +11,6 @@
 MOCK_METHOD1(ActiveTexture, void(GLenum texture));
 MOCK_METHOD2(AttachShader, void(GLuint program, GLuint shader));
 MOCK_METHOD2(BeginQuery, void(GLenum target, GLuint id));
-MOCK_METHOD2(BeginQueryARB, void(GLenum target, GLuint id));
 MOCK_METHOD1(BeginTransformFeedback, void(GLenum primitiveMode));
 MOCK_METHOD3(BindAttribLocation,
              void(GLuint program, GLuint index, const char* name));
@@ -177,7 +176,6 @@
              void(GLsizei n, const GLuint* framebuffers));
 MOCK_METHOD1(DeleteProgram, void(GLuint program));
 MOCK_METHOD2(DeleteQueries, void(GLsizei n, const GLuint* ids));
-MOCK_METHOD2(DeleteQueriesARB, void(GLsizei n, const GLuint* ids));
 MOCK_METHOD2(DeleteRenderbuffersEXT,
              void(GLsizei n, const GLuint* renderbuffers));
 MOCK_METHOD2(DeleteSamplers, void(GLsizei n, const GLuint* samplers));
@@ -225,7 +223,6 @@
 MOCK_METHOD1(Enable, void(GLenum cap));
 MOCK_METHOD1(EnableVertexAttribArray, void(GLuint index));
 MOCK_METHOD1(EndQuery, void(GLenum target));
-MOCK_METHOD1(EndQueryARB, void(GLenum target));
 MOCK_METHOD0(EndTransformFeedback, void());
 MOCK_METHOD2(FenceSync, GLsync(GLenum condition, GLbitfield flags));
 MOCK_METHOD0(Finish, void());
@@ -272,7 +269,6 @@
 MOCK_METHOD2(GenFencesNV, void(GLsizei n, GLuint* fences));
 MOCK_METHOD2(GenFramebuffersEXT, void(GLsizei n, GLuint* framebuffers));
 MOCK_METHOD2(GenQueries, void(GLsizei n, GLuint* ids));
-MOCK_METHOD2(GenQueriesARB, void(GLsizei n, GLuint* ids));
 MOCK_METHOD2(GenRenderbuffersEXT, void(GLsizei n, GLuint* renderbuffers));
 MOCK_METHOD2(GenSamplers, void(GLsizei n, GLuint* samplers));
 MOCK_METHOD2(GenTextures, void(GLsizei n, GLuint* textures));
@@ -349,16 +345,12 @@
 MOCK_METHOD3(GetProgramResourceLocation,
              GLint(GLuint program, GLenum programInterface, const char* name));
 MOCK_METHOD3(GetQueryiv, void(GLenum target, GLenum pname, GLint* params));
-MOCK_METHOD3(GetQueryivARB, void(GLenum target, GLenum pname, GLint* params));
 MOCK_METHOD3(GetQueryObjecti64v,
              void(GLuint id, GLenum pname, GLint64* params));
 MOCK_METHOD3(GetQueryObjectiv, void(GLuint id, GLenum pname, GLint* params));
-MOCK_METHOD3(GetQueryObjectivARB, void(GLuint id, GLenum pname, GLint* params));
 MOCK_METHOD3(GetQueryObjectui64v,
              void(GLuint id, GLenum pname, GLuint64* params));
 MOCK_METHOD3(GetQueryObjectuiv, void(GLuint id, GLenum pname, GLuint* params));
-MOCK_METHOD3(GetQueryObjectuivARB,
-             void(GLuint id, GLenum pname, GLuint* params));
 MOCK_METHOD3(GetRenderbufferParameterivEXT,
              void(GLenum target, GLenum pname, GLint* params));
 MOCK_METHOD3(GetSamplerParameterfv,
@@ -442,7 +434,6 @@
 MOCK_METHOD1(IsFramebufferEXT, GLboolean(GLuint framebuffer));
 MOCK_METHOD1(IsProgram, GLboolean(GLuint program));
 MOCK_METHOD1(IsQuery, GLboolean(GLuint query));
-MOCK_METHOD1(IsQueryARB, GLboolean(GLuint query));
 MOCK_METHOD1(IsRenderbufferEXT, GLboolean(GLuint renderbuffer));
 MOCK_METHOD1(IsSampler, GLboolean(GLuint sampler));
 MOCK_METHOD1(IsShader, GLboolean(GLuint shader));
diff --git a/ui/gl/gpu_timing.cc b/ui/gl/gpu_timing.cc
index a744164..a84d3f7 100644
--- a/ui/gl/gpu_timing.cc
+++ b/ui/gl/gpu_timing.cc
@@ -44,7 +44,7 @@
 }
 
 GPUTimer::~GPUTimer() {
-  glDeleteQueriesARB(2, queries_);
+  glDeleteQueries(2, queries_);
 }
 
 void GPUTimer::Start() {
@@ -84,8 +84,8 @@
     return false;
   }
   GLint done = 0;
-  glGetQueryObjectivARB(queries_[1] ? queries_[1] : queries_[0],
-                        GL_QUERY_RESULT_AVAILABLE, &done);
+  glGetQueryObjectiv(queries_[1] ? queries_[1] : queries_[0],
+                     GL_QUERY_RESULT_AVAILABLE, &done);
   return done != 0;
 }
 
@@ -145,7 +145,7 @@
     default:
       NOTREACHED();
   }
-  glGenQueriesARB(queries, queries_);
+  glGenQueries(queries, queries_);
 }
 
 GPUTimingClient::GPUTimingClient(GPUTiming* gpu_timing)